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;
}
Но когда я печатаю графику, она искажается:
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);
}