JAVA ESC Pos uploads NV graphics to the printer

JAVA ESC Pos uploads NV graphics to the printer … here is a solution to the problem.

JAVA ESC Pos uploads NV graphics to the printer

With Esc/POS, I want to upload a bitmap image to NV video memory on the printer.

I’m using the GS (L / GS 8 L <Function 67> Esc/Pos manual.

I can delete all or one drawing using <Function 65> and <Function 66 >.

I

know I’m missing something when adding bitmaps to functions.

Here is my command string, including the bitmap. bitmapString removes the bitmap’s file header and information header (the first 62 bytes) (DataOffset). :

String bitmapString = new String(bitmapBytes, Charsets.US_ASCII);
bitmapString = bitmapString.substring(DataOffset, bitmapStringSize);
String commandString = "";

int commandLength = (bitmapStringSize.length) + 11;
    pL = commandLength % 256;
    if (commandLength < 256) {
        pH = 0;
    } else {
        pH = (commandLength - pL) / 256;
    }

xL = bitmapWidth % 256;
    if (bitmapWidth < 256) {
        xH = 0;
    } else {
        xH = (bitmapWidth - (bitmapWidth % 256)) / 256;
    }

yL = bitmapHeight % 256;
    if (bitmapHeight < 256) {
        yH = 0;
    } else {
        yH = (bitmapHeight - (bitmapHeight % 256)) / 256;
    }

commandString
            += Utils.H("1B")// 27
            + Utils.H("40") // 64
            + Utils.H("1B") // 27
            + Utils.H("3D") // 61
            + Utils.H("01") // 1

+ Utils.H("1D") // GS = 29
            + Utils.H("28") // ( = 40
            + Utils.H("4C") // L = 76

+ Utils.D(pL)   // pL
            + Utils.D(pH)   // pH

+ Utils.H("30") // m = 48
            + Utils.H("43") // fn = 67
            + Utils.H("30") // a = 48

+ Utils.H(KC1)  // kc1
            + Utils.H(KC2)  // kc2

+ Utils.H("01") // b = 1

+ Utils.D(xL)   // xL
            + Utils.D(xH)   // xH
            + Utils.D(yL)   // yL
            + Utils.D(yH)   // yH

+ Utils.H("31");// c = 49

commandString += bitmapString;

I’m using ePOS-Print.jar to open and write to the printer:

EpsonIo epsonio = new EpsonIo();
byte[] commandBytes = commandString.getBytes(Charsets.US_ASCII);

epsonio.open(DevType.BLUETOOTH, MAC, null, ESCPosService.this);

while (n > 0) {

epsonio.write(commandBytes, i, n > bufferSize ? bufferSize : n, SEND_TIMEOUT);

Thread.sleep(450);

i += bufferSize;
            n -= bufferSize;
        }

But when I print the graphic it is distorted :

enter image description here

Solution

I’ve fixed this issue.

The bitmap bytes sent must be decoded using the following method. This method converts bitmap pixels to monochromatic bytes. 1 or 0.

Hope this helps the people of the future!

public static byte[] decodeBitmap(byte[] bitmapBytes) {

Bitmap bmp = BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.length);

int zeroCount = bmp.getWidth() % 8;
    String zeroStr = "";
    if (zeroCount > 0) {
        for (int i = 0; i < (8 - zeroCount); i++) {
            zeroStr = zeroStr + "0";
        }
    }

List<String> list = new ArrayList<>();
    for (int i = 0; i < bmp.getHeight(); i++) {
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < bmp.getWidth(); j++) {
            int color = bmp.getPixel(j, i);

int r = (color >> 16) & 0xff;
            int g = (color >> 8) & 0xff;
            int b = color & 0xff;

 if color close to white,bit='0', else bit='1'
            if (r > 160 && g > 160 && b > 160)
                sb.append("0");
            else
                sb.append("1");
        }
        if (zeroCount > 0) {
            sb.append(zeroStr);
        }

list.add(sb.toString());
    }

List<String> bmpHexList = binaryListToHexStringList(list);
    List<String> commandList = new ArrayList<>();
    commandList.addAll(bmpHexList);

return hexListToBytes(commandList);
}

Related Problems and Solutions