2013-04-02 3 views
2

После 1 недели постоянного сбоя я все еще не в состоянии выполнить простую задачу: загрузите png с альфа-каналом или на белом фоне (в примере ниже) и сохраните его прозрачность в wx.StaticBitmap.wx.StaticBitmap - простая прозрачность (маска, png, bmp?)

Это мне нужно в 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, Transparent images

Update:

мне удалось получить это далеко на примере найдены at 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) 

Это создает прозрачную wx.image из PNG с альфа-каналом, а в Wx. StaticBitmap будет иметь уродливый черный цвет, где должна быть прозрачность. Это сводит меня с ума! ПОМОГИ ПОЖАЛУЙСТА!

Если бы мне удалось отобразить в wx.panel это изображение с прозрачностью в нужном месте Спасибо сообществу!

ответ

4

Как обсуждалось в питона 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 из файловой системы.

+0

Я очень благодарен вам за то, что вы потратили свое время и нашли решение, которое я действительно понял и выполнил успешно! Спасибо! – Laci

+0

Я получаю эту ошибку: 'wx._core.wxAssertionError: утверждение C++« IsOk() »потерпело неудачу в /tmp/pip-build-neujnbmg/wxPython/ext/wxWidgets/src/common/dcgraph.cpp(437) в SetTextBackground (): wxGCDC (cg) :: SetTextBackground - недействительный DC' ☹ – Sardathrion

Смежные вопросы