用于EPL2 Zebra打印机的图像(PCX)

时间:2010-06-15 16:09:44

标签: image zebra-printers epl pcx

我无法在EPL2打印机上制作和上传图形。

完全厌倦了任何可用的软件并在互联网上搜索,我感到很茫然。

我有一个1位文件,我尝试使用以下脚本上传..

setppi.txt

GK"NAMEPCX"
GK"NAMEPCX" 
GM"NAMEPCX"3042

然后使用

上传
copy setppi.txt+ppirmt.pcx lpt1/b

在我撕掉剩下的头发之前,有经验的人有没有任何提示?我几乎可以肯定这个问题与pcx的创建有关,但尝试了所有选项,我不确定我的下一步。

4 个答案:

答案 0 :(得分:3)

以下是我发现正确创建PCX的方法:

在gimp中,将文件另存为1位(黑白)BMP。不要选择PCX,因为保存的格式不是打印机要求的1位PCX!

使用imagemagick的转换程序将BMP转换为PCX。

我解决之后遇到的另一个问题是图形仍然是损坏的,这是一个代码页问题,所以要小心。

答案 1 :(得分:2)

您没有提及您正在使用的编程语言。

如果它是C#(或一般的.NET),那么这是一篇关于使用EPL打印图像的博文:
Using the EPL2 GW command to send an image to a Zebra thermal printer

来自同一个人的另一篇博文that got me started with printing EPL to Zebra printers with C#

答案 2 :(得分:1)

使用EPL2语言输出PCX图形有两种方法。第一个是你建议的那个:

GK"namepcx"
GK"namepcx"
GM"namepcx",3042
..... and here follows monochrome PCX data ...
..... with 128-bit header and following pixel data 1 bit-per pixel..

稍后您应该能够将此存储的“namepcx”写入打印机的图像缓冲区     GM 但是我花了两天时间尝试存储PCX,但它永远不能正确存储。所以我最终只是使用GW命令将像素数据直接写入打印机图像缓冲区。避免“存储在闪存中”。最初通过GM的这种“闪存”存储器意味着存储一些图像(如徽标),这些图像将在所有标签上重复出现。因此,您可以存储一次,然后打印10 000个带有相同徽标的标签。但是,如果从java中引用,通常会在不同的标签上打印许多不同的图像。因此,如果您为每个标签存储闪存新图像,那么您将很快“磨损”闪存。 (例如,LP 2824打印机的手册说闪存只有100k的写周期)。

因此,似乎使用GW将图像直接写入图像缓冲区而不是使用3步GK GM GG可能是更好的解决方案。

答案 3 :(得分:0)

免责声明:我目前正在编写一个SVG-to-EPL-transpiler,可以找到here

我最近遇到了同样的问题,并通过向打印机发送GW命令解决了这个问题。

GK - GK - GM - GG的主要区别在于您不会发送PCX标头,而是发送原始二进制文件数据(没有LRE压缩的afaik)。

我使用了以下(非优化/天真)C#代码,它们大量使用了位移。该算法可以用任何语言实现,但很简单:

[NotNull]
public IEnumerable<byte> GetRawBinaryData([NotNull] Bitmap bitmap,
                                          int octetts)
{
  var height = bitmap.Height;
  var width = bitmap.Width;

  for (var y = 0;
        y < height;
        y++)
  {
    for (var octett = 0;
          octett < octetts;
          octett++)
    {
      var value = (int) byte.MaxValue;

      for (var i = 0;
            i < 8;
            i++)
      {
        var x = octett * 8 + i;
        var bitIndex = 7 - i;
        if (x < width)
        {
          var color = bitmap.GetPixel(x,
                                      y);
          if (color.A > 0x32
              || color.R > 0x96 && color.G > 0x96 && color.B > 0x96)
          {
            value &= ~(1 << bitIndex);
          }
        }
      }

      yield return (byte) value;
    }
  }
}

转换时必须注意的事项:

  • 1:白点
  • 0:黑点
  • width必须是8的倍数(因为我们发送字节) - 上面的代码通过填充来处理这个
  • 标签的旋转/方向!
  • 这里实施了一些门槛......

我还实施了GM - GG,但这超出了这个答案的范围。相关代码可在EplCommands.StoreGraphics(bitmap:Bitmap,name:string)

中找到