JAVA ESC Pos загружает графику NV на принтер

Используя Esc/Pos, я хочу загрузить растровое изображение в графическую память NV на принтере.

Я использую GS ( L / GS 8 L <Function 67> руководства Esc/Pos.

Я могу использовать <Function 65> и <Function 66> для удаления всего или одного изображения.

Я знаю, что что-то упускаю при добавлении растрового изображения в функцию.

Вот моя командная строка, включая растровое изображение. bitmapString имеет удаленный заголовок файла и информационный заголовок растрового изображения (первые 62 байта) (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;

Я использую ePOS-Print.jar для открытия и записи на принтер:

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

Но когда я печатаю графику, она искажается:

введите здесь описание изображения


person Cheese Bread    schedule 16.05.2016    source источник


Ответы (1)


Я решил проблему.

Отправляемые байты растрового изображения должны были быть декодированы с использованием метода, описанного ниже. Метод преобразует пиксели растрового изображения в монохромные байты. 1 или 0.

Надеюсь, что эта помощь кому-то в будущем!

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);
}
person Cheese Bread    schedule 18.05.2016