【问题标题】:Making specific color in bitmap transparent使位图中的特定颜色透明
【发布时间】:2010-10-08 10:30:10
【问题描述】:

我有一个 Android 应用程序可以在另一个图像上显示一个图像,这样第二个图像的白色是透明的。为此,我使用了两个ImageViews,原始图像覆盖为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。知道上面的代码可能出了什么问题吗?

【问题讨论】:

  • 代码为Bitmap bitmap2 = null; int 宽度 = imViewOverLay.getWidth(); int 高度 = imViewOverLay.getHeight(); for(int x=0;x
  • 尝试编辑您自己的帖子,将代码添加到问题的正文中...
  • 你得到什么异常?除了在示例中您实际上并没有创建bitmap2这一事实之外。

标签: android


【解决方案1】:

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

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

【讨论】:

  • 朋友们,我解决了这个问题。删除 bitmap2 并将 bitmap1 设置为可变.. 让我知道有什么方法可以加快循环操作吗?在我的应用程序中需要很长时间
  • 当我在上面的图像中显示时.. 它只显示第二个(bitmap1);我需要它显示在另一个位图(bitmap3)上。任何人请帮我一些提示。我正在使用 imageview 来显示图像
  • @asifkt - 必须循环遍历图像中的每个像素,如果图像很大,这将需要一段时间。要么减小图像的大小,要么使用带有调色板的图像,这样您就可以只更改调色板中的单个值。
  • 谢谢你,你能帮我在另一个上显示位图吗??在上面的问题中已经提到,要显示在另一个图像上的第二个图像对于特定颜色是透明的
  • asifkt - 我对 Android 显示管道不熟悉,所以恐怕无法回答。
【解决方案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);
                }
            }
        }

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2012-07-04
    • 2015-08-05
    • 2021-06-17
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    相关资源
    最近更新 更多