Android:将位图转换为单色位图(每像素1位)
我想将位图打印到移动蓝牙打印机(Bixolon SPP-R200)-SDK不提供直接方法来打印内存图像。所以我想到了这样转换一个位图:
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
到单色位图。我正在使用Canvas在给定的位图上方绘制黑色文本,效果很好。但是,当我将上述位图转换为ByteArray时,打印机似乎无法处理这些字节。我怀疑我需要一个每个像素一位的数组(一个像素将是白色= 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;
回答:
您可以使用ColorMatrix将图像转换为单色32bpp。
Bitmap bmpMonochrome = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bmpMonochrome);
ColorMatrix ma = new ColorMatrix();
ma.setSaturation(0);
Paint paint = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(ma));
canvas.drawBitmap(bmpSrc, 0, 0, paint);
这简化了颜色->单色转换。现在,您可以执行getPixels()并读取每个32位像素的最低字节。如果小于128,则为0,否则为1。
以上是 Android:将位图转换为单色位图(每像素1位) 的全部内容, 来源链接: utcz.com/qa/416753.html