我正在使用位图图像,其透明部分以洋红色着色(在某些语言中,可以将颜色设置为透明)。我尝试在原始位图图像中透明洋红色像素。
我从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通道,我应该首先设置/定义它?如果有,怎么样?
EDIT1:
根据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);
}
}
}
但结果或多或少相同。使用不同的PorterDuff
模式会导致整个位图的透明度或使目标像素变黑:
有人会有任何想法吗?
答案 0 :(得分:4)
我终于可以找到问题了。 我的png图像没有alpha通道,也可能没有激活他们的alpha通道。 我为解决这个问题所做的就是添加:
HashSet<Element>[] AllSets = ...
// preprocess
Hashtable AllElements = new Hashtable(2000);
for(var index = 0; index < AllSets.Count; index++) {
foreach(var elm in AllSets[index]) {
if(!AllElements.ContainsKey(elm)) {
AllElements.Add(elm, new HashSet<int>() { index });
} else {
((HashSet<int>)AllElements[elm]).Add(index);
}
}
}
public List<HashSet<Element>> TopIntersect(HashSet<Element> set, int top = 1) {
// <index, count>
Dictionar<int, int> counts = new Dictionary<int, int>();
foreach(var elm in set) {
var setIndices = AllElements[elm] As HashSet<int>;
if(setIndices != null) {
foreach(var index in setIndices) {
if(!counts.ContainsKey(index)) {
counts.Add(index, 1);
} else {
counts[index]++;
}
}
}
}
return counts.OrderByDescending(kv => kv.Value)
.Take(top)
.Select(kv => AllSets[kv.Key]).ToList();
}
它的工作方式与我的预期相符。