如何将alpha通道添加到位图

时间:2012-03-27 14:06:32

标签: android android-widget

我的代码如下。它与此问题的解决方案中的代码完全相同:Make certain area of bitmap transparent on touch

和其他许多人一样,我对这段代码也有同样的问题:圈子变黑了。

我使用PNG文件作为我的叠加层,此文件没有任何透明区域。但是,只要我在Photoshop中向PNG添加任意透明区域,代码就会开始工作,并且圆圈显示为透明。

显然,图像有一些东西,它的透明度如何设定,但我不知道是什么。我需要使用没有任何透明区域的PNG作为我的叠加层。

任何建议?

编辑:好的代码不能取决于叠加图像是否具有透明度,我正在寻找一种方法来处理任何类型的图像作为我的叠加层,无论是JPG,PNG还是别的。

编辑2:如果我在复制位图时使用Config.ARGB_4444,则会创建Alpha通道,但此格式会降低图像质量。 API级别11及更高级别的API Bitmap.setHasAlpha()但到目前为止我使用的是10级。


public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new TouchView(this));
    }

    class TouchView extends View {
        Bitmap bgr;
        Bitmap overlayDefault;
        Bitmap overlay;
        Paint pTouch;
        int X = 100;
        int Y = 100;
        Canvas c2;

        public TouchView(Context context) {
            super(context);
            bgr = BitmapFactory.decodeResource(
                    getResources(),
                    R.drawable.background);
            overlay = BitmapFactory.decodeResource(
                    getResources(),
                    R.drawable.foreground)
                      .copy(Config.ARGB_8888, true);
            c2 = new Canvas(overlay);
            pTouch = new Paint(Paint.ANTI_ALIAS_FLAG);
            pTouch.setXfermode(
                  new PorterDuffXfermode(Mode.SRC_OUT));
            pTouch.setColor(Color.TRANSPARENT);
        }

        @Override
        public void onDraw(Canvas canvas){
            super.onDraw(canvas);
            //draw background
            canvas.drawBitmap(bgr, 0, 0, null);
            //copy the default overlay
            // into temporary overlay and punch a hole in it                          
            //c2.drawBitmap(overlayDefault, 0, 0, null);
            c2.drawCircle(X, Y, 80, pTouch);
            //draw the overlay over the background  
            canvas.drawBitmap(overlay, 0, 0, null);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

来自http://blog.uncommons.org/2011/01/12/adjusting-the-opacity-of-an-android-bitmap/

**
 * @param bitmap The source bitmap.
 * @param opacity a value between 0 (completely transparent) and 255 (completely opaque).
 * @return The opacity-adjusted bitmap.  If the source bitmap is mutable it will be
 * adjusted and returned, otherwise a new bitmap is created.
 */
private Bitmap adjustOpacity(Bitmap bitmap, int opacity)
{
    Bitmap mutableBitmap = bitmap.isMutable()
                           ? bitmap
                           : bitmap.copy(Bitmap.Config.ARGB_8888, true);
    Canvas canvas = new Canvas(mutableBitmap);
    int colour = (opacity & 0xFF) << 24;
    canvas.drawColor(colour, PorterDuff.Mode.DST_IN);
    return mutableBitmap;
}

请注意,ARGB_4444的Bitmap.Config文档说:

  

该字段在API级别13中已弃用。由于质量差   在这种配置中,建议改为使用ARGB_8888。