使用 esc/pos 热敏打印机打印真正的自定义尺寸位图 Android
Print real custom size bitmap using esc/pos termal printer Android
我想使用 Datecs Termal 打印机打印 ScrollView。视图是一张票,就像一张购买票。我想在纸上精确测量 300 毫米的高度。
我使用这种方法将 Scrollview 转换为位图:
public static Bitmap getBitmapFromView(View view, int height, int width) {
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Drawable bgDrawable = view.getBackground();
canvas.drawColor(Color.WHITE);
if (bgDrawable != null)
bgDrawable.draw(canvas);
else
canvas.drawColor(Color.WHITE);
view.draw(canvas);
return bitmap;
}
问题是当隐藏或显示文本视图时,更改位图的高度。此外,它还会根据屏幕的密度改变大小。
我想用视图和空白填充 300 毫米的纸。
我尝试了两种解决方案:
-视图高度与 300mm 之间存在差异的行数送纸
-生成位图高度正好是300mm。
我无论如何也做不到。
Datecs sdk 包含此送纸方法:
public void feedPaper(int lines) throws IOException {
if (lines >= 0 && lines <= 255) {
byte[] buf = new byte[]{27, 74, (byte)lines};
synchronized(this) {
this.write(buf);
}
} else {
throw new IllegalArgumentException("The lines is out of range");
}
}
但是我不知道位图的高度、每行的高度和纸张的300mm之间的关系
有人可以帮助我吗?非常感谢!
您的问题包含三个要素:
- 要打印多少位图才能在 300 毫米高处打印。
- 如何将位图设置为该大小
- 如果打印件不够高,如何用正确数量的白色填充打印件space。
制作位图的尺寸
300mm 高打印需要多少像素?
要确定有多少点在纸张上创建特定尺寸的图像(以毫米为单位),您需要知道打印的密度是多少(以 "DPI" 或 "DPMM" 测量) .对于热敏打印机,这不是用户可选择的,您可以在打印机的数据 sheet 中找到该指标。
例如,DPP-250 data sheet 列出了 8x8 DPMM 的密度,这意味着垂直方向每毫米 8 个点,水平方向每毫米 8 个点。
300mm × 8 dots/mm = 2400 dots
在同一台打印机上,打印宽度为 48 毫米(384 点),因此您将旨在生成 384x2400 像素图像以发送到打印机进行 48x300 毫米打印。
在这部分工作之前,您可以从堆栈中删除 Android 和您的打印机驱动程序。独立的命令行工具可以将图像转换为 ESC/POS 代码供您调试,因此请使用笔记本电脑、twg/png2escpos 和连接打印机的 USB 电缆,这是查看不同尺寸图像显示效果的正确方法在您的打印机上。
我不知道这台打印机与您的有多相似,请调整这些数字以匹配您打印机的数据 sheet。
如何将位图设置为该大小
如果 View
制作的 Bitmap
尺寸错误,那么您应该缩放它,或者在后台生成正确尺寸的东西。着重在保持纵横比的同时缩放宽度,然后用白色space填充底部(在图像中,或作为一系列空白行)。
Whosebug 上还有其他答案比我更能解决图像缩放问题,such as this one。
如何用正确的白色填充打印件space
对于填充,使用空行而不是扩展图像是正确的,因为打印空行会更快!
我链接的数据中没有指定默认行间距sheet。如果你想要一个估计值,使用 32 点(4 毫米),但为了获得准确的答案,你需要打印几行下划线并测量它们之间有多少 space。
请注意,并非总是可以将 32 的增量添加到 300 毫米的圆形,因此:
- 用大约正确数量的空白行填充图像,并对近似值感到满意,或者
- 用白色填充图像space 到 32 像素的倍数,然后添加空行。
将图像缩放到 384 像素宽并知道行间距后,这不会在设备之间改变。
例如,要用 32 像素的空白行填充 1234 像素高的图像,为了使其高 2400 像素,您需要大约 36 行:行:
(2400 dots - 1234 dots) ÷ 32 dots/line ≈ 36 lines
同样,这些数字不适用于您的打印机,请根据您自己的数据 sheet 和线高测量值进行调整,如上所述。
我想使用 Datecs Termal 打印机打印 ScrollView。视图是一张票,就像一张购买票。我想在纸上精确测量 300 毫米的高度。 我使用这种方法将 Scrollview 转换为位图:
public static Bitmap getBitmapFromView(View view, int height, int width) {
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Drawable bgDrawable = view.getBackground();
canvas.drawColor(Color.WHITE);
if (bgDrawable != null)
bgDrawable.draw(canvas);
else
canvas.drawColor(Color.WHITE);
view.draw(canvas);
return bitmap;
}
问题是当隐藏或显示文本视图时,更改位图的高度。此外,它还会根据屏幕的密度改变大小。 我想用视图和空白填充 300 毫米的纸。
我尝试了两种解决方案:
-视图高度与 300mm 之间存在差异的行数送纸
-生成位图高度正好是300mm。
我无论如何也做不到。
Datecs sdk 包含此送纸方法:
public void feedPaper(int lines) throws IOException {
if (lines >= 0 && lines <= 255) {
byte[] buf = new byte[]{27, 74, (byte)lines};
synchronized(this) {
this.write(buf);
}
} else {
throw new IllegalArgumentException("The lines is out of range");
}
}
但是我不知道位图的高度、每行的高度和纸张的300mm之间的关系
有人可以帮助我吗?非常感谢!
您的问题包含三个要素:
- 要打印多少位图才能在 300 毫米高处打印。
- 如何将位图设置为该大小
- 如果打印件不够高,如何用正确数量的白色填充打印件space。
制作位图的尺寸
300mm 高打印需要多少像素?
要确定有多少点在纸张上创建特定尺寸的图像(以毫米为单位),您需要知道打印的密度是多少(以 "DPI" 或 "DPMM" 测量) .对于热敏打印机,这不是用户可选择的,您可以在打印机的数据 sheet 中找到该指标。
例如,DPP-250 data sheet 列出了 8x8 DPMM 的密度,这意味着垂直方向每毫米 8 个点,水平方向每毫米 8 个点。
300mm × 8 dots/mm = 2400 dots
在同一台打印机上,打印宽度为 48 毫米(384 点),因此您将旨在生成 384x2400 像素图像以发送到打印机进行 48x300 毫米打印。
在这部分工作之前,您可以从堆栈中删除 Android 和您的打印机驱动程序。独立的命令行工具可以将图像转换为 ESC/POS 代码供您调试,因此请使用笔记本电脑、twg/png2escpos 和连接打印机的 USB 电缆,这是查看不同尺寸图像显示效果的正确方法在您的打印机上。
我不知道这台打印机与您的有多相似,请调整这些数字以匹配您打印机的数据 sheet。
如何将位图设置为该大小
如果 View
制作的 Bitmap
尺寸错误,那么您应该缩放它,或者在后台生成正确尺寸的东西。着重在保持纵横比的同时缩放宽度,然后用白色space填充底部(在图像中,或作为一系列空白行)。
Whosebug 上还有其他答案比我更能解决图像缩放问题,such as this one。
如何用正确的白色填充打印件space
对于填充,使用空行而不是扩展图像是正确的,因为打印空行会更快!
我链接的数据中没有指定默认行间距sheet。如果你想要一个估计值,使用 32 点(4 毫米),但为了获得准确的答案,你需要打印几行下划线并测量它们之间有多少 space。
请注意,并非总是可以将 32 的增量添加到 300 毫米的圆形,因此:
- 用大约正确数量的空白行填充图像,并对近似值感到满意,或者
- 用白色填充图像space 到 32 像素的倍数,然后添加空行。
将图像缩放到 384 像素宽并知道行间距后,这不会在设备之间改变。
例如,要用 32 像素的空白行填充 1234 像素高的图像,为了使其高 2400 像素,您需要大约 36 行:行:
(2400 dots - 1234 dots) ÷ 32 dots/line ≈ 36 lines
同样,这些数字不适用于您的打印机,请根据您自己的数据 sheet 和线高测量值进行调整,如上所述。