如何在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[]并发送,但是我不知道该怎么做。

谢谢

更新:

经过这么长时间,我正在执行此操作:我有一个名为print_image(String file)的方法,该方法获取要打印的图像的路径:

private void print_image(String file) {

File fl = new File(file);

if (fl.exists()) {

Bitmap bmp = BitmapFactory.decodeFile(file);

convertBitmap(bmp);

mService.write(PrinterCommands.SET_LINE_SPACING_24);

int offset = 0;

while (offset < bmp.getHeight()) {

mService.write(PrinterCommands.SELECT_BIT_IMAGE_MODE);

for (int x = 0; x < bmp.getWidth(); ++x) {

for (int k = 0; k < 3; ++k) {

byte slice = 0;

for (int b = 0; b < 8; ++b) {

int y = (((offset / 8) + k) * 8) + b;

int i = (y * bmp.getWidth()) + x;

boolean v = false;

if (i < dots.length()) {

v = dots.get(i);

}

slice |= (byte) ((v ? 1 : 0) << (7 - b));

}

mService.write(slice);

}

}

offset += 24;

mService.write(PrinterCommands.FEED_LINE);

mService.write(PrinterCommands.FEED_LINE);

mService.write(PrinterCommands.FEED_LINE);

mService.write(PrinterCommands.FEED_LINE);

mService.write(PrinterCommands.FEED_LINE);

mService.write(PrinterCommands.FEED_LINE);

}

mService.write(PrinterCommands.SET_LINE_SPACING_30);

} else {

Toast.makeText(this, "file doesn't exists", Toast.LENGTH_SHORT)

.show();

}

}

这是PrinterCommands类:

public class PrinterCommands {

public static final byte[] INIT = {27, 64};

public static byte[] FEED_LINE = {10};

public static byte[] SELECT_FONT_A = {27, 33, 0};

public static byte[] SET_BAR_CODE_HEIGHT = {29, 104, 100};

public static byte[] PRINT_BAR_CODE_1 = {29, 107, 2};

public static byte[] SEND_NULL_BYTE = {0x00};

public static byte[] SELECT_PRINT_SHEET = {0x1B, 0x63, 0x30, 0x02};

public static byte[] FEED_PAPER_AND_CUT = {0x1D, 0x56, 66, 0x00};

public static byte[] SELECT_CYRILLIC_CHARACTER_CODE_TABLE = {0x1B, 0x74, 0x11};

public static byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, -128, 0};

public static byte[] SET_LINE_SPACING_24 = {0x1B, 0x33, 24};

public static byte[] SET_LINE_SPACING_30 = {0x1B, 0x33, 30};

public static byte[] TRANSMIT_DLE_PRINTER_STATUS = {0x10, 0x04, 0x01};

public static byte[] TRANSMIT_DLE_OFFLINE_PRINTER_STATUS = {0x10, 0x04, 0x02};

public static byte[] TRANSMIT_DLE_ERROR_STATUS = {0x10, 0x04, 0x03};

public static byte[] TRANSMIT_DLE_ROLL_PAPER_SENSOR_STATUS = {0x10, 0x04, 0x04};

}

如在print_image方法中所见,我正在调用一个名为convertBitmap的方法,并即时发送一个位图,这是代码:

   public String convertBitmap(Bitmap inputBitmap) {

mWidth = inputBitmap.getWidth();

mHeight = inputBitmap.getHeight();

convertArgbToGrayscale(inputBitmap, mWidth, mHeight);

mStatus = "ok";

return mStatus;

}

private void convertArgbToGrayscale(Bitmap bmpOriginal, int width,

int height) {

int pixel;

int k = 0;

int B = 0, G = 0, R = 0;

dots = new BitSet();

try {

for (int x = 0; x < height; x++) {

for (int y = 0; y < width; y++) {

// get one pixel color

pixel = bmpOriginal.getPixel(y, x);

// retrieve color of all channels

R = Color.red(pixel);

G = Color.green(pixel);

B = Color.blue(pixel);

// take conversion up to one single value by calculating

// pixel intensity.

R = G = B = (int) (0.299 * R + 0.587 * G + 0.114 * B);

// set bit into bitset, by calculating the pixel's luma

if (R < 55) {

dots.set(k);//this is the bitset that i'm printing

}

k++;

}

}

} catch (Exception e) {

// TODO: handle exception

Log.e(TAG, e.toString());

}

}

这是我正在使用的打印机,分辨率:8点/毫米,576点/线

这就是我想要做的(我使用同一台打印机,但是使用了从Play商店下载的应用程序) 我要打印的图像

这就是我现在要得到的 我的印刷尝试

可以看到图像的一小部分,所以我认为我可以打印图像了。

这是转换后的图像(我正在使用上层代码对其进行转换):

因此,答案是:我做错了什么?,我认为该命令中存在错误:

  public static byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, -128, 0};

但是,如何计算图像的正确值呢?谢谢

回答:

解决了!我在初始化打印机时做错了…核心方法是:

 public static byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33, 255, 3};

因此,通过这种方式可以完全打印出图像

以上是 如何在Android的蓝牙打印机上打印图像? 的全部内容, 来源链接: utcz.com/qa/425631.html

回到顶部