【发布时间】:2015-07-30 10:35:32
【问题描述】:
我正在处理透明部分以洋红色着色的位图图像(在某些语言中,可以将颜色设置为透明)。我尝试将原始位图图像中洋红色的像素透明化。
我从 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) 变为白色,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);
}
}
}
但结果或多或少是一样的。使用不同的PorterDuffModes 会导致整个位图透明或使目标像素变黑:
有人知道吗?
【问题讨论】:
-
您需要在
PorterDuffxFer 模式下应用掩码。 -
@Der Gol...lum:请查看 EDIT。
-
关闭关闭硬件加速。 stackoverflow.com/questions/11337679/…
标签: android bitmap alpha-transparency