我有一种方法可以用透明度替换一种颜色的像素
public Bitmap createTransparentBitmapFromBitmap(Bitmap bitmap,
int replaceThisColor) {
if (bitmap != null) {
int picw = bitmap.getWidth();
int pich = bitmap.getHeight();
int[] pix = new int[picw * pich];
bitmap.getPixels(pix, 0, picw, 0, 0, picw, pich);
int sr = (replaceThisColor >> 16) & 0xff;
int sg = (replaceThisColor >> 8) & 0xff;
int sb = replaceThisColor & 0xff;
for (int y = 0; y < pich; y++) {
for (int x = 0; x < picw; x++) {
int index = y * picw + x;
/* int r = (pix[index] >> 16) & 0xff;
int g = (pix[index] >> 8) & 0xff;
int b = pix[index] & 0xff;*/
if (pix[index] == replaceThisColor) {
if(x<topLeftHole.x) topLeftHole.x = x;
if(y<topLeftHole.y) topLeftHole.y = y;
if(x>bottomRightHole.x) bottomRightHole.x = x;
if(y>bottomRightHole.y)bottomRightHole.y = y;
pix[index] = Color.TRANSPARENT;
} else {
//break;
}
}
}
Bitmap bm = Bitmap.createBitmap(pix, picw, pich,
Bitmap.Config.ARGB_8888);
return bm;
}
return null;
}
它就像这样叫
backgroundBitmap = createTransparentBitmapFromBitmap(backgroundBitmap , Color.argb(255,255,255, 0));
我在png文件中有相同的颜色,我想要透明孔。问题是它只替换部分颜色而不是全部。 请参见屏幕截图https://docs.google.com/document/d/18aH43sFmsuuRu0QNfMTD1zek8sqWwH_pTauFofDZeIw/edit
答案 0 :(得分:4)
看起来你的照片里面有JPEG文物。只有在您以无损格式保存图片时才能检测到确切的颜色。 PNG是一种无损格式,但在绘制圆形图像后,您是否将图片的中间版本保存为JPEG(或其他一些有损格式)?
也;只是一个提示:你不需要两个循环,只需在一个for循环中遍历数组。
编辑:这个新的黄色看起来像是由抗锯齿造成的。因此,圆的边缘不是您正在寻找的确切颜色,而您的代码错过了它们。解决这个问题的唯一方法是在绘制圆形时关闭消除锯齿功能。当然,这样你也不会为透明孔获得良好的抗锯齿边缘。
如果你想要那个,你可能不得不为这个洞使用一个单独的面具(一个JPEG用于颜色,一个8位PNG用于透明度应该是一个非常有效的组合 - 哦,我希望有多少图像在Web浏览器中容易允许这种格式的格式
答案 1 :(得分:2)
非常好,我需要这个,然后超越使用我改进了一点,代码:
public static Bitmap repleceIntervalColor(Bitmap bitmap,int redStart,int redEnd,int greenStart, int greenEnd,int blueStart, int blueEnd,int colorNew) {
if (bitmap != null) {
int picw = bitmap.getWidth();
int pich = bitmap.getHeight();
int[] pix = new int[picw * pich];
bitmap.getPixels(pix, 0, picw, 0, 0, picw, pich);
for (int y = 0; y < pich; y++) {
for (int x = 0; x < picw; x++) {
int index = y * picw + x;
if (
((Color.red(pix[index]) >= redStart)&&(Color.red(pix[index]) <= redEnd))&&
((Color.green(pix[index]) >= greenStart)&&(Color.green(pix[index]) <= greenEnd))&&
((Color.blue(pix[index]) >= blueStart)&&(Color.blue(pix[index]) <= blueEnd))
){
pix[index] = colorNew;
}
}
}
Bitmap bm = Bitmap.createBitmap(pix, picw, pich,Bitmap.Config.ARGB_8888);
return bm;
}
return null;
}