Android - 如何在蓝牙打印机(X330)上打印图像(光栅)?

时间:2015-08-06 00:10:57

标签: java android printing bluetooth thermal-printer

我有热敏打印机X330,我需要从Android相机打印和图像(位图),但我不能......我总是在打印机中获得符号。

在文件中说:

打印栅格位图

  • Hex 1D 76 30 m xL xH yL yH d1 ... dk
  • 0≤m≤3,48≤m≤51
  • 0≤xL≤255
  • 0≤xH≤255
  • 0≤yL≤255
  • 0≤d≤255
  • k =(xL + xH×256)×(yL + yH×256)(k≠0)
  • xL,xH,为位图选择水平方向的数据位数(xL + xH×256)
  • yL,yH,为位图选择垂直方向的数据位数(yL + yH×256)
  • 如果GS L和GS W设置的打印区域宽度小于最小宽度, 打印区域仅在相关生产线上扩展到最小宽度。 最小宽度表示正常(m = 0,48)和双高(m = 2, 50),双宽(m = 1,49)和四(m = 3,51)模式中的2个点。
  • 读取打印区域外的数据并逐点丢弃
  • 要为光栅位打印后续字符的位置 图像由HT(水平标签),ESC $(设置绝对打印位置)指定, ESC \(设置相对打印位置)和GS L(设置左边距)。如果在的位置 要打印的后续字符不是8的倍数,打印速度 可能会拒绝
  • ESC a(选择对齐)设置对光栅位图像也有效
  • 在宏定义期间收到此命令时,打印机结束宏 定义,并开始执行此命令。这个的定义 命令应该被清除
  • d表示位图数据。将时间设置为1会打印一个点并将其设置为0 不打印点。

我知道位图需要转换,但我无法获得正确的格式。

有人可以帮助我!!!

提前致谢

1 个答案:

答案 0 :(得分:1)

我不久前在这方面挣扎,最终让它发挥作用。我的热敏打印机与您使用的热敏打印机不同,但原理应保持不变。所以我的打印机通过USB工作,这是我发送到打印机的图像打印。

byte[] rasterImage = {0x1D, 0x76, 0x30, 0x30, 0x20, 0x00, 0x00, 0x01};

File file = new File("/mnt/sdcard/1.bmp");
int size = (int) file.length();
bitmapdata = new byte[size];
try
{
    BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file));
    buf.read(bitmapdata, 0, bitmapdata.length);
    buf.close();
} catch (FileNotFoundException e)
{

} catch (IOException e)
{

}

connection.bulkTransfer(endpoint, rasterImage, rasterImage.length, TIMEOUT);
connection.bulkTransfer(endpoint, bitmapdata, bitmapdata.length, TIMEOUT);

rasterImage基本上是告诉打印机所需的十六进制数据的设置,而不是我想要打印光栅位图像。然后我从设备的内部存储器中读取照片或图像,并将其转换为字节[]。然后我将rasterImage十六进制数据和bitmapdata发送到打印机。

需要注意的一点是,首先需要将要打印的图像转换为1位深度的单色图像,您可以使用绘画来执行此操作(只需将图像从绘制中保存为单色位图),您需要这样做是因为打印机只能打印一个点或没有点,它不能打印分层图像等。其次,你需要确保图像分辨率是8的倍数,原因是由于xL,xH ,yL和yH计算在我的打印机上,一个只能以字节为单位工作,所以除了8的倍数之外我无法得到任何东西。所以我的图像是256x256。

如果您有成功,请告诉我,如果您需要更多帮助,请告诉我。

我没有包含任何USB代码,只是使用蓝牙连接以类似的方式发送数据。