心态爆炸,各种方法都尝试电脑浏览器都翻烂了。记录一下,怎样将图片转成zpl指令需要的格式数据。
关于zpl一些乱七八糟
斑马打印机有【R:,E:,B:,A:】四种不同内存区域。当你和斑马打印在同一个网段内直接在浏览器输入斑马打印的IP就能进入查看各种配置,指令的页面。
- R 内存(R:):R 内存是用于存储打印作业相关的临时数据和图像缓存的内存区域。当打印作业被发送到打印机时,相关的图像数据和打印指令会被加载到 R 内存中进行处理和打印。R 内存通常用于存储临时性的数据,如打印队列中的作业,以及需要在打印过程中动态生成的图像数据。
- E 内存(E:):E 内存是用于存储格式化的图像、字体和标签模板等内容的内存区域。这些内容可以通过 ZPL 指令在 E 内存中创建和存储,并且可以通过相应的 ZPL 指令从 E 内存中调用和打印。E 内存通常用于存储静态的或经常使用的标签模板,以便在打印过程中快速访问和使用。
- B 内存(B:):B 内存是斑马打印机的标签缓冲区,用于存储将要打印的标签数据。在打印作业进行时,打印机会将标签数据加载到 B 内存中,然后进行打印操作。一旦打印作业完成,B 内存中的数据会被清除。
- A 内存(A:):A 内存是斑马打印机的字体和图像缓存区域。当打印机需要使用特定的字体或图像时,它们会被加载到 A 内存中以便在打印作业中使用。 连接查看斑马打印机配置和指令截图 首先将图片指定一个名称使用zpl指令下载到打印机内存中,打印标签时候哪个位置需要这张图片在使用调用指令如^XG,^Im等指定名称调用。zpl指令提供了多种命令将图片下载到打印机指定的内存中,这些指令都需要一个最关键的参数data。 根据官方文档描述,除了这个ASCII十六进制字符串,还有更科学的B64和Z64两种编码但都没有提供具体的实现步骤。详情查看
ZB64 Encoding and Compression 目录
好了,我开始将图片转十六进制
- 最开始思路,将图片转成字节数组,再转成ASCII之后再转成十六进制。发送打印机,咦,什么都没有,打印机data指令灯亮起说明接收了数据。西巴,看来这斑马要求不简单
- 开始尝试使用B64方案,先将图片转成base64字符串,再计算它的CRC。怎么计算CRC呢,现在这么多种算法?开始疯狂百度,stackoverflow找到一些回答的,各种尝试,失败!但是发现了一位提供了一个关键信息
- 各种算法CRC
It’s not easy. You have to convert the image to 1-bit per pixel b/w, and then calculate the size including the bytes per row, and then properly form up the parameters of the command to store it.~DG Or… Zebra provides an API to convert images to GRFs (Zebra internal image type). There are a bunch of developer demos in the package, including a demo on how to print/store an image as a GRF on your printer Zebra Link-OS SDK download Hope this helps
- 发现一个c#版本的转成zpl格式的data的工具类,准备仿写一个Java版本的,啊,后面完全不知道逻辑了。放弃!
您必须将图像转换为每像素 1 位黑白,然后计算大小(包括每行字节数),然后正确形成命令的参数来存储它 就在这篇回答中找到了一个写的Java版本转图类,但测试打印很多图片都会失败。多数类型图片打印失败链接 准备要使用这个了,不想再折磨了上面代码附带的一个测试转图的网站
最终方法
开始摆烂,摸鱼突然发现一篇帖子提供的一个思路说,斑马的api中有转图的方法。死马当做活马医试一下呗。
stackoverflow中文翻译过来的
这个方法很早引起了我的注意,但是api中没有这两个同名的方法,我再api的官方文档中也没找到这两个方法就没怎么注意。我最后找了两个没有后缀的方法测试一下,居然成功了!!!!
- 斑马api下载入口
- 就是下面的三句代码,根据convertGraphic方法的第一个参数的结尾是.GRF还是.png还是其他的来生成不同编码格式的data数据
ZebraImageI image = ZebraImageFactory.getImage(“D:\4.png”); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); PrinterUtil.convertGraphic(“R:SAMPLE.GRF”,image,outputStream);
不需要替换掉看着像特殊字符的,打印机能识别。
完结,如果有人详解讲解斑马api文档中的方法那是极好的,官方api中提供了不同语言的实现安卓,C#,C++等等都可以使用api来将图片的数据转成zpl编码格式的数据,撒花。