【发布时间】:2016-05-18 20:12:32
【问题描述】:
平台:Windows Mobile 6.5 Handheld
语言:C#
我的问题:我被要求从用户那里获取签名,然后将该签名发送到打印机以打印在收据上。我已经成功捕获了签名的图像并将签名的字节数组保存在内存中,但似乎无法正确打印它。
为了让我开始,我按照blog here 获取位图的十六进制表示。但是,这只是打印了一张很长的带有十六进制的收据 签名的表示。代码在这里而不是跟随链接:
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 页的示例打印了小瓷砖图像。但是,这与签名的作用相同。一旦失败,我发现我需要在执行任何 EG 命令之前运行命令:! U1 setvar "device.languages" "zpl";所以我继续这样做,但这里的情况出现了糟糕的转折,最终迫使我完全重置打印机和/或干净启动手持设备,因为它导致 COM 异常导致 COM6 和打印机崩溃。
我已经用尽了我能想到的大部分资源,但没有一个有效。
有没有人有任何其他想法或示例可以帮助我完成这项工作?
谢谢
【问题讨论】:
-
这项工作有效吗:mrpmorris.blogspot.fr/2007/08/printing-bitmaps-using-cpcl.html。大多数情况下,当打印机打印代码而不是文本或图像时,这是由于被设置为备用打印机语言。而且,通常传输是一个问题,大多数打印机只理解 ASCII-7。因此,DataString 在发送到打印机之前可能会被转换为 7Bit 字节数组。
标签: c# bitmap zebra-printers windows-mobile-6.5