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

3

透明像素包括 alpha 值为零和任意的红、绿、蓝值。因此,即使像素是透明的,它仍然具有颜色。

我现在想创建一个完全透明但具有特定颜色(例如白色)的位图。但是,无论我尝试哪种方法,我都会得到一个带有黑色颜色的透明位图(就像在 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);

我所尝试的方法(红色绿色蓝色均非零):

画布操作:

这个与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));
    }
}

我该如何生成一个非黑色且透明的位图呢?或者说这是否可能(因为自动压缩的原因)?

1
你已经问了这个问题有一段时间了,也许你还记得你最终做了什么? - HB.
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));
    }
}

这就是我实际尝试的。我仍然得到了一个透明但是黑色的位图。 “白色”只是一个例子。我写了红色、绿色和蓝色来强调我希望它能与每种颜色一起工作。 - Scindix

0

尝试在清单文件中的活动中添加属性:

android:hardwareAccelerated="false"

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


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