我想将Bitmap打印到移动蓝牙打印机(Bixolon SPP-R200) - SDK没有提供direkt方法来打印内存中的图像。所以我考虑转换像这样的位图:
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
到单色位图。我使用Canvas在上面给出的Bitmap上绘制黑色文本,效果很好。但是,当我将上面的位图转换为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);
然而 - 我不确定一些事情:
这种方法有意义吗?有没有更简单的方法?仅仅使位图变为黑色并且不足以使位图变黑。白色,主要问题是将每个像素的颜色信息减少为一位。
更新
根据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建议&#34;读取每个32位像素的最低字节&#34; - 这与我关于如何评估像素颜色的问题有关。我在这方面的最后一个问题:我是否通过这样做得到最低字节:
// Using the pixel from bitmap.getPixel(x,y)
int lowestByte = pixel & 0xff;
答案 0 :(得分:25)
您可以使用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位像素的最低字节。如果它是&lt; 128则是0,否则它是1。
答案 1 :(得分:10)
嗯,我觉得现在回复这个帖子已经很晚了,但我有时也会回来处理这个问题并决定建立自己的库,将任何jpg或png图像转换为1bpp .bmp。大多数需要1bpp图像的打印机都支持这个图像(在其中一个上测试:))。 在这里,您可以找到库以及使用它来制作单色单通道图像的测试项目。随意改变它.. :)
https://github.com/acdevs/1bpp-monochrome-android
享受.. !! :)
答案 2 :(得分:5)
转换为与原始位图尺寸完全相同的单色不够进行打印。
打印机只能将每个“像素”(点)打印为单色,因为每个墨点只有1种颜色,因此它们必须使用足够多的点并调整它们的大小,密度...以模拟灰度级感觉。这种技术称为halftoning。您可以看到打印机的分辨率通常至少为600dpi,通常为1200-4800dpi,而显示屏的分辨率通常为200-300ppi。
因此,您的单色位图应该至少3倍每侧的原始分辨率。
答案 3 :(得分:5)
您应该将每个像素转换为HSV空间并使用该值来确定目标图像上的像素是黑色还是白色:
m_statetent