首页 文章

如何使用特定颜色(非黑色)创建透明位图?

提问于
浏览
1

透明像素由α值为零和红色,绿色和蓝色的任意值组成 . 因此,即使像素是透明的,它仍然具有颜色 .

我现在想要创建一个完全透明的位图,但具有特定的颜色(例如白色) . 但是我尝试的每一种方法都得到了一个黑色透明的位图(就像在png文件中一样) .

这对我来说非常重要,因为我通过画布在位图上渲染消除锯齿的文本 . 在角落处,半透明像素变暗 . 我想要做的是事先用与文本相同的颜色填充位图或画布,但是要透明 .

我的代码

Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
//bitmap manipultion here
Canvas canvas = new Canvas(bitmap);
//canvas manipulation here
canvas.drawText(gText, 0, bounds.height(), paint);

到目前为止我尝试了什么( redgreenblue 非零):

画布操作:

这个与 PorterDuff.Mode.SRC_OVER 相同 . 我以为 SRC 用源alpha和源颜色覆盖了目标,或者我错了?

canvas.drawColor(Color.argb(0, red, green, blue), PorterDuff.Mode.SRC);

我也试过这个,但它会生成一个透明的黑色位图 .

paint.setColor(Color.argb(0, red, green, blue));
canvas.drawRect(0, 0, w, h, paint);

位图操作:

这不会改变透明(黑色)位图上的任何内容

bitmap.eraseColor(Color.argb(0, red, green, blue));

我试过这个,希望第一行用我的颜色覆盖所有东西,然后第二行使它透明 . 但它提供了透明的黑色位图 .

bitmap.eraseColor(Color.argb(255, red, green, blue));
bitmap.eraseColor(Color.argb(0, red, green, blue));

这个也生成透明的黑色位图

for(int x = 0; x<bitmap.getWidth(); x++){
    for(int y = 0; y<bitmap.getHeight(); y++){
        bitmap.setPixel(x, y, Color.argb(0, red, green, blue));
    }
}

我该怎么做才能生成非黑色和透明的位图?或者甚至可能(因为自动压缩)?

2 回答

  • 0

    尝试将上次尝试中的红绿色和蓝色全部替换为255,这应该加起来为白色(红绿蓝==白色,255为最大值) .

    for(int x = 0; x<bitmap.getWidth(); x++){
        for(int y = 0; y<bitmap.getHeight(); y++){
            bitmap.setPixel(x, y, Color.argb(0, 255, 255, 255));
        }
    }
    
  • 0

    尝试在Manifest attr中添加您的活动:

    android:hardwareAccelerated="false"
    

    如果硬件加速删除透明位图,至少你会得到一些答案

相关问题