当前位置: 首页 > 知识库问答 >
问题:

无法透明位图图像的像素

别兴国
2023-03-14

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

我从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)变为白色,颜色。argb(0x80,0xff,0xff,0xff)为灰色,而为彩色。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模式会导致整个位图的透明度或使目标像素变黑:

有人知道吗?

共有1个答案

萧辰沛
2023-03-14

我终于找到了问题所在。我的png图像没有alpha通道,或者它们的alpha通道没有激活。我为解决这个问题所做的是补充:

         bitmap.setHasAlpha(true); 

它像我预期的那样工作。

 类似资料:
  • #klem1,#klem2 { opacity:0.4; filter:alpha(opacity=40); /* For IE8 and earlier */ } #klem1:hover,#klem2:hover { opacity:1.0; filter:alpha(opacity=100); /* For IE8 and earlier */ } div.background { widt

  • 问题内容: 所以我有两个图像,我想显示在彼此的顶部。这个 上面的图像应该是透明的,这样底部的图像是透明的 可见。 Here is my code so far: With the face in the bottom and the eyes on top. 问题答案: Try this 我没有你的两个源图像,所以我不能确定它将与工作 他们。如有任何问题,请提供两者的原件。

  • 我的任务是: 创建一个TBitmap对象 如何在Delphi XE中做到这一点?

  • 我试图从眼动跟踪结果创建一个热图(显示用户在屏幕上最频繁查看的位置)。 对于用户经常查看的像素,我想设置不透明的红色,对于不太频繁的橙色,等等...我使用红色到绿色的色阶。但是对于频率最低的像素,我希望它们不仅显示绿色,而且是透明的。 问题是,当我尝试改变颜色时,例如使用它实际上并没有根据新旧颜色将像素作为平均值着色,它只是显示一些新的、看起来奇怪的颜色。 图像与alpha RGBA值设置为50:

  • 问题内容: 我正在使用带有背景图像的透明1x1图像,以便能够使用精灵并仍为某些图标提供替代文本。 我想为图像使用数据URI来减少HTTP请求的数量,但是 产生透明图像的最小字符串是 什么? 我意识到我可以使用数据URI:s代替实际的图片,但将所有内容保存在CSS中而不是分散放置时,维护起来会更容易。 问题答案: 在使用不同的透明GIF玩耍后,有些不稳定并会导致CSS故障。例如,如果您有一个并且使用

  • 我试图拖动对象表示为PNG图像透明背景从AnchorPane到HBox。 我使用以下线条将图像设置为拖动视图: 对于不透明的背景图像,这一切都很好,但对于透明的图像,图像的背景是白色的,不透明度为“0.8”。 我尝试为节点拍摄快照: 但它不起作用,白色背景仍然存在。有没有其他方法可以让它像原始图像一样透明?