![](/img/trans.png)
[英]ESC/POS thermal printer, how to center a bitmap image in Android?
[英]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.