如何使用 ESC/POS 命令打印图像?
how to print images with ESC/POS commands?
我有一台 Epson-TMH6000III 热敏打印机,我想使用 ESC/POS 命令用它打印一些位图。
但在此之前我想用 ESC/POS 打印图像命令打印一个非常简单的单行。
这是我的尝试:
namespace printingImageMode
{
class Program
{
static void Main(string[] args)
{
Bitmap bmp = new Bitmap(@"C:\Users\falamarzi\Desktop\Kyan Graphic Viewer\jTest.jpg");
int msb = (int)(bmp.Width & 0x0000ff00) >> 8;
int lsb = (int)(bmp.Width & 0x000000ff);
byte msbB = Convert.ToByte(msb);
byte lsbB = Convert.ToByte(lsb);
byte[] enter_To_Image_Printing_Mode_Command = new byte[] { (byte)AsciiControlChars.ESC, (byte)DensityCommand.EightDot_SD, msbB, lsbB };
byte[] imageData = new byte[lsb + msb * 256];
for (int i = 0; i < imageData.Length; i++)
{
imageData[i] = 0xff;
}
byte[] complete_Command = new byte[enter_To_Image_Printing_Mode_Command.Length + imageData.Length];
enter_To_Image_Printing_Mode_Command.CopyTo(complete_Command, 0);
imageData.CopyTo(complete_Command, enter_To_Image_Printing_Mode_Command.Length);
SerialPort sPort = new SerialPort("COM5");
sPort.Open();
sPort.Write(complete_Command, 0, complete_Command.Length);
}
}
public enum AsciiControlChars : byte
{
ESC = 0x1b,
}
public enum DensityCommand : byte
{
EightDot_SD = 0x00,
EightDot_DD = 0x01,
TwentyFourDot_SD = 0x20,
TwentyFourDot_DD = 0x21,
}
}
我没有得到结果。感谢您提供的任何帮助。
一个问题似乎是 header 被放置在数据之前。如果我没看错,你发送的是:
ESC <density byte> <size data> <data ..>
因为 ESC 本身不是图像打印命令,您需要调整您的实现以匹配 ESC/POS 图像打印命令。我将根据您的实施 near-completeness 假设您可以访问已经描述这些命令的文档:
GS v 0
GS ( L
ESC *
要检查您的实施情况,您可以从项目 escpos-php or python-escpos 移植一些单元测试,这两个项目都支持图像打印。
例如,通过 GS v 0
打印单个黑色像素的语法是 (source):
\x1d v 0 \x00 \x01 \x00 \x01 \x00 \x80
(non-printable ASCII characters shown here as hex codes)
这些字节的含义是:
GS v 0 <density byte> <4 bytes image size data> <1 byte data>
对于最初的问题可能为时已晚,但为了将来参考,因为在找到如何使用 POS 将位图发送到打印机之前,我一直在自我搜索很多。
在几个选项中,似乎最简单的是使用“ESC*0”命令后跟字节数(2字节,高位和低位),实际数据,然后是 "\n".
如果您搜索 "ESC * Select bit image",该命令的所有详细信息/规格都在手册中,但要知道此选项存在并且相对简单快速确实是一个棘手的问题...
您还可以在 Haskell 中找到具体的代码示例,并在 this post 中找到更多详细信息。
我有一台 Epson-TMH6000III 热敏打印机,我想使用 ESC/POS 命令用它打印一些位图。
但在此之前我想用 ESC/POS 打印图像命令打印一个非常简单的单行。
这是我的尝试:
namespace printingImageMode
{
class Program
{
static void Main(string[] args)
{
Bitmap bmp = new Bitmap(@"C:\Users\falamarzi\Desktop\Kyan Graphic Viewer\jTest.jpg");
int msb = (int)(bmp.Width & 0x0000ff00) >> 8;
int lsb = (int)(bmp.Width & 0x000000ff);
byte msbB = Convert.ToByte(msb);
byte lsbB = Convert.ToByte(lsb);
byte[] enter_To_Image_Printing_Mode_Command = new byte[] { (byte)AsciiControlChars.ESC, (byte)DensityCommand.EightDot_SD, msbB, lsbB };
byte[] imageData = new byte[lsb + msb * 256];
for (int i = 0; i < imageData.Length; i++)
{
imageData[i] = 0xff;
}
byte[] complete_Command = new byte[enter_To_Image_Printing_Mode_Command.Length + imageData.Length];
enter_To_Image_Printing_Mode_Command.CopyTo(complete_Command, 0);
imageData.CopyTo(complete_Command, enter_To_Image_Printing_Mode_Command.Length);
SerialPort sPort = new SerialPort("COM5");
sPort.Open();
sPort.Write(complete_Command, 0, complete_Command.Length);
}
}
public enum AsciiControlChars : byte
{
ESC = 0x1b,
}
public enum DensityCommand : byte
{
EightDot_SD = 0x00,
EightDot_DD = 0x01,
TwentyFourDot_SD = 0x20,
TwentyFourDot_DD = 0x21,
}
}
我没有得到结果。感谢您提供的任何帮助。
一个问题似乎是 header 被放置在数据之前。如果我没看错,你发送的是:
ESC <density byte> <size data> <data ..>
因为 ESC 本身不是图像打印命令,您需要调整您的实现以匹配 ESC/POS 图像打印命令。我将根据您的实施 near-completeness 假设您可以访问已经描述这些命令的文档:
GS v 0
GS ( L
ESC *
要检查您的实施情况,您可以从项目 escpos-php or python-escpos 移植一些单元测试,这两个项目都支持图像打印。
例如,通过 GS v 0
打印单个黑色像素的语法是 (source):
\x1d v 0 \x00 \x01 \x00 \x01 \x00 \x80
(non-printable ASCII characters shown here as hex codes)
这些字节的含义是:
GS v 0 <density byte> <4 bytes image size data> <1 byte data>
对于最初的问题可能为时已晚,但为了将来参考,因为在找到如何使用 POS 将位图发送到打印机之前,我一直在自我搜索很多。
在几个选项中,似乎最简单的是使用“ESC*0”命令后跟字节数(2字节,高位和低位),实际数据,然后是 "\n".
如果您搜索 "ESC * Select bit image",该命令的所有详细信息/规格都在手册中,但要知道此选项存在并且相对简单快速确实是一个棘手的问题...
您还可以在 Haskell 中找到具体的代码示例,并在 this post 中找到更多详细信息。