4

我正在尝试编写一种方法,该方法将采用 aBitmap并将其强制为严格的黑白图像(没有灰色阴影)。

我首先将位图传递给使用以下方法使其灰度化的方法colormatrix

public Bitmap toGrayscale(Bitmap bmpOriginal)
{        
    int width, height;
    height = bmpOriginal.getHeight();
    width = bmpOriginal.getWidth();    

    Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    Canvas c = new Canvas(bmpGrayscale);
    Paint paint = new Paint();
    ColorMatrix cm = new ColorMatrix();
    cm.setSaturation(0);

    ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
    paint.setColorFilter(f);

    c.drawBitmap(bmpOriginal, 0, 0, paint);
    return bmpGrayscale;
}

效果很好,速度很快..

然后我将它传递给另一种方法以将灰度图像强制为 2 色图像(黑色和白色),这种方法有效,但显然它正在遍历每个像素,这需要很长时间:

public Bitmap toStrictBlackWhite(Bitmap bmp){
        Bitmap imageOut = bmp;
        int tempColorRed;
        for(int y=0; y<bmp.getHeight(); y++){
            for(int x=0; x<bmp.getWidth(); x++){
                tempColorRed = Color.red(imageOut.getPixel(x,y));
                Log.v(TAG, "COLOR: "+tempColorRed);

                if(imageOut.getPixel(x,y) < 127){
                    imageOut.setPixel(x, y, 0xffffff);
                }
                else{
                    imageOut.setPixel(x, y, 0x000000);
                }               
            }
        } 
        return imageOut;
    }

有人知道更快更有效的方法吗?

4

2 回答 2

3

不要使用getPixel()setPixel()

使用getPixels()它将返回所有像素的多维数组。在此数组上本地执行您的操作,然后用于setPixels()设置修改后的数组。这将明显更快。

于 2013-02-14T23:08:25.500 回答
1

您是否尝试过将其转换为字节数组(请参阅此处的答案)?

而且,当我对此进行研究时,针对开发人员的关于位图处理的 Android 参考也可能对您有所帮助。

于 2013-02-14T19:52:13.213 回答