1
votes

I am trying to print a logo on a Bluetooth pos/esc thermal printer, the image being printed is this bad characters or junk characters. If you have an answer of what am doing wrong, or where am doing things wrong in the below please help. I tried this code "stack overflow-How can I print an image on a Bluetooth printer in Android?" out still not working The image am currently using is:

576px width X 95px height

My current code is.

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());
    }

}

then i have a class called printer commands which is below.

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};
}

I found somewhere that is what that matters when printing public static byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, (byte)255, 3};. I tried changing that using images of different width pixel sizes. mOutputStream = mSocket.getOutputStream(); means I am getting an output stream from a bluetoothsocket i.e. Bluetoothsocket mSocket.

1
If you get solution can you post here please?Mayuri Ruparel
send me your mail address i send you an android sample project you can build and customize it to what you want.Benson Machira
@BensonMachira, can you please share me the sample project at [email protected]Parag Pawar

1 Answers

0
votes

Use Below Code to print Image using Bluetooth pos/esc thermal printer

Create below method.

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");
        }
    }

Use method like this.

printPhoto(R.drawable.demoimage);

printText() method like below

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

printNewLine() like below

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

    }