增加/减少android中每个图像通道的速度都会变慢

时间:2012-10-05 05:29:23

标签: android image

我试图为我使用此代码实现一些图像过滤器

@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);

    }

问题是这是是否有其他方法可以做到这一点,或者让它更快..

2 个答案:

答案 0 :(得分:3)

您应该阅读有关使用ColorMatrix的信息。此矩阵可以完全执行您手动执行的操作。在您的情况下,由于您只是为每个组件添加一个常量值,因此矩阵将具有a = g = m = s = 1e = j = o = value,并且矩阵的其余部分将为零。

然后,您可以使用setColorFilter()ColorMatrixColorFilter应用于ImageView。

答案 1 :(得分: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将是最好的方法,即使我认为它完全相同的过滤,它可能更有效。