4

Bitmapを取り、それを厳密な白黒画像 (グレーの色合いなし) に強制するメソッドを作成しようとしています。

最初にビットマップを、次を使用してグレースケールにするメソッドに渡します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()

which を使用getPixels()すると、すべてのピクセルの多次元配列が返されます。この配列でローカルに操作を行ってから、 を使用setPixels()して変更された配列を元に戻します。これにより、大幅に高速化されます。

于 2013-02-14T23:08:25.500 に答える
1

バイト配列に変換するようなことを試しましたか(ここの答えを参照)?

そして、私がこれを調べていると、ビットマップ処理に関する開発者向けのAndroidリファレンスも役立つかもしれません。

于 2013-02-14T19:52:13.213 に答える