在wx中是否存在最大图像尺寸(像素宽度和高度),其中png图像会失去透明度?

时间:2014-05-23 20:10:08

标签: image wxpython png transparency alpha

最初,我使用wx.Image()加载了具有透明背景的5个.png,并且每一个都保持其透明背景并且看起来像我想要它在画布上的方式(它保留了画布的背景)。这些png图像大小约为(200,200)。我开始在画布上加载一个大小约为(900,500)的透明背景的png图像,它使透明度成为图像周围的黑框。接下来,我用gimp打开图像并将透明图像导出为较小的尺寸。然后,当我将图像加载到python中时,图像保持透明度。在wx中是否存在最大图像尺寸(像素宽度和高度),其中png图像会失去透明度?任何信息都会有帮助。请记住,在将图片加载到wxpython之前,我无法调整图片大小。如果我这样做,它将失去透明度。

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()

1 个答案:

答案 0 :(得分:0)

我不知道我是否做对了。但是,如果我将您的示例从MemoryDC转换为PaintDC,那么我可以修复透明度问题。关键是在DrawBitmap方法中将True传递给useMask。如果省略useMask参数,它将默认为False,并且不使用透明度。

文档在这里:http://www.wxpython.org/docs/api/wx.DC-class.html#DrawBitmap

我希望你能做到这一点...

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()

(编辑)好的。我认为您的原始示例可以以类似的方式修复

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

canvas_dc.DrawBitmap(testImage,0, 0, useMask=True)

确保useMask为True足以解决示例中的透明度问题。