如何在Android的蓝牙打印机上打印图像?

我必须在热蓝牙打印机上打印一些数据,我正在这样做:


String message="abcdef any message 12345";

byte[] send;

send = message.getBytes();

mService.write(send);

它适用于文本,但不适用于图像。我想我需要获取byte[]图像数据。我尝试通过这种方式获取图像数据:


Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.qrcode);

ByteArrayOutputStream stream=new ByteArrayOutputStream();

bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);

byte[] image=stream.toByteArray();

不幸的是,打印机打印了许多奇怪的字符(大约50厘米的纸张)。我不知道如何打印图像。


我想尝试获取位图的像素,然后将其转换为a byte[]并发送,但是我不知道该怎么做。


谢谢


米琪卡哇伊
浏览 454回答 3
3回答

慕工程0101907

我也尝试过此方法,得到了自己的解决方案,我想我已经弄清楚了SELECT_BIT_IMAGE_MODE命令的工作原理。该命令public static byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, 255, 3};在类PrinterCommands是POS命令图像打印。前两个是非常标准的,接下来的三个确定要打印图像的模式和尺寸。为了这个解决方案,我们假设第二个元素(33,我们的索引为零)始终为33。该byte []的最后两个元素是指您要打印的图像的Width(以像素为单位)属性,元素3有时称为nL,元素4有时称为nH。他们实际上都指的宽度,nL是Low Byte同时nH是High Byte。这意味着我们最多可以拥有一个宽度为1111 1111 1111 1111b(二进制)的图像,该宽度为65535d(十进制),尽管我尚未尝试过。如果未将nL或nH设置为正确的值,则将随图像一起打印垃圾字符。某种程度上,Android文档告诉我们字节数组中字节值的限制为-128和+127,当我尝试输入255时,Eclipse要求我将其转换为Byte。无论如何,回到nL和nW,对于您的情况,您有一个宽度为576的图像,如果将576转换为Binary,我们将得到两个字节,如下所示:0000 0010 0100 0000在这种情况下,低字节为0100 0000,高字节为0000 0010。将其转换回十进制,我们得到nL = 64和nH = 2。在我的情况下,我打印了一个宽度为330px的图像,将330转换为二进制,我们得到:0000 0001 0100 1010现在,在这种情况下,低字节为0100 1010,高字节为0000 0001。转换为十进制,我们得到nL = 74和nH = 1。
打开App,查看更多内容
随时随地看视频慕课网APP