9

我想将 ZPL 指令发送到 Zebra 打印机(目前为 GK420t)。我正在打印 50 毫米 x 20 毫米的标签。我想在标签的左上角打印一个徽标(小 ~ 5mm x 5mm 图像)。

我想知道我应该遵循的步骤来做到这一点。

我一直在阅读并尝试 ZPL 手册中的一些内容,但我并不真正了解它是如何工作的,也找不到工作示例。

看起来我必须先将图像“加载”到打印机中(在所谓的“存储区域”/DRAM 中?)然后打印。

文件扩展名在.GRF手册中多次提到。我找不到将 .PNG 或 .BMP 图像转换为 .GRF 文件的工具。我读到 .GRF 文件是图形图像的 ASCII HEX 表示......但它并没有帮助我完成这项工作。

我可以使用“Zebra Setup Utilities”在标签上打印徽标,方法是“下载字体和图形”,选择任何可用的 .MMF 文件,添加 .BMP 图片,将其下载 [到打印机] 并打印测试页。但直到现在,我都无法使用 ZPL 指令来做到这一点。

我还想知道我应该使用什么最佳尺寸,因为我需要在标签上打印一个约 5 毫米 x 5 毫米的小图像。我打印的图像是 40 像素 x 40 像素的图像。另外,如果我必须从原始图像制作 .GRF 文件,该文件的类型应该是什么(.BMP、.PNG、.JPG)?

你能告诉我如何进行吗?

4

6 回答 6

25

听起来您有一些现有的 ZPL 代码,而您要做的就是向其中添加图像。

如果是这种情况,最简单的解决方案可能是转到Labelary 在线 ZPL 查看器,将您的 ZPL 粘贴到查看器中,单击“添加图像”,然后将要添加到 ZPL 的图像上传。

这应该通过添加您需要的图像 ZPL 命令来修改您的 ZPL,然后您可以调整位置等。

于 2015-04-03T17:16:41.357 回答
5

这是另一种选择:我在 python 中创建了自己的图像到 .GRF 转换器。随意使用它。

from PIL import Image, ImageOps
import re
import itertools
import numpy as np

# Use: https://www.geeksforgeeks.org/round-to-next-greater-multiple-of-8/
def RoundUp(x, multiple_of = 8):
    return ((x + 7) & (-1 * multiple_of))

def image2grf(filePath, width = None, height = None, rotate = None):
    image = Image.open(filePath).convert(mode = "1")

    #Resize image to desired size
    if (width != None):
        size = (width, height or width)
        if (isinstance(size[0], float)):
            size = (int(size[0] * image.width), int(size[1] * image.height))

        #Size must be a multiple of 8
        size = (RoundUp(size[0]), RoundUp(size[1]))


        # image.thumbnail(size, Image.ANTIALIAS)
        image = image.resize(size)

    if (rotate != None):
        image = image.rotate(rotate, expand = True)

    image_asArray = np.asarray(np.asarray(image, dtype = 'int'), dtype = 'str').tolist()
    
    bytesPerRow = len(image_asArray[0])
    nibblesPerRow = bytesPerRow // 4
    totalBytes = nibblesPerRow * len(image_asArray)

    #Convert image to hex string
    hexString = "".join(
        format(int("".join(row[i*4:i*4 + 4]), 2) ^ 0xF, "x")
        for row in image_asArray
        for i in range(nibblesPerRow) 
    )

    #Compose data
    data = "~DGimage," + str(totalBytes // 2) + "," + str(nibblesPerRow // 2) + "," + hexString

    #Save image
    fileHandle = open(r"labelPicture.grf", "w")
    fileHandle.write(data)
    fileHandle.close()

if __name__ == '__main__':
    # image2grf(r"warning.bmp")
    image2grf(r"pallet_label_icons.png", rotate = 90)

编辑:我更新了上面的代码以使用我的新转换方法,这会产生更好的分辨率 GRF 文件

于 2017-01-20T13:25:53.727 回答
3

只需安装ZebraDesigner,创建一个空白标签,将图像对象插入模板并添加所需的徽标图像。

打印到文件这个标签(一个 *.prn 文件)并使用Notepad++打开最近创建的文件(如果打开和保存,MS Notepad 会破坏数据)。找到一大串看似随机的字符,这就是你的图像数据。小心不要丢失任何这些字符,包括控制字符,因为整个字符串是图像的文本表示(就像它是 base64 一样)。

提示 0:随时准备好 ZPLII 程序员指南,您需要/想要检查 ZebraDesigner 是将图像发送到内存还是直接发送到打印机缓冲区。

提示 1:在将徽标添加到标签并获取文本之前,准备图像使其变为灰度(请记住检查打印机的抖动配置!)或者,在我的情况下,是纯黑白(最好的结果恕我直言)。图像可以着色,ZebraDesigner 将使打印机在转换为命令和文本之前将图像转换为灰度。

于 2016-04-26T14:38:03.243 回答
1

我创建了一个 PHP 脚本来将 PNG 图像转换为 .GRF,类似于 Josh Mayberry 的 image2grf.py:https://gist.github.com/thomascube/9651d6fa916124a9c52cb0d4262f2c3f

它使用 PHP 的 GD 图像功能,因此可以处理 GD 可以打开的所有文件格式。通过小的修改,可以使用Imagick扩展,但使用 GD 的性能似乎更好。

于 2018-07-11T08:08:57.990 回答
0

试试 codeproject 的Sharpzebra 项目。作为项目一部分的测试程序打印了一个图形,我知道这至少在 ZM400 上有效

于 2015-03-25T13:44:03.137 回答
0

转到对象==>图片,您的光标将更改为其他内容..当它更改时,单击工作区并出现一个对话框...等在那里选择图像,这样您就可以看到想要的图像想在我使用 GT800 的打印机上打印,所以对我来说,我确实喜欢这样,希望这会对你有所帮助

于 2017-06-13T14:41:18.993 回答