使位图中的特定颜色透明

时间:2010-10-08 10:30:11

标签: android

我有一个Android应用程序在另一个图像上显示图像,这样第二个图像的白色就是透明的。为此,我使用了两个ImageView s,将原始图像覆盖为bitmap1,将图像透明为bitmap2。当我运行它时,我在setPixel方法中得到了一些例外。

这是我的代码:

Bitmap bitmap2 = null;
int width = imViewOverLay.getWidth();
int height = imViewOverLay.getHeight();
for(int x = 0; x < width; x++)
{
    for(int y = 0; y < height; y++)
    {
        if(bitMap1.getPixel(x, y) == Color.WHITE)
        {
            bitmap2.setPixel(x, y, Color.TRANSPARENT);
        }
        else
        {
            bitmap2.setPixel(x, y, bitMap1.getPixel(x, y));
        }
    }
}

imViewOverLay是叠加图片的ImageView。知道上面的代码可能出了什么问题吗?

2 个答案:

答案 0 :(得分:2)

最明显的错误是您没有创建bitmap2 - 除非您当然没有发布所有代码。

您声明并将其设置为null,但在您尝试拨打bitmap2.setPixel之前不要执行任何其他操作。

答案 1 :(得分:2)

我认为你需要让它变得可变 Loading a resource to a mutable bitmap

我做了这个

 BitmapFactory.Options bitopt=new BitmapFactory.Options();

 bitopt.inMutable=true;

 mSnareBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.snare, bitopt);

另外,我发现我需要将alpha设置为小于255的值才能使图像呈现透明背景。

 mPaint.setAlpha(250);
 canvas.drawBitmap(mSnareBitmap, 0, 30, mPaint);
顺便说一句,使用白色作为透明色并不是一个好主意,因为你会在不透明物体的边缘出现锯齿问题。我使用绿色是因为我的叠加图像没有任何绿色(如电影中的绿色屏幕)然后我可以删除循环内的绿色并根据绿色值的倒数设置alpha值。

private void loadBitmapAndSetAlpha(int evtype, int id) {

        BitmapFactory.Options bitopt=new BitmapFactory.Options();
        bitopt.inMutable=true;
        mOverlayBitmap[evtype] = BitmapFactory.decodeResource(getResources(), id, bitopt);
        Bitmap bm = mOverlayBitmap[evtype];

        int width = bm.getWidth();
        int height = bm.getHeight();
        for(int x = 0; x < width; x++)
        {
            for(int y = 0; y < height; y++)
            {
                int argb = bm.getPixel(x, y);
                int green = (argb&0x0000ff00)>>8;
                if(green>0)
                {
                    int a = green;
                    a = (~green)&0xff;
                    argb &= 0x000000ff; // save only blue
                    argb |= a;      // put alpha back in
                    bm.setPixel(x, y, argb);
                }
            }
        }

    }