【问题标题】:How to send color images with ESC/POS?如何使用 ESC/POS 发送彩色图像?
【发布时间】:2021-10-04 08:09:28
【问题描述】:

我有一台 Epson CW-C6000,我正在尝试使用 ESC 命令进行控制。我得到了要打印的文本,所以我知道我的 IP 地址、端口等正确,但我终生无法打印图像。

这是我的代码(从 Ruby on Rails 服务器运行,大部分图像被截断):

streamSock = TCPSocket.new( "X.X.X.X", 9100 )
str = "~DYR:PRODIMG,B,P,183208,0,89504E470D...4AE426082" + "^XA" + "^FO150,150^IMR:PRODIMG.PNG^FS" + "^XZ"
streamSock.send( str , 0)
streamSock.close

图片是一个.png,我用这个网站转换成十六进制: http://tomeko.net/online_tools/file_to_hex.php?lang=en

我主要使用此 PDF 的第 10 页作为参考: https://files.support.epson.com/pdf/pos/bulk/esclabel_apg_en_forcw-c6000series_reve.pdf

有人有提示吗?爱普生支持人员非常无助。

如果我的格式不好,我也很抱歉;我是新来的,如果有问题,我会很乐意编辑我的帖子。

【问题讨论】:

  • 我使用十六进制字符串作为图像数据。那不应该是(B)inary吗?
  • 我已经阅读了所有文档,但没有什么能让我清楚“数据”参数应该是什么。我使用了您链接的 C# 问题中的代码并得到了与以前相同的十六进制,所以我认为这是正确的,但我不明白 ZB64 是如何发挥作用的。我是否必须以某种方式压缩图像两次?就像你说的,什么是 PNG hex ZB64?
  • 我从 Zebra 找到了这个命令,而且它有效!但是,当我输入自己的 Base64 字符串和文件大小时,打印机只会闪烁。 support.zebra.com/cpws/docs/zpl/DY_LOGO_PNG.zpl

标签: ruby epson escpos zpl-ii


【解决方案1】:

也许这个材料可以用作额外的参考。
它们的命令/数据格式似乎与 ESC/POS 完全不同。

ESC/Label Command Reference Guide
第 12 页

1.3.4 关于在打印机中保存图形和标签格式

使用 ESC/Label 命令,您可以在打印机中保存图形和标签格式。打印机有一个文件系统。保存在打印机中的数据作为文件处理,按以下方式管理。

  • 文件系统没有层次结构。
  • 打印机具有非易失性保存设备(如 Flash ROM)和易失性保存设备(如 RAM),并且为每个设备分配不同的驱动器号。
  • 文件被指定为
    "<drive letter> colon <:> <file name> dot <.> <extension>"

第 40-41 页

2.8 打印图形
...细节已被省略。请以实际文档为准...

2.8.1 在打印机中注册图形并打印它
...从内容中挑选一些。请以实际文档为准...

  1. 删除保留在打印机中的文件(^ID 命令)。
  2. 在打印机中注册图形(~DY 命令)。

注册彩色图形时,可以使用 PNG 格式。注册单色图形时,可以注册PNG格式或GRF格式。

  • PNG 格式 单色和彩色图形
  • GRF 格式单色图形

执行第 1 步的原因。
确保执行打印所需的存储内存容量。

2.8.2 在字段中嵌入图形并打印它
...细节已被省略。请以实际文档为准...


另外:

第 104-106 页

~DY
[名称]
保存文件
[格式]
~DY d: o ,f ,x ,t ,w ,data
...应提供详细说明参数的表格,但省略...

[功能]
...功能和参数的进一步详细解释和图,但省略...

  • 图形数据处理如下。
    • 如果数据格式是二进制,可以使用任意二进制数据作为参数数据。此时Parameter数据的大小必须与Parameter t中指定的大小相匹配。
    • 如果数据格式是十六进制字符串,则使用下面1.到3.的一个字符作为参数数据。此时,二进制写入的 Parameter 数据的大小必须与 Parameter t 中指定的大小相匹配。
      1. ASCII 中的 0 到 9、A 到 F 和 a 到 f 可以用作十六进制图形数据。
      2. ASCII 逗号 ,参数分隔符,用于分隔行。如果输入了逗号,则执行处理,就好像在该行的其余部分输入了 ASCII 0。
      3. ASCII 中的 G 到 Y 和 g 到 z 可以用作重复字符。例如,如果输入了 I9,则如同输入了 999 一样执行处理。下表表示重复次数。
        ...省略了字符和重复指定次数的表...

看这个技术参考指南的内容,好像可以用工具注册图片,而不是命令。
CW-C6000/C6500 Series Technical Reference Guide
第173-174页

第 288 页概述了 Epson Inkjet Label Printer SDK,还描述了示例程序的存在。

【讨论】:

  • 我已经阅读了链接的文档,但我的问题没有得到解答。从文档中不清楚为什么我的命令不起作用。我怀疑十六进制需要采用不同的格式,但他们在 PDF 中的任何地方都没有示例
  • 您的命令不起作用的事实是一种现象,而不是规范,因此文档中不应有描述。该命令的详细信息在 PDF 后面有描述,请参考。我在答案中添加了哪个页面。
  • 我在发布我的问题之前通读了这些文件。我需要的细节不在那里。几乎没有关于命令的“data”参数的信息。
  • 如果是单色而不是彩色的话,好像有这样的库。 Ruby bbulpett/zebra-zpl, mtking2/img2zpl, C# BinaryKits/BinaryKits.Zpl, JavaScript metafloor/zpl-image 或者,好像还有另一个这样的SDK,为什么不联系EPSON呢? Epson Inkjet Label Printer SDK
【解决方案2】:

好吧,我终于让它工作了。打印彩色 .PNG 的命令如下:

~DYE:[Image Name].PNG,p,p,[Image Size],0,:B64:[Base64 String]:[CRC]

让我绊倒的事情:

-您似乎需要在文件名上添加 .PNG 扩展名,即使 Epson 手册没有显示。

-[Image Size] 是 Base64 字符串中的字符数,尽管 Epson 手册说它应该是原始 .PNG 图像文件的大小。如果这是错误的,打印机将挂起并且在重新启动之前不再接受任何类型的输入。

-可能还有其他选项,但我只能使用十六进制 CRC-16/XMODEM 类型的 CRC。

感谢 KJ 的建议并与我同行!

【讨论】:

  • 看解释,毕竟是打印机固件的bug。它没有按记录工作。
【解决方案3】:

@Farmbot26。我一直在尝试使用 vb.Net 进行同样的操作,正如您所指出的,爱普生支持没有帮助。我不确定是错误的实际图像数据、CRC 还是 ZPL 代码,因为没有任何帮助。以下是 2 个无效的示例。

`Dim binaryData As Byte() = System.IO.File.ReadAllBytes(txtPNGFile.Text)
        zplImageData = Convert.ToBase64String(binaryData)
        crc = calcrc(binaryData, binaryData.Length).ToString("X4")
        Dim zplToSend As String = "~DYE:" & Path.GetFileName(txtPNGFile.Text).ToUpper & ",P,P," & zplImageData.Length & ",0,:B64:" & zplImageData & ":" & crc & "^XZ"`


`Dim binaryData As Byte() = System.IO.File.ReadAllBytes(txtPNGFile.Text)
        crc = calcrc(binaryData, binaryData.Length).ToString("X4") 'Calculate CRC
        zplImageData = BitConverter.ToString(binaryData).Replace("-", "")
        Dim zplToSend As String = "~DYE:" & Path.GetFileName(txtPNGFile.Text).ToUpper & ",A,P," & zplImageData.Length & ",0,:B64:" & zplImageData & ":" & crc & "^XZ"`

这是我的 CRC 示例。

`Function calcrc(ByVal data() As Byte, ByVal count As Integer) As Integer
    Dim crc As Integer = 0
    For Each b As Byte In data
        Dim d As Integer = CInt(b)
        crc = crc Xor (d << 8)
        For j = 0 To 7
            If ((crc And &H8000) <> 0) Then
                crc = (crc << 1) Xor &H1021
            Else
                crc = (crc << 1)
            End If
        Next
    Next
    Return crc And &HFFFF
End Function`

【讨论】:

    【解决方案4】:

    我想出了另一个解决方案。使用二进制数据保存 PNG 图像。我在使用 Epson Settings Utility 读取图像数据的已保存备份文件时发现了这一点。

    ~DYE:FILENAME.PNG,B,P,BINARYFILESIZE,0, BINARYIMGDATA

    ` Try
                Dim binaryData As Byte() = System.IO.File.ReadAllBytes(txtPNGFile.Text)
                Dim client As System.Net.Sockets.TcpClient = New System.Net.Sockets.TcpClient()
                client.Connect(IP_TextBox1.Text.Replace(" ", ""), txtPort.Text)
                Dim writer As System.IO.StreamWriter = New System.IO.StreamWriter(client.GetStream(), Encoding.UTF8)
                Using mStream As New MemoryStream(binaryData)
                    Dim zplToSend As String = "~DYE:" & Path.GetFileName(txtPNGFile.Text).ToUpper & ",B,P," & mStream.Length & ",0,"
                    writer.Write(zplToSend)
                    writer.Flush()
                    mStream.WriteTo(client.GetStream())
                    writer.Flush()
                End Using
                writer.Close()
                client.Close()
                MsgBox("Send Complete", MsgBoxStyle.OkOnly, "Complete")
            Catch ex As Exception
                MsgBox(ex.Message.ToString, MsgBoxStyle.OkOnly, "ERROR")
    
            End Try`
    

    您还可以在 IMAGE 对象中打开图像文件并根据需要调整其大小。我必须为打印机的标签尺寸这样做。

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 2019-03-03
      • 2020-02-11
      • 2015-09-09
      • 2018-08-29
      • 2013-11-23
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      相关资源
      最近更新 更多