Масштабировать изображение пользовательского интерфейса Python, не уменьшая его (с помощью wxpython, PIL или другого) - PullRequest
0 голосов
/ 05 сентября 2018

Как видно из заголовка, в моем интерфейсе wxpython есть изображение, которое слишком велико, но когда я уменьшаю его (либо в Photoshop, либо используя методы wxpython / PIL), оно буквально просто пикселирует его дальше.

Есть ли способ уменьшить изображение, чтобы оно соответствовало пользовательскому интерфейсу, но сохранило его детализацию?

Использование Python, PIL (Pillow), wxPython, но может использовать что угодно

1 Ответ

0 голосов
/ 05 сентября 2018

Вам необходимо проверить, есть ли у используемого вами инструмента параметр resample, который изменит количество пикселей в полученном изображении. Алгоритм повторной выборки решает, что произойдет, когда пиксели будут добавлены или удалены.

Вы можете использовать параметр Scale() или Rescale() для изображения в wxpython и указать способ его повторной выборки с помощью аргумента quality.
т.е. * +1008 *

img.Scale(width, height, quality=wx.IMAGE_QUALITY_HIGH)

Аргумент quality принимает следующие параметры:

wx.IMAGE_QUALITY_NEAREST        Simplest and fastest algorithm.
wx.IMAGE_QUALITY_BILINEAR       Compromise between wx.IMAGE_QUALITY_NEAREST and wx.IMAGE_QUALITY_BICUBIC.
wx.IMAGE_QUALITY_BICUBIC        Highest quality but slowest execution time.
wx.IMAGE_QUALITY_BOX_AVERAGE    Use surrounding pixels to calculate an average that will be used for new pixels.
wx.IMAGE_QUALITY_NORMAL         Default image resizing algorithm used by wx.Image.Scale .
wx.IMAGE_QUALITY_HIGH           Best image resizing algorithm.

Основываясь на вашем комментарии, вот простой пример.
Просто измените размер окна изображений, чтобы отслеживать изменение размера окна.

import wx

class MyFrame ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = "Resize This Window", size = wx.Size( 500,300 ))
        bSizer = wx.BoxSizer( wx.HORIZONTAL )
        self.img1=wx.Image("bgimage1.png", wx.BITMAP_TYPE_PNG)
        self.img2=wx.Image("bgimage1.png", wx.BITMAP_TYPE_PNG)
        self.m_bitmap1 = wx.StaticBitmap( self, wx.ID_ANY, wx.Bitmap(self.img1))
        self.m_bitmap2 = wx.StaticBitmap( self, wx.ID_ANY, wx.Bitmap(self.img2))
        bSizer.Add( self.m_bitmap1, 1, wx.EXPAND|wx.ALL, 0 )
        bSizer.Add( self.m_bitmap2, 1, wx.EXPAND|wx.ALL, 0 )
        self.Bind(wx.EVT_SIZE, self.onResize)
        self.SetSizer( bSizer )
        self.Layout()
        self.Centre(wx.BOTH)

    def onResize(self, event):
        frame_size = self.GetSize()
        frame_h = (frame_size[0]-10) / 2
        frame_w = (frame_size[1]-10) / 2
        img1 = self.img1.Scale(frame_h, frame_w, quality=wx.IMAGE_QUALITY_HIGH)
        img2 = self.img2.Scale(frame_h, frame_w, quality=wx.IMAGE_QUALITY_HIGH)
        self.m_bitmap1.SetBitmap(wx.Bitmap(img1))
        self.m_bitmap2.SetBitmap(wx.Bitmap(img2))
        self.Refresh()
        self.Layout()

app = wx.App()
MyFrame(None).Show()
app.MainLoop()
...