From b75e892d2ad49c7ec9c7bf2837a67830bfb2f421 Mon Sep 17 00:00:00 2001 From: techinc Date: Sun, 15 Oct 2023 00:28:30 +0200 Subject: [PATCH] first commit --- dim.go | 96 ++++++++++++++++++++++++++ kia.png | Bin 0 -> 4722 bytes stickerimg.go | 181 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 277 insertions(+) create mode 100644 dim.go create mode 100644 kia.png create mode 100644 stickerimg.go diff --git a/dim.go b/dim.go new file mode 100644 index 0000000..ac7c4e1 --- /dev/null +++ b/dim.go @@ -0,0 +1,96 @@ +package main + +import ( + _ "image/jpeg" + _ "image/png" //I'm needed + "math" + "os" + "github.com/kenshaw/escpos" +) + +const ESC = byte(27) + +func pageWidth(widht int) []byte { + return []byte{escpos.GS, 87, byte(widht), 0} +} +func pageMargin(margin int) []byte { + return []byte{escpos.GS, 76, byte(margin), 0} +} +func pageMode() []byte { + return []byte{ESC, 'L'} +} +func pageDirection(direction uint8) []byte { + // https://www.epson-biz.com/modules/ref_escpos/index.php?content_id=55 + return []byte{ESC, 'T', direction} +} +func pagePrintArea(x, y, width, height int) []byte { + return []byte{ESC, 'W', + byte(x & 255), byte(x >> 8 & 255), + byte(y & 255), byte(y >> 8 & 255), + byte(width & 255), byte(width >> 8 & 255), + byte(height & 255), byte(height >> 8 & 255)} +} +func offsetY(offset int) []byte { + // A positive number specifies movement downward, and a negative number specifies movement upward. + // The horizontal or vertical motion unit is used for the print direction set by ESC T. + // When the starting position is set to the upper left or lower right of the print area using ESC T, the vertical motion unit is used. + // When the starting position is set to the upper right or lower left of the print area using ESC T, the horizontal motion unit is used. + return []byte{escpos.GS, '\\', byte(offset & 255), byte(offset >> 8 & 255)} +} +func offsetX(offset int) []byte { + // A positive number specifies movement to the right, and a negative number specifies movement to the left. + // When Standard mode is selected, the horizontal motion unit is used. + // when Page mode is selected, the horizontal or vertical motion unit is used for the print direction set by ESC T. + // When the starting position is set to the upper left or lower right of the print area using ESC T, the horizontal motion unit is used. + // When the starting position is set to the upper right or lower left of the print area using ESC T, the vertical motion unit is used. + return []byte{ESC, '\\', byte(offset & 255), byte(offset >> 8 & 255)} +} +func invert(n int) []byte { + //When the LSB of n is 0, white/black reverse print mode is turned off. + //n = 0 – 255 + return []byte{escpos.GS, byte('B'), byte(n)} +} +func disableSensors() []byte { + return []byte{ESC, 'c', '3', 0} +} +func printSpeed(m int) []byte { + // m = 0 – 9, 48 – 57 : slowest - fastest + // [Default] 0 = Setting value of GS ( E customize value (a = 6) + // m = 0 + //Slower print speed seems to retain a bit more quality in dithered images. pure B/W images do not have a noticable difference + return []byte{escpos.GS, '(', 'K', 2, 0, 50, byte(m & 255), byte(m >> 8 & 255)} +} + +func main() { + f, err := os.OpenFile("/dev/usb/lp0", os.O_WRONLY|os.O_CREATE, 0) + if err != nil { + panic(err) + } + defer f.Close() + + ep := escpos.New(f) + + ep.Init() + ep.WriteRaw(pageMode()) + ep.WriteRaw(pageDirection(1)) + ep.WriteRaw(pagePrintArea(0, 0, int(math.Round((29.0/80.0)*512)), 850)) + ep.WriteRaw(offsetY(30)) + ep.SetFontSize(1,1) + ep.Write("Technologia Incognita\n") + ep.WriteRaw(offsetY(35)) + ep.SetFontSize(3,2) + ep.SetEmphasize(1) + ep.Write("Do Not Hack\n") + ep.SetEmphasize(0) + ep.WriteRaw(offsetY(15)) + ep.SetFontSize(1,1) + ep.Write("Mattronix - 2023-10-14 \n") + + ep.WriteRaw([]byte{12}) // FF: in Page mode, prints all the data in the print buffer collectively and switches from Page mode to Standard mode. + //ep.Formfeed() + + ep.Cut() + ep.End() + +} + diff --git a/kia.png b/kia.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf3643df263ded2bd142a2a342d2979a8ca547d GIT binary patch literal 4722 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 8 & 255), + byte(y & 255), byte(y >> 8 & 255), + byte(width & 255), byte(width >> 8 & 255), + byte(height & 255), byte(height >> 8 & 255)} +} +func offsetY(offset int) []byte { + // A positive number specifies movement downward, and a negative number specifies movement upward. + // The horizontal or vertical motion unit is used for the print direction set by ESC T. + // When the starting position is set to the upper left or lower right of the print area using ESC T, the vertical motion unit is used. + // When the starting position is set to the upper right or lower left of the print area using ESC T, the horizontal motion unit is used. + return []byte{escpos.GS, '\\', byte(offset & 255), byte(offset >> 8 & 255)} +} +func offsetX(offset int) []byte { + // A positive number specifies movement to the right, and a negative number specifies movement to the left. + // When Standard mode is selected, the horizontal motion unit is used. + // when Page mode is selected, the horizontal or vertical motion unit is used for the print direction set by ESC T. + // When the starting position is set to the upper left or lower right of the print area using ESC T, the horizontal motion unit is used. + // When the starting position is set to the upper right or lower left of the print area using ESC T, the vertical motion unit is used. + return []byte{ESC, '\\', byte(offset & 255), byte(offset >> 8 & 255)} +} +func invert(n int) []byte { + //When the LSB of n is 0, white/black reverse print mode is turned off. + //n = 0 – 255 + return []byte{escpos.GS, byte('B'), byte(n)} +} +func disableSensors() []byte { + return []byte{ESC, 'c', '3', 0} +} +func printSpeed(m int) []byte { + // m = 0 – 9, 48 – 57 : slowest - fastest + // m = 0 - 13 : slowest - fastest version V + // [Default] 0 = Setting value of GS ( E customize value (a = 6) + // m = 0 + //Slower print speed seems to retain a bit more quality in dithered images. pure B/W images do not have a noticable difference + return []byte{escpos.GS, '(', 'K', 2, 0, 50, byte(m & 255), byte(m >> 8 & 255)} +} + +func main() { + f, err := os.OpenFile("/dev/usb/lp0", os.O_WRONLY|os.O_CREATE, 0) + if err != nil { + panic(err) + } + defer f.Close() + + //load image + imagef, err := os.Open("kia.png") + if err != nil { + panic(err) + } + defer imagef.Close() + img, _, err := image.Decode(imagef) + + ep := escpos.New(f) + + ep.Init() + ep.WriteRaw(pageWidth(int(math.Round((29.0 / 80.0) * 512)))) + ep.WriteRaw(pageMargin(1)) + ep.WriteRaw(printSpeed(13)) + // ditherer := ditherers[1] + // log.Println("Using ditherer type: " + ditherer.Type) + + // dg := ditherer.Monochrome(img, 1.18) + rasterConv := &raster.Converter{ + MaxWidth: 186, // == math.Round((29.0 / 80.0) * 512)) == 29mm sticker roll + Threshold: 0.1, //pre-dithered images are black or white anyway, so this can be extremely low as there won't be any in-between colors (default: 0.5) + } + for i := 0; i < 2; i++ { + rasterConv.Print(img, ep) + ep.Cut() + } + + //ep.WriteRaw([]byte{12}) // FF: in Page mode, prints all the data in the print buffer collectively and switches from Page mode to Standard mode. + //ep.Formfeed() + + ep.End() + +} +