无法透明位图图像的像素

Beh*_*ehy 5 android bitmap alpha-transparency

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

我从 SD 卡加载位图:

            Bitmap bitmap = BitmapFactory.decodeFile(myImagePath);
Run Code Online (Sandbox Code Playgroud)

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

            Bitmap bitmap2 = bitmap.copy(Bitmap.Config.ARGB_8888,true);
Run Code Online (Sandbox Code Playgroud)

然后逐像素扫描以找到洋红色像素并尝试更改其透明度。

            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)
                    }                           
                }
            }
Run Code Online (Sandbox Code Playgroud)

但是我希望变得透明的那些像素被转换为黑色。通过更改 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);
                    }                           
                }
            }
Run Code Online (Sandbox Code Playgroud)

但结果或多或少是一样的。使用不同的PorterDuff模式会导致整个位图透明或使目标像素变黑:

有人有什么想法吗?

Beh*_*ehy 5

我终于可以找到问题所在了。我的 png 图像没有 Alpha 通道,或者它们的 Alpha 通道可能未激活。我为解决这个问题所做的就是添加:

         bitmap.setHasAlpha(true); 
Run Code Online (Sandbox Code Playgroud)

它按照我的预期工作。