将图像打印到 Zebra iMZ320
Printing Image to Zebra iMZ320
平台:Windows Mobile 6.5 手持设备
语言:C#
我的问题:系统要求我获取用户的签名,然后将该签名发送到打印机以打印在收据上。我已经成功地捕获了签名的图像并在内存中保存了签名的字节数组,但似乎无法正确打印它。
为了让我开始,我按照 blog here 获取位图的十六进制表示。然而,这只是用十六进制打印出一张很长的收据
签名的表示。在此处编写代码,而不是遵循 link:
private static string DrawBitmap(Bitmap bmp, int xPosition, int yPosition)
{
if (bmp == null)
throw new ArgumentNullException("bmp");
StringBuilder DataString = new StringBuilder();
//Make sure the width is divisible by 8
int loopWidth = 8 - (bmp.Width % 8);
if (loopWidth == 8)
loopWidth = bmp.Width;
else
loopWidth += bmp.Width;
//DataString.Append(string.Format("EG {0} {1} {2} {3} ", xPosition, yPosition));
DataString.Append(string.Format("EG 64 128 {0} {1} ", xPosition, yPosition));
for (int y = 0; y < bmp.Height; y++)
{
int bit = 128;
int currentValue = 0;
for (int x = 0; x < loopWidth; x++)
{
int intensity;
if (x < bmp.Width)
{
Color color = bmp.GetPixel(x, y);
intensity = 255 - ((color.R + color.G + color.B) / 3);
}
else
intensity = 0;
if (intensity >= 128)
currentValue |= bit;
bit = bit >> 1;
if (bit == 0)
{
DataString.Append(currentValue.ToString("X2"));
bit = 128;
currentValue = 0;
}
}//x
}//y
DataString.Append("\r\n");
return DataString.ToString();
}
失败后,我找到了 Zebra 打印机的 CPCL programming guide 并按照第 95 页的示例打印小瓷砖图像。但是,这与签名的作用相同。一旦失败,我发现我需要 运行 命令: ! U1 setvar "device.languages" "zpl"
在执行任何 EG 命令之前;所以我继续这样做,但事情在这里发生了糟糕的转折,最终迫使我完全重置打印机 and/or cleanboot 手持设备,因为它会导致 COM 异常导致 COM6 和打印机崩溃。
我已经用尽了大部分(如果不是全部)我能想到的资源,并且 none 其中的一些已经奏效了。
有没有人有任何其他想法或例子可以帮助我完成这项工作?
谢谢
我找到了另一个 CPCL 程序员指南,它有这个简单的(测试)示例:
! 0 200 200 210 1
EG 2 16 90 45 F0F0F0F0F0F0F0F00F0F0F0F0F0F0F0F
F0F0F0F0F0F0F0F00F0F0F0F0F0F0F0F
FORM
PRINT
这应该打印一个小的棋盘图案。
下一个示例打印 PCX 图形:
PCX Commands
The PCX command gives a user the ability to send “.PCX” graphics formatted images to the printer. The
.PCX image MUST be encoded as a black and white image.
Format:
{command} {x} {y}
{data}
where:
{command}: PCX
{x}: X-coordinate of the top-left corner.
{y}: Y-coordinate of the top-left corner.
{data}: PCX image data.
示例:
! 0 200 200 500 1
PCX 0 30
<binary black and white pcx data stream>
FORM
PRINT
使用文件的示例(以前加载打印机文件系统)
! 0 200 200 500 1
PCX 0 30 !<IMAGE.PCX
FORM
PRINT
如果打印机已经切换到行式打印机模式,命令
! U1 PCX {x coordinate} {y coordinate} !< {filename.pcx}
例如
! U1 PCX 0 30 !< IMAGE.PCX
可用于从文件系统打印单色 PCX。
请记住,.NET 是 UTF-8,因此所有命令和数据在通过 COM 端口发送之前都必须转换为 ASCII。所以做这样的事情:
Encoding ansi = Encoding.GetEncoding(1252);
byte[] buf = ansi.GetBytes(DataString);
System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort("COM1:");
sp.Write(buf, 0, buf.Length);
对于 PCX 数据,只需使用 byte[] 缓冲区的字节流。
平台:Windows Mobile 6.5 手持设备
语言:C#
我的问题:系统要求我获取用户的签名,然后将该签名发送到打印机以打印在收据上。我已经成功地捕获了签名的图像并在内存中保存了签名的字节数组,但似乎无法正确打印它。
为了让我开始,我按照 blog here 获取位图的十六进制表示。然而,这只是用十六进制打印出一张很长的收据 签名的表示。在此处编写代码,而不是遵循 link:
private static string DrawBitmap(Bitmap bmp, int xPosition, int yPosition)
{
if (bmp == null)
throw new ArgumentNullException("bmp");
StringBuilder DataString = new StringBuilder();
//Make sure the width is divisible by 8
int loopWidth = 8 - (bmp.Width % 8);
if (loopWidth == 8)
loopWidth = bmp.Width;
else
loopWidth += bmp.Width;
//DataString.Append(string.Format("EG {0} {1} {2} {3} ", xPosition, yPosition));
DataString.Append(string.Format("EG 64 128 {0} {1} ", xPosition, yPosition));
for (int y = 0; y < bmp.Height; y++)
{
int bit = 128;
int currentValue = 0;
for (int x = 0; x < loopWidth; x++)
{
int intensity;
if (x < bmp.Width)
{
Color color = bmp.GetPixel(x, y);
intensity = 255 - ((color.R + color.G + color.B) / 3);
}
else
intensity = 0;
if (intensity >= 128)
currentValue |= bit;
bit = bit >> 1;
if (bit == 0)
{
DataString.Append(currentValue.ToString("X2"));
bit = 128;
currentValue = 0;
}
}//x
}//y
DataString.Append("\r\n");
return DataString.ToString();
}
失败后,我找到了 Zebra 打印机的 CPCL programming guide 并按照第 95 页的示例打印小瓷砖图像。但是,这与签名的作用相同。一旦失败,我发现我需要 运行 命令: ! U1 setvar "device.languages" "zpl"
在执行任何 EG 命令之前;所以我继续这样做,但事情在这里发生了糟糕的转折,最终迫使我完全重置打印机 and/or cleanboot 手持设备,因为它会导致 COM 异常导致 COM6 和打印机崩溃。
我已经用尽了大部分(如果不是全部)我能想到的资源,并且 none 其中的一些已经奏效了。
有没有人有任何其他想法或例子可以帮助我完成这项工作?
谢谢
我找到了另一个 CPCL 程序员指南,它有这个简单的(测试)示例:
! 0 200 200 210 1
EG 2 16 90 45 F0F0F0F0F0F0F0F00F0F0F0F0F0F0F0F
F0F0F0F0F0F0F0F00F0F0F0F0F0F0F0F
FORM
PRINT
这应该打印一个小的棋盘图案。
下一个示例打印 PCX 图形:
PCX Commands
The PCX command gives a user the ability to send “.PCX” graphics formatted images to the printer. The
.PCX image MUST be encoded as a black and white image.
Format:
{command} {x} {y}
{data}
where:
{command}: PCX
{x}: X-coordinate of the top-left corner.
{y}: Y-coordinate of the top-left corner.
{data}: PCX image data.
示例:
! 0 200 200 500 1
PCX 0 30
<binary black and white pcx data stream>
FORM
PRINT
使用文件的示例(以前加载打印机文件系统)
! 0 200 200 500 1
PCX 0 30 !<IMAGE.PCX
FORM
PRINT
如果打印机已经切换到行式打印机模式,命令
! U1 PCX {x coordinate} {y coordinate} !< {filename.pcx}
例如
! U1 PCX 0 30 !< IMAGE.PCX
可用于从文件系统打印单色 PCX。
请记住,.NET 是 UTF-8,因此所有命令和数据在通过 COM 端口发送之前都必须转换为 ASCII。所以做这样的事情:
Encoding ansi = Encoding.GetEncoding(1252);
byte[] buf = ansi.GetBytes(DataString);
System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort("COM1:");
sp.Write(buf, 0, buf.Length);
对于 PCX 数据,只需使用 byte[] 缓冲区的字节流。