Android Bitmap颜色为alpha

时间:2016-03-20 05:01:21

标签: android performance bitmap mask antialiasing

我有一个“多面具”位图,我需要使用其不同颜色的区域来分别屏蔽不同部分与另一个位图。

此代码是一个工作示例,但当然我在边缘上存在锯齿问题

    // Bitmap bmpsrc    - source bitmap to be masked
    // Bitmap multimask - contains the colored masks
    // Bitmap mask      - selective mask depending on color range
    int w=bmpsrc.getWidth();
    int h=bmpsrc.getHeight();
    Bitmap mask=Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

    // rgb color range example, use dark gray 0x20 only
    int rgb_min=0x00202020;
    int rgb_max=0x00202020;

    int r_min=rgb_min&0x00FF0000;
    int r_max=rgb_max&0x00FF0000;
    int g_min=rgb_min&0x0000FF00;
    int g_max=rgb_max&0x0000FF00;
    int b_min=rgb_min&0x000000FF;
    int b_max=rgb_max&0x000000FF;
    for (int x = 0; x < w; x++) {
        for (int y = 0; y < h; y++) {
            int color = multimask.getPixel(x, y);
            int a=color>>>24;       // discard sign (when alpha>0x7f color is negative!)
            int r=color&0x00ff0000;
            int g=color&0x0000ff00;
            int b=color&0x000000ff;

            if(
                    a>0&&                   // check alpha>0
                    r>=r_min&&r<=r_max&&    // check r in range
                    g>=g_min&&g<=g_max&&    // check g in range
                    b>=b_min&&b<=b_max      // check b in range
            ) {
                mask.setPixel(x, y, a<<24|0x00ff0000); // outputs mask
                //mask.setPixel(x, y, a<<24|(0x00ffffff&bmpsrc.getPixel(x,y))); // outputs masked image
            } else {
                mask.setPixel(x, y, 0x00000000);
            }
        }
    }

enter image description here
“多面具”图像

enter image description here
掩码示例,0xff202020颜色提取(别名)

enter image description here
蒙面图像,别名!

我的问题:

  1. 如果有可能,如何使用ColorFilter(ColorMatrix或PorterDuff)实现此结果?
  2. ColorFilter与getPixel / setPixel,性能如何?
  3. 有人建议不要使用getPixel(),但我需要逐个检查像素,我该如何使用getPixels()
  4. 关于边缘上的锯齿问题的任何想法?

0 个答案:

没有答案