wxWidgets - Alpha blending

3

在wxWidget中有一种方法可以执行alpha混合操作,例如将位图的alpha与其他位图的RGB相乘以生成新图像(例如将照片渲染为反锯齿的圆形)。


我也很想知道如何做到这一点。目前我使用区域来实现完全的 alpha 功能。 - Lodle
1个回答

1

虽然我自己没有做过alpha blending,但我相信wxGraphicContext是你想要的。

http://docs.wxwidgets.org/stable/wx_wxgraphicscontext.html

在我的paint事件处理程序中,我使用以下代码实现了无闪烁地绘制到图形上下文(在Win32上):

void OnPaint( wxPaintEvent& e )
{
    wxBufferedPaintDC dc( this );        
    wxGraphicsContext* gdc = wxGraphicsContext::Create( dc );
    // you drawing code here
}

编辑:这封电子邮件可能会提供更多的见解:

http://www.nabble.com/Is-alpha-blending-implemented-when-using-DC's--td17183159.html


嗯,不完全是那样。假设我有一张正方形的图像。在DC中的blit方法或wxGraphicsContext中的等效方法只允许您呈现整个位图或矩形部分。如何能够仅呈现原始图像的圆形区域。通常,我会将圆形渲染到目标缓冲区中,确保事先清除为255 alpha。然后,我只需将图像与缓冲区进行alpha混合,将alpha值乘以各个RGB分量。我想我要手动完成这个...我会发布实现。 - rui
你确定了wxGraphicsContext的DrawBitmap方法在绘制时不会考虑Alpha通道吗?另外,你也可以使用OpenGL来绘制图像,因为wxWidgets有一个OpenGL画布。 - Daniel Paull
这是我想要工作的代码:wxBitmap my_image = LoadSomePngWithNoAlpha(); wxBitmap buffer; wxMemoryDc dc = new wxMemoryDc(buffer); dc.SetBrush(wxCoulor(0, 0, 0, 0)); dc.Clear(); dc.BlitBitmapAsCircle(bitmap, wxPoint(5,5), 42.0);为了完成最后一步,通常需要绘制一个alpha值设置为255的普通圆形,然后将矩形的wxBitmap混合到缓冲区中,只有alpha == 255位将被复制,因此最终会得到PNG图像的圆形裁剪部分。 - rui
我发布的链接向您展示了如何使用wxMemoryDc和wxGraphicsContext。当使用OpenGL(例如)时,您需要在绘制图像之前将透明圆形绘制到图像的alpha通道中。我预计这就是您在此处需要做的 - 尽管可能没有很好的API支持来完成这种操作。 - Daniel Paull
嗯,我稍后会尝试这种方法。我会在这个帖子中回复结果。谢谢! - rui
下周我可能会尝试使用wxGraphicsContext,如果有机会的话,我还会研究一下alpha混合。 - Daniel Paull

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接