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

如何使用Android(Java)使用Esc Pos打印图像,java,android,printing,epson,escpos,Java,Android,Printing,Epson,Escpos,我有一个应用程序,可以打印票与热敏打印机使用ESC POS语言。我现在使用的代码是: /* <-40char-> */ Socket sock = new Socket(Impresora.getImpresora_Tickets().getIp(), Impresora.getImpresora_Tickets().getPuerto()); OutputStreamWriter osw

我有一个应用程序,可以打印票与热敏打印机使用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");
/**/
Socket sock=新套接字(impersora.getimpersora_Tickets().getIp(),impersora.getimpersora_Tickets().getPuerto());
OutputStreamWriter osw=新的OutputStreamWriter(sock.getOutputStream(),Charset.forName(“CP1252”);
PrintWriter oStream=新的PrintWriter(osw);
/*开始*/

对于(int i=0;i),我在C++之前完成了这个任务,这不是微不足道的。你需要逐像素地访问图像(如果你有位图,那就很容易了)。 然后你必须将图像分成8个像素的水平带,并得到一个代表每列8个像素的字符(使用位or)。POS文档应该告诉你如何使用这种方法打印一行图形

所有这些都不是很难做到,但要想让它完美地适合所有的图像大小和形状,需要做一些修改

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

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

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

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

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


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

这是关于ESC POS协议的问题,还是关于Java的问题?这是关于ESC POS的问题,但如果我能得到一个如何在Java中实现的示例,那将非常棒。逐像素访问很容易,但我不确定如何实现把图像分成8个像素的水平带。我不确定ESC POS字是如何打印的…每个带是一行。一行可以用多个带创建。如果你能帮助我用C++代码,我会很高兴。可惜这段代码不是公开的,所以我不能粘贴在这里,但是我会给我添加一个更完整的描述。ean.嗨,Elemental,我正试着按照你说的做,但我对ESC POS非常熟悉,我迷路了。我正试着用这段代码做点什么:但我不确定如何将位图划分为像素。我有一个字节数组,但我不知道如何继续。。。
/**
* 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);
}