【问题标题】:ESC/POS Bitmap Data to ImageESC/POS 位图数据到图像
【发布时间】:2018-05-10 07:01:50
【问题描述】:

我们可以将图像转换为字节数组以发送到 ESC/POS 打印机。
我在这里使用代码:https://stackoverflow.com/a/14099717/1853275
它就像魅力一样。

简单问题:是否可以将此字节数组转换回原始图像?
如果是,请告诉我如何...

大图:
我创建了一个充当 POS 打印机的 TCP/IP 侦听器。
它从 POS 应用程序接收数据,然后转发到真正的打印机。
在这两者之间,我必须在收据上获取产品并根据产品打印一些额外的东西。
所以,我需要将图形数据转换为图像(然后是 OCR)来读取收据上的产品。

这是一张捕获的 ESC/POS 收据:
pastebin.com/vUDHjGuj
(我们可以将其转换为字节数组,然后发送到打印机。它会打印收据。)

我知道捕获数据的结构。我们可以删除 ESC/POS 命令并将数组拆分为 0x0A LF。我只需要一种将图形字节数组转换为图像并将切片放在一起以创建收据图像的方法。
发送到打印机的图形模式为:24位双倍密度(0x1B 0x2A 0x21)

请帮忙...
非常感谢

以下是我尝试过的其中一件,但它全黑。
我发送一个切片(字节 []),宽度 = 512(来自捕获的数据),高度:1(或任何)

public static Bitmap FromByteArray(byte[] ByteArray, Size Size)

{

Bitmap bmp = new Bitmap(Size.Width, Size.Height, PixelFormat.Format24bppRgb);

BitmapData bmpdata = bmp.LockBits(new Rectangle(0, 0, Size.Width, Size.Height),ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

IntPtr ptr = bmpdata.Scan0;

System.Runtime.InteropServices.Marshal.Copy(ByteArray, 0, ptr, ByteArray.Length);

bmp.UnlockBits(bmpdata);

return bmp;

}

【问题讨论】:

  • 尝试将位图的反面写成 ESC 转换程序,这无疑不仅仅是单行副本,否则所有其他代码都没用......你不这么认为吗?
  • @AdrianoRepetti 我知道我需要反过来。但我需要帮助/提示。或者如果有人这样做了。如果我已经知道该怎么做,我不知道为什么要发布问题
  • 但不幸的是,这不是 Stack Overflow 中的主题。您或多或少在问“怎么做”或“您是否已经拥有该代码?”。另见How to Ask

标签: c# .net escpos


【解决方案1】:

您正在使用打印机的页面描述语言,因此首先请注意这不是入门级任务。

在您的代码中,没有特定的“修复”。它似乎是基于一些不基于这种数据格式现实的假设。

  • 您的示例文件是图像?不,文件中还有其他命令(剪切、换行),您需要能够解析和忽略这些命令才能获取图像数据。
  • 您的示例文件是一张图片?不,您的示例文件中有 20 个薄片状的小图像。
  • 您的图像是每像素 24 位?不,每个像素有一位,排列在 24 像素高的列中。每个图像都有一个任意宽度,您可以从数据中读取。
  • 栅格数据按行排列?不,这是主要的专栏。

因此,如果您想要使用 C# 代码,如评论中所述,您需要正确反转您链接的 C# 示例中的过程。您可以通过一个好的调试器、Epson documentation 的副本 ESC * 以及一些要转换的小示例文件来告知这项工作。

示例

完全可以解析ESC/POS来恢复原图。我维护了一个这样做的开源项目,它将处理您的示例文件(github,related blog post)。解析ESC *is located in SelectBitImageMode.php的代码。它不是 C#,但它可以工作。

我必须将您的示例文件转换回二进制文件才能使用它:

cat esc_pos_graphics_printing_data.txt | tr -d '\r' | tr -d '\n' | \
    python3 -c "import sys, binascii; sys.stdout.buffer.write(binascii.unhexlify(input().strip()))" > \
    esc_pos_graphics_printing_data.bin

然后为了从收据中提取图像并加入它们,我使用了escpos-tools(git、composer、php)加上ImageMagick:

git clone https://github.com/receipt-print-hq/escpos-tools.git
cd escpos-tools
composer install
php escimages.php --file ../esc_pos_graphics_printing_data.bin 
convert esc_pos_graphics_printing_data-*.png -append output.png

收据是:

祝你好运!

【讨论】:

  • 非常感谢您花时间在这方面。我希望那天我能轻松找到这几点。但我什么也找不到。然后,我花了几个小时在通过拍摄图像生成 ESC/POS 命令的代码上,并自己弄清楚了一切,这是艰难的方式。我能够在 C# 中重现相同的内容。
猜你喜欢
  • 2019-03-03
  • 2020-02-11
  • 2018-12-18
  • 2018-08-29
  • 2013-11-23
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 2018-09-23
相关资源
最近更新 更多