在wxPython中,是否可以从一组图像中创建一个图像?

时间:2013-06-13 22:16:03

标签: image wxpython tile

我正在通过wxPython学习图形编程。我创建了一组平铺图像,旨在以各种功能(已经完成)确定的方式将它们拼接在一起,以创建随机生成的地图以供将来使用(有效地创建平铺引擎)。

我当前将地图绘制到框架的方法包括迭代所有50x50位置并将16x16bit png绘制到EVT_PAINT处理程序内的每个位置。这需要几秒钟,并且不适合我想要的东西(这就是让框架充当相机,然后可以平移比显示的地图大得多)。

我的问题是,是否有可能在背景中创建一个“拼接”在一起的图像,只需用一行绘制该图像而不是一遍又一遍地绘制(这是我怀疑占用这么多时间) ?任何其他方法(有效)也很好,我必须承认我对编程不是很有经验,特别是对图形编程没有太多经验。理想情况下,我希望能够仅绘制此图像的可见部分,这是可以包装的,因此能够切割并重新拼接“元图像”将是非常好的。

目前EVT_PAINT代码如下所示:

 def onpaint(self, event = None):
    dc = wx.PaintDC(self)
    dc.Clear()

    pposX = 0 #ppos = Pixel Position
    pposY = 0
    tposX = 0 #tpos = tile position, essentially the tile co-ordinates independent of pixel position
    tposY = 0
    while tposY < self.tTotalY: #loops through all y coordinates
        tposX = 0   
        while tposX < self.tTotalX: #loops through all x coordinates
            pposX = tposX*self.tsCurrent
            pposY = tposY*self.tsCurrent
            tiletype = self.getTileType(tposX,tposY,self.tTotalX,self.tTotalY)
            img = wx.Image((self.filepath + '\\' +str(tiletype)), wx.BITMAP_TYPE_ANY).ConvertToBitmap()              
            dc.DrawBitmap(img,pposX,pposY)
            img.Destroy()
            tposX += 1
        tposY += 1

1 个答案:

答案 0 :(得分:2)

通过不从文件重新加载图像并在每次绘制时转换为位图,可以节省大量时间。如果您只需加载一次,然后重复使用它们,您可能会发现它足够快。

要采取的其他优化方法取决于您绘制的内容的性质,以及它可能随时间变化的程度。如果它可以被分成一个相当静态的背景,前景中的小事情发生变化,那么一件好事就是为背景预先创建一个位图,然后在你的绘图处理程序中你只需绘制背景位图然后绘制当前状态最重要的是前景。要创建大背景,您可以创建一个正确大小的空位图,创建一个将定位该位图的wx.MemoryDC,然后将您的切片绘制到该DC。完成后,可以保存背景位图以便在绘图处理程序中使用。