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

我想将位图打印到移动蓝牙打印机(Bixolon SPP-R200) - SDK不提供打印内存映像的direkt方法。 所以我想这样转换一个Bitmap:

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”参数传递是否合理?
  • 我想我必须评估每个像素的颜色信息,并将其切换为黑色或白色(并且我会将此值写入新的目标字节数组,我将最终传递给打印机)?
  • 如何最好地评估每个像素颜色信息以决定它应该是黑色还是白色? (呈现的位图是在白色背景上的黑色痛苦)
  • 这种方法是否有意义? 有更容易的方法吗? 将位图黑白化是不够的,主要问题是将每个像素的颜色信息减少到一位。

    UPDATE

    正如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。


    好吧,我认为现在很晚才回复这个主题,但我也有时候会回头研究这些东西,并决定构建我自己的库,以便将任何jpg或png图像转换为1bpp .bmp。 大多数需要1bpp图像的打印机都会支持这个图像(在其中一个:)上进行测试)。 在这里您可以找到图书馆以及使用它制作单色单通道图像的测试项目。 随意改变它.. :)

    https://github.com/acdevs/1bpp-monochrome-android

    请享用..!! :)


    与原始位图尺寸完全相同的单色转换不足以进行打印。

    打印机只能以单色方式打印每个“像素”(点),因为每个墨点只有一种颜色,因此它们必须使用的点数要多得多,并且要调整它们的大小,密度......以模拟灰度级的感觉。 这种技术被称为半色调。 您可以看到打印机的分辨率通常至少为600dpi,通常为1200-4800dpi,而显示屏幕通常在200-300ppi之间。

    半色调

    所以你的单色位图应该至少是每边原始分辨率的3倍

    链接地址: http://www.djcxy.com/p/63521.html

    上一篇: Android: Converting a Bitmap to a Monochrome Bitmap (1 Bit per Pixel)

    下一篇: How to convert a Drawable to a Bitmap?