【问题标题】:How can I print an image with Esc Pos with Android (Java)如何在 Android (Java) 中使用 Esc Pos 打印图像
【发布时间】:2015-09-09 05:00:22
【问题描述】:

我有一个应用程序,可以使用 ESC POS 语言通过热敏打印机打印票证。我现在使用的代码是:

       /* <-40char-> */
                    Socket sock = new Socket(Impresora.getImpresora_Tickets().getIp(), Impresora.getImpresora_Tickets().getPuerto());
                    OutputStreamWriter osw = new OutputStreamWriter(sock.getOutputStream(), Charset.forName("CP1252"));
                    PrintWriter oStream = new PrintWriter(osw);

       /*Start*/
                    for(int i = 0; i<Impresora.getImpresora_Tickets().getInic().size(); i++)
                        oStream.print(Impresora.getImpresora_Tickets().getInic().get(i));

       /*Set Font Size*/
                    for(int i = 0; i<Impresora.getImpresora_Tickets().getLetra4().size(); i++)
                            oStream.print(Impresora.getImpresora_Tickets().getLetra4().get(i));

       oStream.println("HELLO WORLD");

而且效果很好。问题是现在我正在用平板电脑捕获用户的签名,我想在票的末尾打印它。我将它作为位图对象,但我不知道如何将它发送到打印机。有人能帮我吗?谢谢!

编辑 1:

我正在尝试做某事,但我认为我的方法不正确......

/**
* Redimensionar imagen
*/
Bitmap firma = Current_Mesa.getT().getFirma_credito();
firma = Bitmap.createScaledBitmap(firma, 255, 64, false);

/**
* Print imagen
*/
ByteArrayOutputStream stream = new ByteArrayOutputStream();
firma.compress(CompressFormat.JPEG, 70, stream);
byte[] firma_bytes = stream.toByteArray();

byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33};
byte[] SET_LINE_SPACE_24 = {0x1B, 0x33, 24};
byte[] PRINT_AND_FEED_PAPER = new byte[]{0x0A};

for(byte b : SELECT_BIT_IMAGE_MODE)
oStream.print((char)b);

for(byte b : SET_LINE_SPACE_24)
oStream.print((char)b);

for(int i = 0; i < firma_bytes.length; i+=8)
{
    for(int plus = 0; plus < 8; plus++)
    oStream.print(firma_bytes[i+plus]);

    for(byte b : PRINT_AND_FEED_PAPER)
        oStream.print((char)b);
}

【问题讨论】:

  • 是关于 ESC POS 协议的问题,还是关于 Java 的问题?
  • 这是关于 ESC POS 的,但如果我能获得如何用 Java 进行操作的示例,那就太棒了。

标签: java android printing epson escpos


【解决方案1】:

我之前在 c++ 中完成了这项任务,这并不简单。您需要逐个像素地访问图像(如果您有位图,这应该很容易)。

然后,您必须将图像分成 8 个像素水平带,并获得一个表示每列 8 个像素的字符(使用按位或)。 POS 文档应该会告诉您如何使用此方法打印单行图形。

这一切都不是很难,但要让它完美适应所有图像尺寸和形状,需要花点功夫。

更详细的说明: 打印机可以从左到右以 8 像素垂直带打印图像,这意味着它首先打印图像的前 8 个像素 - 然后滚动纸张并打印下一个 8 像素行。所以你这样做:

从顶部开始往下走,将其分成 8 个像素高的波段。对于每个波段:

发送将打印机置于“图形模式”的 ESC POS 序列。 从左到右循环图像带。对于波段中的每列 8 个像素:

从上到下计算出像素的位值。将其转换为简单的字节值,如 IsPixelBlack(0)*1+IsPixelBlack(1)*2+IsPixelBlack(2)*4+...+IsPixelBlack(7)*128 其中 IsPixelBlack(x) 为 1 如果 x列中的像素为黑色,否则为 0。然后将此字节值作为字符发送到打印机。

因此,您最终会为每 8 像素列发送一个字符,表示为要打印的一条数据的字符串。

我还认为爱普生有一个适用于 ESC/POS 设备的 android SDK;我从未使用过它,但认为它可以免费使用。

【讨论】:

  • 逐像素访问很容易,但我不确定如何将图像分成8个像素的水平带。我不确定如何使用 esc pos 打印图像……每个波段都是一行?一行可以创建多个波段吗?如果你能帮助我编写你的 c++ 代码,我会非常高兴。
  • 不幸的是,这段代码不是公开的,所以我不能在这里粘贴它,但我会添加一个更完整的说明。
  • 嗨 Elemental,我正在努力按照你告诉我的做,但我是 ESC POS 的新手,我迷路了。我正在尝试使用此代码做一些事情:stackoverflow.com/questions/14099239/… 但我不确定如何以像素为单位划分位图。我有一个字节数组,但我不知道如何继续......
猜你喜欢
  • 2021-12-12
  • 2020-02-11
  • 2016-08-25
  • 2014-12-14
  • 2018-08-29
  • 2013-11-23
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多