【发布时间】:2012-03-11 18:38:36
【问题描述】:
我想将位图打印到移动蓝牙打印机 (Bixolon SPP-R200) - SDK 不提供打印内存中图像的直接方法。所以我想像这样转换位图:
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
到单色位图。我正在使用画布在上面给定的位图上绘制黑色文本,效果很好。但是,当我将上述位图转换为 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”参数传递是否有意义?
- 我想我必须评估每个像素的颜色信息并将其切换为黑色或白色(我会将此值写入一个新的目标字节数组中,最终将传递给打印机)?
- 如何最好地评估每个像素颜色信息以确定它应该是黑色还是白色? (渲染出来的Bitmap是白底黑疼)
这种方法有意义吗?有没有更简单的方法?仅将位图设为黑白是不够的,主要问题是将每个像素的颜色信息减少到一位。
更新
按照 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;
【问题讨论】:
-
我让这个 QA 加星标是因为我正在研究一个类似的概念,即以编程方式将数组操作为单色位图。我有一个问题及其最终答案:stackoverflow.com/questions/17918978/… 如果这对人们有帮助,请给我发电子邮件,我会为这个问题提供合适的答案。
-
为什么要使用 GetPixels 将所有像素加载到单个数组中......然后通过位图嵌套循环再次调用单个 GetPixel 调用(可能是效率最低的方法)?只需遍历原始数组,然后使用 SetPixels 将整个数组推回位图中。
-
@ClintStLaurent 好点 - 代码真的很旧 xD - 我什至认为我们不再以这种形式使用它,但正如你正确指出的那样,它的效率非常低写在那里。随意根据您的建议进行编辑。
标签: android bitmap monochrome