Я работаю с принтерами Epson ESC/POS (TM-H6000 III). Моя цель — напечатать довольно большие PNG-файлы с базой 64. Мне удалось преобразовать мои PNG в монохромные растровые изображения.
Я могу успешно распечатать их с помощью команды GS V 0, используя этот код, если они меньше буфера (4096 байт). Если они больше, я могу разрезать их на несколько небольших растровых изображений и отправлять их одно за другим, чтобы воссоздать полную картину. Однако мне приходится ждать около одной секунды между каждым вызовом GS V 0, иначе принтер выдаст ошибку и напечатает ерунду. Это делает печать большого изображения очень медленной.
Я также пробовал GS ( L, но не смог заставить его работать. ESC * почти работает, печатает очень быстро, проблема в том, что моя картинка обрезана белыми полосами (см.: https://imgur.com/zYnPuZb) и случайным текстом и я не знаю, что делаю не так, не могу получить GS D. для работы все.
Как правильно напечатать большое растровое изображение за разумное время?
РЕДАКТИРОВАТЬ: я попытался адаптировать код и создать оболочка для GS (команды L 65/67/69. Но когда я использую ее, светодиод ошибки моего принтера становится красным, и ничего не печатается. Вот мой код:
import java.io.ByteArrayOutputStream;
/**
* Implements function GS ( L #65: Delete all NV graphics data, function
* GS ( L #67: Define the NV graphics data (raster format), and function
* GS ( L #69: Print the specified NV graphics.
*
* @see Epson: Paper Roll/Cut Sheet Printers, ESC/POS Application Programming
* Guide, pp. 333, 335, 345
*/
public class NvGraphicsImageWrapper implements EscPosConst, ImageWrapperInterface{
/**
* Values for Raster Bit Image mode.
* @see #setGraphicsImageBxBy(GraphicsImageBxBy)
*/
public enum GraphicsImageBxBy {
Normal_Default(1,1),
DoubleWidth(2,1),
DoubleHeight(1,2),
Quadruple(2, 2);
public int bx;
public int by;
private GraphicsImageBxBy(int bx, int by){
this.bx = bx;
this.by = by;
}
}
protected GraphicsImageBxBy graphicsImageBxBy;
public NvGraphicsImageWrapper() {
graphicsImageBxBy = GraphicsImageBxBy.Normal_Default;
}
/**
* Set values of Bx and By referring to the image size.
*
* @param graphicsImageBxBy values used by function 112
* @return this object
* @see #getBytes(EscPosImage)
*/
public NvGraphicsImageWrapper setGraphicsImageBxBy(final GraphicsImageBxBy graphicsImageBxBy) {
this.graphicsImageBxBy = graphicsImageBxBy;
return this;
}
/**
* Delete all NV graphics data.
* @see p.333
*/
private void getBytesFunction65(final ByteArrayOutputStream bytes) {
final int pL = 5;
final int pH = 0;
final int m = 48;
final int fn = 65;
final int d1 = 67;
final int d2 = 76;
final int d3 = 82;
bytes.write(GS);
bytes.write('(');
bytes.write('L');
bytes.write(pL);
bytes.write(pH);
bytes.write(m);
bytes.write(fn);
bytes.write(d1);
bytes.write(d2);
bytes.write(d3);
}
/**
* Define the NV graphics data (raster format).
* @see p.335
*/
private void getBytesFunction67(final ByteArrayOutputStream bytes, final EscPosImage image, final int kc1, final int kc2) {
/**
* Number of parameters (bytes) AFTER pH.
*/
final int paramSize = image.getRasterSizeInBytes() + 11;
final int pL = paramSize & 0xFF;
final int pH = (paramSize & 0xFF00) >> 8;
final int m = 48;
final int fn = 67;
final int a = 48;
final int b = 1;
// Bits in horizontal direction for the bit image
final int horizontalBits = image.getWidthOfImageInBits();
final int xL = horizontalBits & 0xFF;
final int xH = (horizontalBits & 0xFF00) >> 8;
// Bits in vertical direction for the bit image
final int verticalBits = image.getHeightOfImageInBits();
final int yL = verticalBits & 0xFF;
final int yH = (verticalBits & 0xFF00) >> 8;
final int c = 49; // 49 = monochrome
final byte [] rasterBytes = image.getRasterBytes().toByteArray();
bytes.write(GS);
bytes.write('(');
bytes.write('L');
bytes.write(pL);
bytes.write(pH);
bytes.write(m);
bytes.write(fn);
bytes.write(a);
bytes.write(kc1);
bytes.write(kc2);
bytes.write(b);
bytes.write(xL);
bytes.write(xH);
bytes.write(yL);
bytes.write(yH);
bytes.write(c);
// Write raster bytes
bytes.write(rasterBytes, 0, rasterBytes.length);
}
/**
* @see p.326
*/
private void getBytesFunction69(final ByteArrayOutputStream bytes, final int kc1, final int kc2) {
final int pL = 6;
final int pH = 0;
final int m = 48;
final int fn = 69;
final int x = 1;
final int y = 1;
bytes.write(GS);
bytes.write('(');
bytes.write('L');
bytes.write(pL);
bytes.write(pH);
bytes.write(m);
bytes.write(fn);
bytes.write(kc1);
bytes.write(kc2);
bytes.write(x);
bytes.write(y);
}
@Override
public byte[] getBytes(final EscPosImage image) {
final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
/**
* Codes that will be used to load this data. Range: 32-126.
*/
final int kc1 = 65;
final int kc2 = 66;
getBytesFunction65(bytes);
getBytesFunction67(bytes, image, kc1, kc2);
getBytesFunction69(bytes, kc1, kc2);
return bytes.toByteArray();
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... itmap-fast
ESC/POS быстро печатает большие растровые изображения ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение