【发布时间】:2020-11-15 17:19:49
【问题描述】:
我编写了一个简单的程序将单色位图数据转换为字节数组,然后将其反转 (0->1, 1->0) 以便将其作为 ZPL 发送到标签打印机。
Bitmap bmp = (Bitmap)pictureBox1.Image;
Rectangle rectangle = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bd = bmp.LockBits(rectangle, ImageLockMode.ReadOnly, bmp.PixelFormat);
IntPtr ptr = bd.Scan0;
byte[] b = new byte[Math.Abs(bd.Stride) * bmp.Height];
Marshal.Copy(ptr, b, 0, b.Length);
bmp.UnlockBits(bd);
StringBuilder sb = new StringBuilder();
foreach (byte i in b)
{
sb.Append((255 - i).ToString("X2"));
}
textBox1.Text = string.Format(@"^XA^FO100,0^GFA,{0},{0},{1},{2}^FS^XZ", b.Length, Math.Abs(bd.Stride), sb.ToString());
但它画了一个原本不存在的不必要的黑条!
我最初认为这可能是因为我分配给 BitmapData 的矩形太大所以包含了一些“未使用”的区域,但显然我错了,07FFFFs 仍然存在!
我什至试图用空字符串替换它来破解它!
但这是错误的,因为它弄乱了 ZPL 输出!
当然,我可以只存储替换的字符串并重新计算^GFA 命令的长度,但是如果图片“恰好”本身有一些07FFFFs 怎么办!?我这样做基本上把图片本身搞砸了!
07FFFF 被我的代码“反转”了,所以它在原始字节数组中是F80000,所以我认为它可能类似于位图数据中的“\n”来告诉图片“从新线继续画”!
我在网上找不到任何解释为什么位图文件中有F80000s。
对画面都好,但我怎么能“摆脱它”!?
我“只”想要“图片本身”的数据。
有人能帮帮我吗!?
非常感谢!
【问题讨论】:
-
PixelFormat 属性有什么值?图片的宽度是4*8的倍数吗?因为步幅向上舍入到 4 字节边界。见docs
-
@GWimpassinger 我认为这正是问题所在!我检查了图片大小,它的宽度是 173,
Stride是 24,所以 24*8-173 = 19,如果我在 0 后面加上 19 个 1,它是“完全”7FFFF!所以我想我只需要将图片的宽度设为 32 的倍数!谢谢你的帮助!如果可以,请将其发布为答案,以便我将其标记为最佳答案!非常感谢! -
可能还有其他解决方案。但是你的位图宽度必须是 8 的倍数。试试
...^GFA,{0},{1},{2},{3}...", b.Length, bmp.Width / 8 * bmp.Height, bmp.Width / 8, sb.ToString()。我不确定{1}的论点。见ZPL docs -
您不必调整图片大小,而是逐行读取并跳过每行的步幅字节,然后将内容写入您的构建器。
标签: c# zpl bitmapdata