-1

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

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

更大的图景:
我创建了一个 TCP/IP 侦听器,它充当 POS 打印机。
它从 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;

}
4

1 回答 1

3

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

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

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

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

例子

完全可以解析ESC/POS来恢复原始图像。我维护了一个这样做的开源项目,它将处理您的示例文件(github相关博客文章)。解析代码ESC * 位于 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

收据是:

在此处输入图像描述

祝你好运!

于 2018-05-19T13:12:25.387 回答