如何使用Android(Java)的Esc-Pos打印图像



我有一个应用程序,可以使用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);
}

我以前在c++中完成过这个任务,它并不平凡。您需要逐像素访问图像(如果您有位图,这应该很容易)。

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

这些都不是很难,但它需要一些技巧才能完美地适用于所有图像大小和形状。

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

从顶部开始向下查看图像,并将其划分为8个像素高的区域。对于每个波段:

发送ESC POS序列,使打印机进入"图形模式"。从左到右循环浏览图像带。对于带中每列8个像素:

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

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

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

相关内容

  • 没有找到相关文章

最新更新