1

私はこのコードを使用するいくつかの画像フィルターを実装しようとしています

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        imageView=(ImageView) findViewById(R.id.imgView);
        bgr = BitmapFactory.decodeResource(getResources(), R.drawable.test02);


        int A, R, G, B;
        int pixel;

        // scan through all pixels
        for(int x = 0; x < bgr.getWidth(); ++x) 
        {
            for(int y = 0; y < bgr.getHeight(); ++y) 
            {
                // get pixel color
                pixel = bgr.getPixel(x, y);
                A = Color.alpha(pixel);
                R = Color.red(pixel);
                G = Color.green(pixel);
                B = Color.blue(pixel);

                // increase/decrease each channel
                R += value;
                if(R > 255) { R = 255; }
                else if(R < 0) { R = 0; }

                G += value;
                if(G > 255) { G = 255; }
                else if(G < 0) { G = 0; }

                B += value;
                if(B > 255) { B = 255; }
                else if(B < 0) { B = 0; }

                // apply new pixel color to output bitmap
                bgr.setPixel(x, y, Color.argb(A, R, G, B));
            }
            System.out.println("x");
        }

        imageView.setImageBitmap(bgr);

    }

問題は、これが遅くなることであり、他の方法でそれを行うか、または速くすることです..

4

2 に答える 2

3

の使用についてよく読んでくださいColorMatrix。このマトリックスは、手動で実行している操作を正確に実行できます。あなたの場合、各コンポーネントに定数値を追加するだけなので、マトリックスはa = g = m = s = 1、 、およびe = j = o = valueになり、残りのマトリックスはゼロになります。

次に、を使用して ImageViewsetColorFilter()に適用できます。ColorMatrixColorFilter

于 2012-10-05T06:44:17.437 に答える
0

ビット単位の操作を使用すると、より高速になる可能性がありますか?

for(int x = 0; x < bgr.getWidth(); ++x) 
    {
        for(int y = 0; y < bgr.getHeight(); ++y) 
        {
            // get pixel color
            pixel = bgr.getPixel(x, y);
    int alpha = (pixel & 0xff000000) >> 24;
    int R = (pixel & 0x00ff0000) >> 16;
        int G = (pixel & 0x0000ff00) >> 8;
        int B = (pixel & 0x000000ff);

            // increase/decrease each channel
            R += value;
            if(R > 255) { R = 255; }
            else if(R < 0) { R = 0; }

            G += value;
            if(G > 255) { G = 255; }
            else if(G < 0) { G = 0; }

            B += value;
            if(B > 255) { B = 255; }
            else if(B < 0) { B = 0; }

            // apply new pixel color to output bitmap
            bgr.setPixel(x, y, (alpha << 24) + (red << 16) + (green << 8) + blue);
        }

それも遅すぎることが判明した場合は、ColorMatrixを使用するのが最善の方法です。まったく同じフィルタリングを行うと仮定しても、おそらくより効率的です。

于 2012-10-05T07:34:25.603 に答える