簡體   English   中英

ESC / POS熱敏打印機,如何在Android中居中位圖圖像?

[英]ESC/POS thermal printer, how to center a bitmap image in Android?

我正在Android中編寫一個簡單的應用程序,通過ESC / POS熱敏打印機進行打印。 我只是一個問題。 該應用程序生成QR碼(使用zxing庫),將其轉換為位圖並將其發送到打印機。 打印機打印它,但我無法將它居中。 而不是文字我沒有定位問題。

這是打印文本和QR的代碼。

byte[] INIT = {27, 64};
byte[] FEED_LINE = {10};

byte[] SELECT_FONT_A = {27, 33, 0};

byte[] FONT_B = {0x1B, 0x4D, 0x01};
byte[] ALLINEA_SX = {0x1B, 0x61, 0x00};
byte[] ALLINEA_CT = {0x1B, 0x61, 0x01};
byte[] ALLINEA_DX = {0x1B, 0x61, 0x02};
byte[] GRASSETTO_ON = {0x1B, 0x47, 0x11};
byte[] GRASSETTO_OFF = {0x1B, 0x47, 0x00};
byte[] SET_6 = {0x1B, 0x52, 0x06};
byte[] CODICI = {0x1B, 0x74, 0x13};
byte[] EURO = {(byte) 0xD5};
byte[] PALLINO = {(byte) 0x5B};
byte[] FONT_3X = {0x1D, 0x21, 0x21};
byte[] FONT_2X = {0x1D, 0x21, 0x11};
byte[] FONT_1X = {0x1D, 0x21, 0x00};

byte[] SET_BAR_CODE_HEIGHT = {29, 104, 100};
byte[] PRINT_BAR_CODE_1 = {29, 107, 2};
byte[] SEND_NULL_BYTE = {0x00};

byte[] SELECT_PRINT_SHEET = {0x1B, 0x63, 0x30, 0x02};
byte[] FEED_PAPER_AND_CUT = {0x1D, 0x56, 66, 0x00};

byte[] SELECT_CYRILLIC_CHARACTER_CODE_TABLE = {0x1B, 0x74, 0x11};

byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, 127, 3};
byte[] SET_LINE_SPACING_24 = {0x1B, 0x33, 24};
byte[] SET_LINE_SPACING_30 = {0x1B, 0x33, 30};

byte[] TRANSMIT_DLE_PRINTER_STATUS = {0x10, 0x04, 0x01};
byte[] TRANSMIT_DLE_OFFLINE_PRINTER_STATUS = {0x10, 0x04, 0x02};
byte[] TRANSMIT_DLE_ERROR_STATUS = {0x10, 0x04, 0x03};
byte[] TRANSMIT_DLE_ROLL_PAPER_SENSOR_STATUS = {0x10, 0x04, 0x04};

mService.write(INIT);
mService.write(ALLINEA_CT); //text to center
mService.write(SELECT_FONT_A);
mService.write(FONT_2X);
mService.write("Hello stackoverflow!!\n".getBytes());
mService.write(FONT_1X);
mService.write(ALLINEA_SX); //text to left
mService.write("Thanks for help!\n".getBytes());


int QRCODE_IMAGE_HEIGHT = 255;
int QRCODE_IMAGE_WIDTH = 255;

QRCodeWriter qrWriter = new QRCodeWriter();
try {
    Hashtable<EncodeHintType, ErrorCorrectionLevel> hints = new Hashtable<EncodeHintType, ErrorCorrectionLevel>();
    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
BitMatrix bitMatrix = qrWriter.encode("https://stackoverflow.com",
        BarcodeFormat.QR_CODE,
        QRCODE_IMAGE_WIDTH,
        QRCODE_IMAGE_HEIGHT, hints);

    int bitMatrixWidth = bitMatrix.getWidth();

    int bitMatrixHeight = bitMatrix.getHeight();

    int[] pixels = new int[bitMatrixWidth * bitMatrixHeight];

    for (int y = 0; y < bitMatrixHeight; y++) {
        int offset = y * bitMatrixWidth;

        for (int x = 0; x < bitMatrixWidth; x++) {

            pixels[offset + x] = bitMatrix.get(x, y) ?
                    getResources().getColor(R.color.QRCodeBlackColor):getResources().getColor(R.color.QRCodeWhiteColor);
        }
    }
    Bitmap bitmap = Bitmap.createBitmap(bitMatrixWidth, bitMatrixHeight, Bitmap.Config.ARGB_4444);

    bitmap.setPixels(pixels, 0, 255, 0, 0, bitMatrixWidth, bitMatrixHeight);

    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.k_city5);

    Bitmap bmOverlay = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
    Canvas canvas = new Canvas(bmOverlay);
    canvas.drawBitmap(bitmap, new Matrix(), null);
    canvas.drawBitmap(bmp, 94, 94, null); //34x34
    //canvas.drawBitmap(bmp, 86, 86, null); //42x42

    if(bmOverlay!=null) {
        byte[] command = Utils.decodeBitmap(bmOverlay);
        mService.write(ALLINEA_CT); //This command should center my QR, but it's not working
        mService.write(command);
        mService.write(FEED_LINE);
        mService.write(FEED_LINE);
    }

這是印刷的結果: 在此輸入圖像描述

將圖像填充在左側,直到它看起來正確。 請參閱Android:padding留下白色的位圖

您可以通過反復試驗來完成此操作,或者以點的形式獲取打印機的寬度(可在數據表中找到)並進行數學計算:

padding = (page width - image width) / 2

ESC / POS中有命令將文本居中,而在某些打印機上,這將使圖像居中。 還有其他方法可以在給定位置(頁面模式)打印圖像,或者以更像文本(列格式)的方式對齊,但填充圖像對您的示例進行更簡單的修改

可能對其他人有用:我在QR碼命令之前添加了這個命令:

[0x1b, 0x61, 0x01] // align to center [0x1b, 0x3d, 0x01] //select

從CITIZEN S310II打印機命令參考手冊中得到它。 基本上如果不起作用,您只需要找到打印機型號的居中命令。 希望這有助於某人:)

暫無
暫無

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

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