Is there a max image size (pixel width and height) within wx where png images lose there transparency?
Question: Initially, I loaded in 5 .png's with transparent backgrounds using wx.Image()
and every single one kept its transparent background and looked the way I
wanted it to on the canvas (it kept the background of the canvas). These png
images were about (200,200) in size. I proceeded to load a png image with a
transparent background that was about (900,500) in size onto the canvas and it
made the transparency a black box around the image. Next, I opened the image
up with gimp and exported the transparent image as a smaller size. Then when I
loaded the image into python the image kept its transparency. Is there a max
image size (pixel width and height) within wx where png images lose there
transparency? Any info would help. Keep in mind that I can't resize the
picture before it is loaded into wxpython. If I do that, it will have already
lost its transparency.

    
    
    import wx
    import os
    
    def opj(path):
        return apply(os.path.join, tuple(path.split('/')))
    
    def saveSnapShot(dcSource):
        size = dcSource.Size
    
        bmp= wx.EmptyBitmap(size.width, size.height)
        memDC = wx.MemoryDC()
        memDC.SelectObject(bmp)
    
        memDC.Blit(0, 0, size.width, size.height, dcSource, 0,0)
        memDC.SelectObject(wx.NullBitmap)
    
        img = bmp.ConvertToImage()
        img.SaveFile('path to new image created', wx.BITMAP_TYPE_JPEG)
    
    def main():
        app = wx.App(None)
        testImage = wx.Image(opj('path to original image'), wx.BITMAP_TYPE_PNG).ConvertToBitmap()
    
        draw_bmp = wx.EmptyBitmap(1500, 1500)
        canvas_dc = wx.MemoryDC(draw_bmp)
    
        background = wx.Colour(208, 11, 11)
        canvas_dc.SetBackground(wx.Brush(background))
        canvas_dc.Clear()
    
        canvas_dc.DrawBitmap(testImage,0, 0)
        saveSnapShot(canvas_dc)
    if __name__ == '__main__':
        main()
    


Answer: I don't know if I got this right. But if I convert your example from MemoryDC
to PaintDC, then I could fix the transparency issue. The key was to pass True
to useMask in DrawBitmap method. If I omit useMask parameter, it will default
to False and no transparency will be used.

The documentation is here: <http://www.wxpython.org/docs/api/wx.DC-
class.html#DrawBitmap>

I hope this what you wanted to do...

    
    
    import wx
    
    class myFrame(wx.Frame):
        def __init__(self, testImage):
            wx.Frame.__init__(self, None, size=testImage.Size)
            self.Bind(wx.EVT_PAINT, self.OnPaint)
            self.testImage = testImage
            self.Show()
    
        def OnPaint(self, event):
            dc = wx.PaintDC(self)
            background = wx.Colour(255, 0, 0)
            dc.SetBackground(wx.Brush(background))
            dc.Clear()
            #dc.DrawBitmap(self.testImage, 0,  0)  # black background
            dc.DrawBitmap(self.testImage, 0,  0, True)  # transparency on, now red
    
    
    def main():
        app = wx.App(None)
        testImage = wx.Image(r"path_to_image.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap()
        Frame = myFrame(testImage)
        app.MainLoop()
    
    
    if __name__ == '__main__':
        main()
    

(Edit) Ok. I think your original example can be fixed in a similar way

    
    
    memDC.Blit(0, 0, size.width, size.height, dcSource, 0,0,  useMask=True)
    
    canvas_dc.DrawBitmap(testImage,0, 0, useMask=True)
    

Just making sure that useMask is True was enough to fix the transparency issue
in your example, too.

