簡體   English   中英

如何在Android(Java)中使用Esc Pos打印圖像

[英]How can I print an image with Esc Pos with Android (Java)

我有一個應用程序,可以使用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個像素的水平帶,並得到一個代表每列8個像素的字符(按位或)。 POS文檔應告訴您如何使用此方法打印一行圖形。

這些都不是很難,但是花了一點時間才能使其完美適合所有圖像尺寸和形狀。

更詳細的描述:打印機可以在8像素垂直帶中從左到右打印圖像,這意味着它首先打印圖像的前8像素-然后滾動紙張並打印下一個8像素行。 所以你這樣做:

從頂部開始向下瀏覽圖像,並將其分為8個像素高條帶。

發送使打印機進入“圖形模式”的ESC POS序列。 從左到右遍歷圖像帶。 對於帶中8像素的每一列:

從上到下計算像素的位值。 將其轉換為簡單的字節值,例如IsPixelBlack(0)* 1 + IsPixelBlack(1)* 2 + IsPixelBlack(2)* 4 + ... + IsPixelBlack(7)* 128,如果x為1,則IsPixelBlack(x)為1列中的像素為黑色,否則為0。 然后將此字節值作為字符發送給打印機。

因此,您最終每8個像素列發送一個字符,表示為要打印的一個數據帶的字符串。

我還認為愛普生有一個用於ESC / POS設備的android SDK; 我從未使用過它,但認為它是免費使用的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM