2

经过 1 周的不断失败后,我仍然无法完成一项简单的任务:加载一个带有 alpha 通道或白色背景的 png(在下面的示例中),并让它在 wx.StaticBitmap 中保持其透明度。

稍后我需要在 wx.panel 中使用它。它应该保持这样或类似的状态。

这是我的方法之一(白色背景):

def __init__(self, parent):
    wx.Panel.__init__(self, parent)
    self.loc = wx.Image("intro/image.png",wx.BITMAP_TYPE_PNG).ConvertToBitmap()
    z = wx.Mask(self.loc, wx.WHITE) 
    self.loc.SetMask(z) 
    self.locopic = wx.StaticBitmap(self, -1, self.loc, (0, 0))

我读了很多关于这个话题的文章。我很垃圾。对不起。我想我在这里错过了一些明显的东西。wx.Mask ,透明图片

更新:

通过 WorkinWithImages中的示例,我设法做到了这一点:

import ImageConversions
...

    puFilename = "intro/imagealpha.png"
    pilImage = Image.open( puFilename )
    pilImageWithAlpha = ImageConversions.WxImageFromPilImage( pilImage, createAlpha=True )
    self.puWxBitmap = pilImageWithAlpha.ConvertToBitmap()
    self.locopic = wx.StaticBitmap(self, -1, self.puWxBitmap)

这是从带有 alpha 通道的 PNG 创建透明的 wx.image,但是在 wx.StaticBitmap 中,透明度应该是丑陋的黑色。这让我很生气!!!请帮忙!

如果我能设法在 wx.panel 中在正确的位置显示具有透明度的图像谢谢社区!

4

1 回答 1

4

正如 Python SO 聊天中所讨论的:

class MyPanel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.Bind(wx.EVT_PAINT, self.OnPaint)

        self.loc = wx.Bitmap("intro/image.png")

    def OnPaint(self, evt):
        dc = wx.PaintDC(self)
        dc.SetBackground(wx.Brush("WHITE"))

        # ... drawing here all other images in order of overlapping
        dc.DrawBitmap(self.loc, 0, 0, True)

诀窍是用wx.PaintDC.

此外,它使用起来更方便,wx.Bitmap而不是wx.Image(..., wx.BITMAP_TYPE_PNG).ConvertToBitmap()从文件系统加载 PNG。

于 2013-04-02T13:33:11.130 回答