如何使用wxpython调整和绘制图像大小?

14 投票
3 回答
30859 浏览
提问于 2025-04-15 20:46

我想加载一张图片,把它调整到指定的大小,然后在一个面板上把它画到特定的位置。

这一切都是用wxpython来实现的。

我该怎么做呢?

提前谢谢大家!

3 个回答

1

如果你是想把图片放到工具栏、列表或者工具书里,你需要把它转换成位图(通常只允许使用位图)。

据我所知,位图是不能直接调整大小的,所以你需要先调整图片的大小,然后再进行转换。

这里有个不错的例子 http://markandclick.com/1/post/2011/12/wxpython-resize-embedded-bitmap-before-adding-it-as-a-tool.html

下面是这个例子的一部分:

def getFolderBitmap():
  img = folder_icon.GetImage().Rescale(scaleW, scaleH)
  return img.ConvertToBitmap()
1

首先,我觉得wxPython的文档和示例做得非常好,特别是那些示例可以随时操作,让你看到效果,或者你可以恢复到最初的状态。这里有一个Windows的链接,可以下载所有的文件:

http://www.wxpython.org/download.php#binaries

接下来,这是示例代码:

def runTest(frame, nb, log):
    bmp = wx.Image(opj('bitmaps/image.bmp'), wx.BITMAP_TYPE_BMP).ConvertToBitmap()
    gif = wx.Image(opj('bitmaps/image.gif'), wx.BITMAP_TYPE_GIF).ConvertToBitmap()
    png = wx.Image(opj('bitmaps/image.png'), wx.BITMAP_TYPE_PNG).ConvertToBitmap()
    jpg = wx.Image(opj('bitmaps/image.jpg'), wx.BITMAP_TYPE_JPEG).ConvertToBitmap()

    panel = wx.Panel(nb, -1)

    pos = 10
    wx.StaticBitmap(panel, -1, bmp, (10, pos), (bmp.GetWidth(), bmp.GetHeight()))

    pos = pos + bmp.GetHeight() + 10
    wx.StaticBitmap(panel, -1, gif, (10, pos), (gif.GetWidth(), gif.GetHeight()))

    pos = pos + gif.GetHeight() + 10
    wx.StaticBitmap(panel, -1, png, (10, pos), (png.GetWidth(), png.GetHeight()))

    pos = pos + png.GetHeight() + 10
    wx.StaticBitmap(panel, -1, jpg, (10, pos), (jpg.GetWidth(), jpg.GetHeight()))

    return panel

这段代码展示了如何加载一张图片并在一个面板上显示出来。虽然这里有一些对象没有解释,但大体上你应该能明白它的意思。

33

wx.Image 有一个叫 Scale 的方法,可以用来调整图片的大小。其他的部分就是正常的 wx 编程了。

这里有一个完整的例子给你参考。

import wx

def scale_bitmap(bitmap, width, height):
    image = wx.ImageFromBitmap(bitmap)
    image = image.Scale(width, height, wx.IMAGE_QUALITY_HIGH)
    result = wx.BitmapFromImage(image)
    return result

class Panel(wx.Panel):
    def __init__(self, parent, path):
        super(Panel, self).__init__(parent, -1)
        bitmap = wx.Bitmap(path)
        bitmap = scale_bitmap(bitmap, 300, 200)
        control = wx.StaticBitmap(self, -1, bitmap)
        control.SetPosition((10, 10))

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = wx.Frame(None, -1, 'Scaled Image')
    panel = Panel(frame, 'input.jpg')
    frame.Show()
    app.MainLoop()

撰写回答