当前位置: 首页 > 面试题库 >

Android:将位图转换为单色位图(每像素1位)

林炫明
2023-03-14
问题内容

我想将位图打印到移动蓝牙打印机(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.html" target="_blank">setSaturation(0);
Paint paint = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(ma));
canvas.drawBitmap(bmpSrc, 0, 0, paint);

这简化了颜色->单色转换。现在,您可以执行getPixels()并读取每个32位像素的最低字节。如果小于128,则为0,否则为1。



 类似资料:
  • 问题内容: 我有一个Android应用程序,可将图像加载为位图并将其显示在ImageView中。问题在于图像似乎具有透明背景;这会导致图像上的某些黑色文本在黑色背景下消​​失。 如果将ImageView背景设置为白色,则可以完成这种工作,但是在图像上会出现丑陋的大边框,将其拉伸以适合父对象(实际图像在中间缩放)。 所以-我想将位图中的透明像素转换为纯色-但我不知道该怎么做! 任何帮助将不胜感激!

  • 问题内容: 我正在尝试从相机预览中捕获图像并在其上进行一些绘制。问题是,我只有大约3-4 fps的绘图,并且一半的帧处理时间是从摄像机预览接收和解码NV21图像并将其转换为 位图 。我有一个执行此任务的代码,是在另一个堆栈问题上找到的。它似乎并不快,但我不知道如何优化它。在Samsung Note 3(图像尺寸1920x1080)上大约需要100-150毫秒。我怎样才能使其更快地工作? 代码: 图

  • 我试图将YUV_420_888图像转换为位图,来自camera2预览。但是输出图像的颜色不正确。 请让我知道如果有人能发现转换的问题:

  • 我想把openCV Mat文件转换成GDI+位图图像。我找不到任何关于如何做到这一点的信息?

  • 问题内容: 我将输入流从Web转换为位图时遇到问题。仅当输入图像类型为.BMP(位图)时,才会出现问题。在这种情况下: bitmapFactory.decodeStream返回null 。 有什么提示如何解决此问题,或者应该在哪里继续调试? 平台:Android(蜂窝) 问题答案: 谢谢@Amir指出日志。发现了一条线: 这似乎是一个普遍的问题。进行搜索后,我找到了解决方案。 我以前的代码: 起作

  • 问题内容: 我正在使用Universal-Image- Loader,并且有此功能可以从SD卡访问图像的文件缓存。但是我不知道如何将返回的文件缓存转换为位图。基本上,我只是想将位图分配给ImageView。 错误: “ ImageView类型的setImageBitmap(Bitmap)方法不适用于参数(文件)” 问题答案: 您应该可以使用: