Как изменить размер и нарисовать изображение с помощью wxpython?

Я хочу загрузить изображение, изменить его размер до заданного размера и после этого нарисовать его в определенной позиции на панели.

Все это с помощью wxpython.

Как мне это сделать?

Заранее спасибо!


person aF.    schedule 23.03.2010    source источник
comment
спасибо, ребята, я попробую позже и дам «Принятый ответ»   -  person aF.    schedule 24.03.2010


Ответы (3)


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()
person FogleBird    schedule 24.03.2010
comment
можно ли сделать событие onClick на изображении? - person aF.; 24.03.2010
comment
Да, просто привяжите EVT_LEFT_DOWN к элементу управления StaticBitmap. - person FogleBird; 24.03.2010
comment
Спасибо, @FogleBird, можно ли изменить размер StaticBitmap после того, как он был показан один раз? т.е. если размер родительского окна изменен, размер StaticBitmap должен быть изменен... Возможно ли это легко? - person Basj; 27.01.2014
comment
Почему, если вы измените стиль кадра, например. style= wx.NO_BORDER, изображение загружается неправильно? Что мне нужно сделать, чтобы загрузить изображение в окно без рамки? - person TheRutubeify; 06.11.2017
comment
В wxPython версии 4.0.1 с Python 2.7.13 я получил два предупреждения об устаревании. Я использовал image = bitmap.ConvertToImage() вместо image = wx.ImageFromBitmap(bitmap) и result = wx.Bitmap(image) вместо result = wx.BitmapFromImage(image). - person Joachim; 08.06.2018

Во-первых, я думаю, что документы и демонстрации 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

Здесь показано, как загрузить изображение и отобразить его на панели. Некоторые объекты здесь не объясняются, но это должно дать вам общее представление.

person Fry    schedule 24.03.2010
comment
Это не изменяет размер изображения. Он просто пропускает размер, который с тем же успехом можно было бы опустить. - person FogleBird; 24.03.2010
comment
Ах, да, вы правы, это просто позволяет вам установить определенную высоту и ширину изображения, как показано, не изменяя размер изображения. Ответ обновлен :) - person Fry; 24.03.2010

Если вы имеете в виду добавление изображения на панель инструментов / список / книгу инструментов и т. Д., Вам придется преобразовать его в растровое изображение (обычно разрешены только растровые изображения).

Насколько я знаю, вы не можете изменить размер растрового изображения, поэтому вам придется сначала изменить размер изображения, а затем преобразовать его.

Вот хороший пример: 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()
person Michael    schedule 11.12.2011