【问题标题】:wxWidgets - Alpha blendingwxWidgets - Alpha 混合
【发布时间】:2010-11-20 00:44:13
【问题描述】:

wxWidget 中有没有办法进行 alpha 混合操作,例如将位图的 alpha 与其他位图的 RGB 相乘以生成新图像(例如将照片渲染为抗锯齿圆形)。

【问题讨论】:

  • 我也很想知道如何做到这一点。 Atm 我使用区域来获得稳定的 alpha 工作。

标签: c++ wxwidgets alpha alphablending


【解决方案1】:

虽然我自己还没有完成 alpha 混合,但我相信 wxGraphicContext 就是您所追求的。

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

我在我的绘画事件处理程序中使用以下内容在图形上下文中(在 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 组件相乘。我想我会手动执行此操作...我将发布实现。
  • 你确认wxGraphicsContext的DrawBitmap方法在绘制时不注意Alpha通道吗?顺便说一句,您还可以使用 OpenGL 来绘制图像,因为 wxWidgets 有一个 OpenGL 画布。
  • 这是我想要工作的代码: wxBitmap my_image = LoadSomePngWithNoAlpha(); wxBitmap 缓冲区; wxMemoryDc dc = 新 wxMemoryDc(缓冲区); dc.SetBrush(wxCoulor(0, 0, 0, 0)); dc.清除(); dc.BlitBitmapAsCircle(位图, wxPoint(5,5), 42.0);为了完成这最后一步,您通常会绘制一个 alpha 设置为 255 的法线圆,然后如果我混合到缓冲区矩形的 wxBitmap 中,则只会复制 alpha == 255 位,所以我最终会得到Png 图像的圆形裁剪部分。
  • 我发布的链接向您展示了如何将 wxMemoryDc 与 wxGraphicsContext 一起使用。使用 OpenGL(例如)时,您将在绘制图像之前将透明圆圈绘制到图像的 Alpha 通道中。我希望这是您需要在此处执行的操作 - 尽管可能没有良好的 API 支持来执行此类操作。
  • 嗯,我稍后会尝试这种方法。我会带着结果回到这个线程。谢谢!
猜你喜欢
  • 2013-06-18
  • 1970-01-01
  • 2011-12-14
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 2020-04-13
相关资源
最近更新 更多