无法使位图图像的透明像素变得透明

5

我正在处理透明部分为洋红色(在某些语言中可以将颜色设置为透明)的位图图像。我尝试使原始位图图像中洋红色像素变为透明。

我从SD卡加载位图:

            Bitmap bitmap = BitmapFactory.decodeFile(myImagePath);

将其复制到另一个位图中使其可变:

            Bitmap bitmap2 = bitmap.copy(Bitmap.Config.ARGB_8888,true);

然后逐像素扫描它,查找品红色的像素,并尝试更改它们的透明度。
            for(int x=0;x<bitmap2.getWidth();x++){
                for(int y=0;y<bitmap2.getHeight();y++){
                    if(bitmap2.getPixel(x, y)==Color.rgb(0xff, 0x00, 0xff))
                    {
                        int alpha = 0x00;
                        bitmap2.setPixel(x, y , Color.argb(alpha,0xff,0xff,0xff));  // changing the transparency of pixel(x,y)
                    }                           
                }
            }

但是我期望透明的像素被转换成了黑色。通过改变alpha值,我发现最终颜色从argb()中提到的颜色(未提及alpha)变为黑色。例如,Color.argb(0xff,0xff,0xff,0xff)会得到白色,Color.argb(0x80,0xff,0xff,0xff)会得到灰色,Color.argb(0x00,0xff,0xff,0xff)会得到黑色。
我不明白出了什么问题。
有可能没有alpha通道,我需要先设置/定义它吗?如果是,怎么做?
编辑1:
根据Der Gol...lum的评论,我修改了我的代码:
    Paint mPaint = new Paint();
    mPaint.setAlpha(0);
    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
    mPaint.setAntiAlias(true);

        Bitmap bitmap = BitmapFactory.decodeFile(myBackImagePath).copy(Bitmap.Config.ARGB_8888 , true);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawBitmap(bitmap, 0, 0, mPaint);

        if(bitmap.getPixel(0, 0)==Color.rgb(0xff, 0x00, 0xff))
        {
            for(int x=0;x<bitmap.getWidth();x++){
                for(int y=0;y<bitmap.getHeight();y++){
                    if(bitmap.getPixel(x, y)==Color.rgb(0xff, 0x00, 0xff))
                    {
                        bitmap.setPixel(x, y,Color.TRANSPARENT);
                    }                           
                }
            }

但结果基本相同。使用不同的PorterDuff模式会导致整个位图透明或使目标像素变黑:

有人有什么想法吗?


你需要在PorterDuff xFer模式下应用一个遮罩。 - Phantômaxx
@Der Gol...lum:请查看编辑。 - Behy
关闭硬件加速。https://dev59.com/_2gu5IYBdhLWcg3wZma8 - Phantômaxx
1个回答

5
我终于找到了问题所在。 我的png图像没有alpha通道,或者它们的alpha通道未被激活。 为了解决这个问题,我添加了:
         bitmap.setHasAlpha(true); 

它能够按照我的预期正常运作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接