wx.Bitmap Mergen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
sabram
User
Beiträge: 28
Registriert: Mittwoch 5. Januar 2011, 13:42

Hallo,

ich versuche derzeit zwei png dateien übereinander zu legen und mir ein einzelnes Bitmap object zurückgeben zu lassen.

Allerdings verliert das untere Bild seine transparent und erhält einen schwarzen Hintergrund. Mache ich irgendwas verkehrt ? =(

Hier sollte mir das gemergede Image zurückgegeben.

Code: Alles auswählen

    def mergeBitmaps(self, bmp1, bmp2):
        merged = wx.EmptyBitmap(bmp1.GetWidth(), bmp1.GetHeight())
        dc = wx.MemoryDC() 
        dc.SelectObject(merged) 
        dc.DrawBitmap(bmp1, 0, 0, True)
        dc.DrawBitmap(bmp2, 0, 0, True)
        dc.SelectObject(wx.NullBitmap)
        
        return merged
Simpler TestFrame

Code: Alles auswählen

import  wx


USE_GENERIC = 0

if USE_GENERIC:
    from wx.lib.stattext import GenStaticText as StaticText
    from wx.lib.statbmp  import GenStaticBitmap as StaticBitmap
else:
    StaticText = wx.StaticText
    StaticBitmap = wx.StaticBitmap


class TestPanel(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1)
        StaticText(self, -1, "This is a wx.StaticBitmap.", (45, 15))
        bmp = wx.Bitmap("teststep_python.png")
        StaticBitmap(self, -1, bmp, (80, 50), (bmp.GetWidth(), bmp.GetHeight()))
        bmp2 = wx.Bitmap("teststep_f.png")
        StaticBitmap(self, -1, bmp2, (80, 80), (bmp.GetWidth(), bmp.GetHeight()))
        bmp3 = self.mergeBitmaps(bmp,bmp2)
        StaticBitmap(self, -1, bmp3, (80, 120), (bmp.GetWidth(), bmp.GetHeight()))
    
    def mergeBitmaps(self, bmp1, bmp2):
        merged = wx.EmptyBitmap(bmp1.GetWidth(), bmp1.GetHeight())
        dc = wx.MemoryDC() 
        dc.SelectObject(merged) 
        dc.DrawBitmap(bmp1, 0, 0, True)
        dc.DrawBitmap(bmp2, 0, 0, True)
        dc.SelectObject(wx.NullBitmap)
        
        return merged


if __name__ == '__main__':
    import sys,os
    app = wx.App(redirect=False)
    window = TestPanel()
    window.Show()
    app.MainLoop()
Vielen Dank im vorraus
Gremlin
User
Beiträge: 166
Registriert: Freitag 28. Mai 2010, 23:49

Bei mir gibt das keinen schwarzen Hintergrund. Stimmt evtl. etwas mit dem Alphachannel deines Bildes nicht?
sabram
User
Beiträge: 28
Registriert: Mittwoch 5. Januar 2011, 13:42

das ist merkwürdig...

ich hänge mal die beiden Bilder an ( es soll daraus ein neues icon erstellt werden, deshalb 16x16 )

bottom layer Bildhttp://img138.imageshack.us/img138/6276 ... python.png
top layer Bildhttp://img402.imageshack.us/img402/5317/teststepf.png

ich habe den code entsprechend angepasst sodass

Code: Alles auswählen

        merged = bmp1.GetSubBitmap(wx.Rect(0, 0, bmp1.GetWidth(), bmp1.GetHeight()))
                   #merged = wx.EmptyBitmap(bmp1.GetWidth(), bmp1.GetHeight())
ich jetzt mit GetSubBitmap arbeite, somit habe ich keinen Hintergrund mehr allerdings wird das obere Bitmap nur korrekt angezeigt, wenn es vollständig auf dem nicht transparenten Grund des anderen Bitmaps liegt. Das ergibt dann extrem hässliche Pixelfehler wenn das F wie geplant rechts von der Python schlange ist.

Hat da jemand eine Idee was ich verkehrt mache?
Antworten