JAVA ESC Pos将NV图形上传到打印机

时间:2016-05-16 20:23:53

标签: java android bitmap epson escpos

使用Esc / Pos,我想将位图图像上传到打印机上的NV图形内存。

我正在使用Esc / Pos手册的GS ( L / GS 8 L <Function 67>

我可以使用<Function 65><Function 66>删除所有或其中一个图片。

我知道在将Bitmap添加到函数时我遗漏了一些东西。

Heres是我的命令字符串,包括Bitmap。 bitmapString删除了Bitmap的文件头和info头(前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;
        }

但是当我打印图形时它会被扭曲:

enter image description here

1 个答案:

答案 0 :(得分:2)

我已经解决了这个问题。

发送的位图字节必须使用以下方法解码。该方法将位图像素转换为单色字节。 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);
}