【问题标题】:In wxPython is it possible to create one image from a set of images?在 wxPython 中是否可以从一组图像中创建一个图像?
【发布时间】:2013-06-10 11:45:18
【问题描述】:

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

我当前将地图绘制到框架的方法包括遍历所有 50x50 位置并将 16x16 位 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

【问题讨论】:

    标签: image wxpython tile


    【解决方案1】:

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

    要采取的其他优化方法取决于您所绘制内容的性质,以及随着时间的推移可能会发生多大的变化。如果它可以被划分为一个相当静态的背景,而前景中的小东西发生了变化,那么一个好的做法是为背景预先创建一个位图,然后在您的绘图处理程序中,您只需绘制背景位图,然后绘制当前状态在此之上的前景。要制作大背景,您可以创建一个合适大小的空位图,创建一个以该位图为目标的 wx.MemoryDC,然后将您的图块绘制到该 DC。完成后,可以保存背景位图以供您的绘图处理程序使用。

    【讨论】:

    • 感谢您的快速回复,我尝试将所有图像对象加载到与绘制事件之外的每个图块位置相对应的数组中,然后尝试 dc.DrawBitmap(img[x][y],pposX,pposY) .不幸的是,每次相机移动时,所有图块都会发生变化,因为它是一张正在滚动的地图。
    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多