簡體   English   中英

在 POS/ESC 熱敏打印機 Android 上打印圖像

[英]Printing an image on POS/ESC thermal printer Android

我正在嘗試在藍牙 pos/esc 熱敏打印機上打印徽標,正在打印的圖像是這種壞字符或垃圾字符。 如果您對我做錯了什么有答案,或者在下面做錯了什么,請提供幫助。 我試過這段代碼“ 堆棧溢出-如何在 Android 的藍牙打印機上打印圖像? ”仍然無法正常工作當前使用的圖像是:

576px 寬 X 95px 高

我目前的代碼是。

public void print_image() {

    try {
        mOutputStream = mSocket.getOutputStream();

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

            convertBitmap(bmp);
            mOutputStream.write(PrinterCommands.SET_LINE_SPACING_24);

        int offset = 0;
        while (offset < bmp.getHeight()) {
            mService.write(PrinterCommands.SELECT_BIT_IMAGE_MODE);
            for (int x = 0; x < bmp.getWidth(); ++x) {

                for (int k = 0; k < 3; ++k) {

                    byte slice = 0;
                    for (int b = 0; b < 8; ++b) {
                        int y = (((offset / 8) + k) * 8) + b;
                        int i = (y * bmp.getWidth()) + x;
                        boolean v = false;
                        if (i < dots.length()) {
                            v = dots.get(i);
                        }
                        slice |= (byte) ((v ? 1 : 0) << (7 - b));
                    }
                    mService.write(slice);
                }
            }
            offset += 24;
                mOutputStream.write(PrinterCommands.FEED_LINE);
                mOutputStream.write(PrinterCommands.FEED_LINE);
                mOutputStream.write(PrinterCommands.FEED_LINE);
                mOutputStream.write(PrinterCommands.FEED_LINE);
                mOutputStream.write(PrinterCommands.FEED_LINE);
                mOutputStream.write(PrinterCommands.FEED_LINE);
            }
            mOutputStream.write(PrinterCommands.SET_LINE_SPACING_30);



    }catch (Exception e){
        Log.e("errorme",e.getMessage());
    }
}
public String convertBitmap(Bitmap inputBitmap) {

    mWidth = inputBitmap.getWidth();
    mHeight = inputBitmap.getHeight();

    convertArgbToGrayscale(inputBitmap, mWidth, mHeight);
    mStatus = "ok";
    return mStatus;
}

private void convertArgbToGrayscale(Bitmap bmpOriginal, int width,
                                    int height) {
    int pixel;
    int k = 0;
    int B = 0, G = 0, R = 0;
    dots = new BitSet();
    try {

        for (int x = 0; x < height; x++) {
            for (int y = 0; y < width; y++) {
                // get one pixel color
                pixel = bmpOriginal.getPixel(y, x);

                // retrieve color of all channels
                R = Color.red(pixel);
                G = Color.green(pixel);
                B = Color.blue(pixel);
                // take conversion up to one single value by calculating
                // pixel intensity.
                R = G = B = (int) (0.299 * R + 0.587 * G + 0.114 * B);
                // set bit into bitset, by calculating the pixel's luma
                if (R < 55) {
                    dots.set(k);//this is the bitset that i'm printing
                }
                k++;
            }
        }

    } catch (Exception e) {
        // TODO: handle exception
        Log.e(TAG, e.toString());
    }

}

然后我有一個叫做打印機命令的類,它在下面。

public class PrinterCommands {
    public static final byte[] INIT = {27, 64};
    public static byte[] FEED_LINE = {10};

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

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

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

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

    public static byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, (byte)255, 3};
    public static byte[] SET_LINE_SPACING_24 = {0x1B, 0x33, 24};
    public static byte[] SET_LINE_SPACING_30 = {0x1B, 0x33, 30};

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

我發現打印public static byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, (byte)255, 3}; . 我嘗試使用不同寬度像素大小的圖像來改變它。 mOutputStream = mSocket.getOutputStream(); 意味着我從藍牙套接字即藍牙套接字 mSocket 獲取輸出流。

使用以下代碼使用藍牙 pos/esc 熱敏打印機打印圖像

創建以下方法。

public void printPhoto(int img) {
        try {
            Bitmap bmp = BitmapFactory.decodeResource(getResources(),
                    img);
            if(bmp!=null){
                byte[] command = Utils.decodeBitmap(bmp);
                outputStream.write(PrinterCommands.ESC_ALIGN_CENTER);
                printText(command);
            }else{
                Log.e("Print Photo error", "the file isn't exists");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("PrintTools", "the file isn't exists");
        }
    }

使用這樣的方法。

printPhoto(R.drawable.demoimage);

printText()方法如下

private void printText(byte[] msg) {
        try {
            // Print normal text
            outputStream.write(msg);
            printNewLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

printNewLine()如下所示

private void printNewLine() {
        try {
            outputStream.write(PrinterCommands.FEED_LINE);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

暫無
暫無

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

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