ZPL:二进制 B64 和压缩 Z64 编码
ZPL: Binary B64 and compressed Z64 encoding
也许有人可以帮我解决我的 Zebra ZPL 问题。 ZPL 手册并没有真正帮助我。
我想将二进制(使用 ZPL B64)和压缩二进制(使用 ZPL Z64)图像数据传输到打印机。
我找到了以下信息:
- 使用 B64,数据以 Base64 格式编码。
- 对于 Z64,数据首先用 LZ77 压缩,然后用 Base64 编码。
- 两种编码都附加了 CRC 数字。 (可能必须是 CRC-16)但我没有计算出有效的 CRC 校验位!
你们有人做过吗?
- LZ77算法使用了哪些参数?
- 使用哪个 CRC 以及哪个起始多项式?
- 也许有人甚至有解决这个问题的 C# 代码?
非常感谢。
The ZPL manual doesn't really help me.
告诉我吧!
- 手册中提到的"LZ77"算法其实就是ZLIB格式。为此我使用了 http://zlib.net。
手册中提到的"CRC"其实就是CRC16-CCITT。我使用的代码:http://sanity-free.com/133/crc_16_ccitt_in_csharp.html.
为了正确计算它:
- 使用ZLIB压缩图片位(图片必须是
PixelFormat.Format1bppIndexed
,图片位最好用Bitmap.LockBits
访问)。
- 将压缩数据编码成Base64。 不允许有空格或换行符。
- 将Base64字符串按照ASCII编码(
System.Text.Encoding.ASCII.GetBytes(base64string)
)转换为字节数组。
- 计算该字节数组的 CRC。 初始 CRC 值必须为零。
这两页在 Java 中包含有趣的代码,用于编写将图像文件编码为 Z64 的转换器:
http://www.jcgonzalez.com/img-to-zpl-online
https://gist.github.com/trevarj/1255e5cbc08fb3f79c3f255e25989a18
我写了第一个link的Javaclass的Python端口,形式为Python3class:
https://github.com/ftheeten/python_zebra_adapter/blob/main/class_zebra.py
之后您可以使用 Python Pillow 库来生成要转换的图像。这种方法非常灵活,因为您可以使用任何具有 TTF 文件的字体。
例如
import socket
from PIL import ImageFont, ImageDraw, Image
import numpy as np
...
img=FUNCTION_GENERATING_A_PILLOW
zpl=Class_zpl()
zpl.set_compress(False)
zpl.set_blacklight_percentage(60)
str_label=zpl.process(img)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((PRINTER_IP, PORT_PRINTER))
s.sendall(str.encode(str_label))
#data = s.recv(1024)
s.close()
也许有人可以帮我解决我的 Zebra ZPL 问题。 ZPL 手册并没有真正帮助我。 我想将二进制(使用 ZPL B64)和压缩二进制(使用 ZPL Z64)图像数据传输到打印机。
我找到了以下信息:
- 使用 B64,数据以 Base64 格式编码。
- 对于 Z64,数据首先用 LZ77 压缩,然后用 Base64 编码。
- 两种编码都附加了 CRC 数字。 (可能必须是 CRC-16)但我没有计算出有效的 CRC 校验位!
你们有人做过吗?
- LZ77算法使用了哪些参数?
- 使用哪个 CRC 以及哪个起始多项式?
- 也许有人甚至有解决这个问题的 C# 代码?
非常感谢。
The ZPL manual doesn't really help me.
告诉我吧!
- 手册中提到的"LZ77"算法其实就是ZLIB格式。为此我使用了 http://zlib.net。
手册中提到的"CRC"其实就是CRC16-CCITT。我使用的代码:http://sanity-free.com/133/crc_16_ccitt_in_csharp.html.
为了正确计算它:
- 使用ZLIB压缩图片位(图片必须是
PixelFormat.Format1bppIndexed
,图片位最好用Bitmap.LockBits
访问)。 - 将压缩数据编码成Base64。 不允许有空格或换行符。
- 将Base64字符串按照ASCII编码(
System.Text.Encoding.ASCII.GetBytes(base64string)
)转换为字节数组。 - 计算该字节数组的 CRC。 初始 CRC 值必须为零。
- 使用ZLIB压缩图片位(图片必须是
这两页在 Java 中包含有趣的代码,用于编写将图像文件编码为 Z64 的转换器:
http://www.jcgonzalez.com/img-to-zpl-online
https://gist.github.com/trevarj/1255e5cbc08fb3f79c3f255e25989a18
我写了第一个link的Javaclass的Python端口,形式为Python3class: https://github.com/ftheeten/python_zebra_adapter/blob/main/class_zebra.py
之后您可以使用 Python Pillow 库来生成要转换的图像。这种方法非常灵活,因为您可以使用任何具有 TTF 文件的字体。
例如
import socket
from PIL import ImageFont, ImageDraw, Image
import numpy as np
...
img=FUNCTION_GENERATING_A_PILLOW
zpl=Class_zpl()
zpl.set_compress(False)
zpl.set_blacklight_percentage(60)
str_label=zpl.process(img)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((PRINTER_IP, PORT_PRINTER))
s.sendall(str.encode(str_label))
#data = s.recv(1024)
s.close()