EPL2斑马打印机的图像(PCX)

3
我在生产和上传图形到EPL2打印机时遇到了麻烦。我已经尝试了几乎所有可用的软件并搜索了互联网,但是我还是束手无策。我有一个1位文件,我尝试使用以下脚本上传... setppi.txt
GK"NAMEPCX"
GK"NAMEPCX" 
GM"NAMEPCX"3042

然后使用上传

copy setppi.txt+ppirmt.pcx lpt1/b

有经验的人在我把剩下的头发都拔光之前有什么提示吗?我几乎可以确定这个问题与pcx的创建有关,但是尝试了所有选项后,我不确定接下来该怎么做。


1
你曾经解决过这个问题吗?我也在努力尝试做同样的事情,但卡住了。 - fearofawhackplanet
@fearofawhackplanet 我目前正在实现将SVG转换为EPL的POC - 您可以在此处找到将*.png*文件转换并发送到打印机作为PCX的相关代码:https://github.com/dittodhole/dotnet-System.Svg.Render.EPL - user57508
4个回答

3

这些链接已经失效了。你有类似解决方案的链接吗? - Jason Foglia
1
@JasonFoglia:是的,该网站已经不存在了。我只是将链接更改为Wayback Machine,幸运的是,该网站已被归档。 - Christian Specht

3
这是我发现的创建PCX格式的正确方法:
在GIMP中,将文件保存为1位(黑白)BMP。不要选择PCX,因为保存的格式不是打印机所需的1位PCX格式!
使用ImageMagick的convert程序将BMP转换为PCX。
另一个问题是,在解决上述问题后,图形仍然会出现损坏,这是一个代码页问题,所以请注意。

@Android 也遇到了这个问题... 当我尝试打印图像时,只会得到一行点。那么是什么代码页的问题呢? - Michael

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..

稍后,您应该能够通过GM将存储的"namepcx"写入打印机的图像缓冲区。然而,我花了两天时间尝试存储PCX,但它永远不会被正确地存储。所以最终我只使用GW命令直接将像素数据写入打印机的图像缓冲区,避免了“存储在闪存中”。此外,最初通过GM进行的“闪存”存储是用于存储一些图像(如徽标),这些图像将在所有标签上重复。因此,您可以将其存储一次,然后使用相同的徽标打印10,000个标签。然而,如果从Java打印,通常会在不同的标签上打印许多不同的图像。因此,如果为每个标签存储新图像,则闪存内存将非常快地“磨损”(例如,LP 2824打印机的手册说闪存内存仅具有100k写入周期)。
因此,似乎使用GW直接将图像写入图像缓冲区而不是使用三步GK GM GG可能是更好的解决方案。

0

声明:我正在编写一个SVG-to-EPL转换器,可以在此处找到

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

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

我使用以下(非优化/天真)的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) 中找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接