绘图/'混合'在Android中的Canvas上具有透明度的另一个图像

时间:2014-09-30 12:00:48

标签: android canvas transparency

美好的一天,

首先,我对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个声誉才能将其包含在这篇文章中)

http://tinypic.com/r/r0t4pt/8

在这里,我使用上面的循环编辑了顶部图像的每个像素的alpha值,但它仍然是“不透明的”

http://tinypic.com/r/2j2dras/8

也许实际上“看到”画布背景颜色是图像背后的颜色,而不是其他图像?这可以解释为什么当它变得透明时它会变暗。我假设我不得不让画布做一些像素混合或某种性质的东西?不幸的是,我在这方面的知识仍然非常有限,所以我不确定该怎么做/从哪里去。

我真的很感激任何指导:)

谢谢!

1 个答案:

答案 0 :(得分:2)

好吧,这很令人尴尬......

在某些时候我记得我认为问题是Paint Object,所以我决定尝试在没有一个位图(因此为“null”)的情况下绘制位图:

canvas.drawBitmap(bitmap, rect.left, rect.top, null);

无论如何,关键是我还没有读过有关Paint.setXferMode的内容。在那里添加paint对象可以解决问题,并且使用PorterDuff.OVERLAY似乎可以实现我想要的东西:)