美好的一天,
首先,我对Android很新,我正在尝试制作图像编辑应用程序。我遇到了一个问题,如果我将半透明图像移到另一个图像上,则不会绘制背后的图像(在Canvas上)。请注意,这只是在我不更改/设置Paint对象的Alpha(我不想这样做 - 如果我更改图像的alpha值,我希望它们'永久'更改(为了保存目的),不仅在视觉上。)
基本上,我有以下内容:
//Set up of paint object
paint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG | Paint.ANTI_ALIAS_FLAG);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY)); // I've tried a couple of these (DST_ATOP and OVERLAY)
//paint.setColor(0x808fd2ea); - Messed around with this too, just to see
这是我目前用来手动更改每个像素的alpha的循环,目前alpha = 120(透明度±50%)
for(int y = 0; y < bmp.getHeight(); ++y)
{
int newPixelAlpha = (alpha << 24);
for (int x = 0; x < bmp.getWidth(); ++x)
{
bmp.setPixel(x, y, ((bmp.getPixel(x, y) & 0xFFFFFF) | newPixelAlpha));
}
}
然后,这是我用于将每个位图绘制到画布的方法
public void drawSelf(Canvas canvas, Paint paint)
{
if(active) {
if (!selected) {
//paint.setAlpha(opacity);
canvas.drawBitmap(bitmap, rect.left, rect.top, null);
//This bit here is just if someone long-presses on the image, it gets "highlighted" but a rectangle over it, with transparency 170.
//Not being used at this point
} else {
paint.setAlpha(170);
canvas.drawRect(rect, paint);
canvas.drawBitmap(bitmap, rect.left, rect.top, paint);
}
}
}
以下是另一张图片的屏幕截图,没有透明度(不幸的是,我需要10个声誉才能将其包含在这篇文章中)
在这里,我使用上面的循环编辑了顶部图像的每个像素的alpha值,但它仍然是“不透明的”
http://tinypic.com/r/2j2dras/8
也许实际上“看到”画布背景颜色是图像背后的颜色,而不是其他图像?这可以解释为什么当它变得透明时它会变暗。我假设我不得不让画布做一些像素混合或某种性质的东西?不幸的是,我在这方面的知识仍然非常有限,所以我不确定该怎么做/从哪里去。
我真的很感激任何指导:)
谢谢!
答案 0 :(得分:2)
好吧,这很令人尴尬......
在某些时候我记得我认为问题是Paint Object,所以我决定尝试在没有一个位图(因此为“null”)的情况下绘制位图:
canvas.drawBitmap(bitmap, rect.left, rect.top, null);
无论如何,关键是我还没有读过有关Paint.setXferMode的内容。在那里添加paint对象可以解决问题,并且使用PorterDuff.OVERLAY似乎可以实现我想要的东西:)