当前位置: 首页 > 知识库问答 >
问题:

java - 安卓连接蓝牙打印机如何打印图片bitmap?

姜德泽
2023-07-18

打印机打印bitmap的指令是 BITMAP x,y,width,height,mode,bitmap data, 那么将图片转为bitmap后, 如何使用呢

共有1个答案

昝枫
2023-07-18
BluetoothDevice device = ... // 获取到的蓝牙设备BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); // 创建一个BluetoothSocket来连接设备socket.connect(); // 连接到设备OutputStream outStream = socket.getOutputStream(); // 获取OutputStream来发送数据Bitmap bitmap = ... // 你的Bitmap对象ByteArrayOutputStream blob = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.PNG, 0 /* Ignored for PNGs */, blob);byte[] bitmapdata = blob.toByteArray();// 构造打印指令String command = String.format("BITMAP 0,0,%d,%d,1,", bitmap.getWidth(), bitmap.getHeight());byte[] commandData = command.getBytes();// 发送打印指令outStream.write(commandData);outStream.write(bitmapdata);

在打印图片时候,要把Bitmap转换为打印机可以识别的数据格式

把Bitmap转换为点阵图数据:

public byte[] bitmapToBytes(Bitmap bitmap) {    int width = bitmap.getWidth();    int height = bitmap.getHeight();    byte[] imgbuf = new byte[width * height / 8];    int[] pixels = new int[width * height];    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);    for (int y = 0; y < height; y++) {        for (int x = 0; x < width; x++) {            int pixel = pixels[y * width + x];            if (Color.red(pixel) == 0) {                imgbuf[(y * width + x) / 8] |= (0x80 >> (x % 8));            }        }    }    return imgbuf;}

然后,用ESC/POS指令来打印点阵图:

public void printBitmap(OutputStream outStream, Bitmap bitmap) throws IOException {    byte[] imgbuf = bitmapToBytes(bitmap);    int width = bitmap.getWidth();    int height = bitmap.getHeight();    byte[] command = new byte[] { 0x1D, 0x76, 0x30, 0x00,            (byte) (width / 8), (byte) (width / 8 >> 8),            (byte) (height), (byte) (height >> 8) };    outStream.write(command);    outStream.write(imgbuf);    outStream.write(new byte[] { 0x0A, 0x0A });}

最后,用这个方法:

BluetoothDevice device = ... // 获取蓝牙设备BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); // 创建一个BluetoothSocket来连接设备socket.connect(); // 连接到设备OutputStream outStream = socket.getOutputStream(); // 获取OutputStream来发送数据Bitmap bitmap = ... // Bitmap对象printBitmap(outStream, bitmap);
 类似资料:
  • 问题内容: 我必须在热蓝牙打印机上打印一些数据,我正在这样做: 它适用于文本,但不适用于图像。我想我需要获取byte[]图像数据。我尝试通过这种方式获取图像数据: 不幸的是,打印机打印了许多奇怪的字符(大约50厘米的纸张)。我不知道如何打印图像。 我想尝试获取位图的像素,然后将其转换为a byte[]并发送,但是我不知道该怎么做。 谢谢 更新: 经过这么长时间,我正在执行此操作:我有一个名为pri

  • 我正在开发通过蓝牙与打印机连接并打印一些文本的应用程序。我可以通过蓝牙连接打印机,然后从BluetoothSocket获取输出流并写一些文本。但它不会用打印机打印任何东西...我仔细检查过,没有例外。请帮帮我我在代码中做错了什么???我使用佳能MX430打印机进行测试...这是我的代码

  • 我必须为Android平板电脑开发一个应用程序,要求将文件打印到蓝牙打印机上。 通过蓝牙打印是我应用程序最重要的功能之一。 我尝试了这个项目和这个项目。 它不工作,也不报告任何错误-不要打印。 蓝牙打印机有什么建议吗?

  • 大多数相关的答案和谷歌都包含了关于这个话题的相当古老的贡献。因此,我正在寻找一种方法,使我的Android应用程序打印收据(58毫米宽)通过蓝牙热收据打印机。是否有必要使用带有第三方API的打印机?我想买一台普通的蓝牙打印机,它可以连接到我的设备上,并使用默认的Android打印管理器为收据进行布局。有可能吗?有样本、文档或教程吗?会很感激的。提前致谢

  • 我必须用热敏打印机打印发票收据。我用Zjiang热敏打印机打印收据。他们还提供了手册和演示项目。在演示项目中,他们使用一个库“btsdk.jar”来实现连接和打印。 我已经成功地建立了打印机和android设备之间的连接。但是没有关于文本对齐(中心、左、右)&单元格宽度、高度的指导原则。 我试过了。它只通过改变format2变量来改变文本高度。 打印信息- 发票收据

  • 问题内容: Java中有一种简单的方法可以执行以下操作吗? 连接到打印机(将是本地打印机,并且是连接到机器的唯一打印机)。 在2个不同的打印机纸盘中打印2页的页面。 获取当前的打印队列计数,即我有100项要打印的项目和34项当前已打印,则打印机队列现在应显示为66。 问题答案: 一些快速提示: 从Java打印:请参阅基本打印程序 打印作业的状态:您可以使用PrintJobListener获得一些有