我想将一个位图打印到一台移动蓝牙打印机(Bixolon SPP-R200)上 - SDK没有提供直接打印内存中图像的方法。因此我考虑像这样转换位图:
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
将位图转换为单色位图。我正在使用画布在上面绘制黑色文本,这很有效。然而,当我将上述位图转换为字节数组时,打印机似乎无法处理这些字节。我怀疑我需要一个每个像素有一个比特的数组(一个像素可以是白色=1或黑色=0)。
由于似乎没有方便的、开箱即用的方法来实现这一点,我曾想过使用:
bitmap.getPixels(pixels, offset, stride, x, y, width, height)
要获取像素值。我认为,我需要按照以下方式使用它:
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int [] pixels = new int [width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
不过,我对以下几点不太确定:
- 在getPixels中,直接将宽度作为“ Stride”参数传递是否有意义?
- 我想我必须评估每个像素的颜色信息,并将其切换为黑色或白色(然后将此值写入新的目标字节数组中,最终将其传递给打印机)?
- 如何最好地评估每个像素的颜色信息,以便决定它应该是黑色还是白色?(渲染的位图是白色背景上的黑色痛点)
这种方法有意义吗?有更简单的方法吗?仅将位图变成黑白是不够的,主要问题是将每个像素的颜色信息减少为一位。
更新
如Reuben所建议的那样,我将先将位图转换为单色位图。然后我会遍历每个像素:
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
// Iterate over height
for (int y = 0; y < height; y++) {
int offset = y * height;
// Iterate over width
for (int x = 0; x < width; x++) {
int pixel = bitmap.getPixel(x, y);
}
}
现在Reuben建议“读取每个32位像素的最低字节”-这与我关于如何评估像素颜色的问题有关。在这方面,我最后一个问题是:我是否可以通过简单地执行以下操作来获取最低字节:
// Using the pixel from bitmap.getPixel(x,y)
int lowestByte = pixel & 0xff;