реализация resize в tkinter PhotoImage
подскажите как правильно реализовать функцию resize в tkinter PhotoImage?
функция __init__ не выводит на экран изображение.
псевдокод:
class Image(PhotoImage):
def __init__(self, file):
self.file = file
return super(Image, self).__init__(file)
def resize(self, xo, yo):
self.zoom(xo, yo)
xi, yi = self.getsize(self.file)
self.subsample(xi, yi)
def getsize(self):
...
return xi, yi
Ответы (2 шт):
Автор решения: biomotor
→ Ссылка
Результат:
(самостоятельно читает текущие размеры изображения и преобразовывает в заданные размеры)
class Image(PhotoImage):
def __init__(self, *args, **kwargs):
self.file = kwargs['file']
return super(Image, self).__init__(*args, **kwargs)
def resize(self, xo, yo):
xi, yi = self.getsize()
img = self.zoom(xo, yo)
img = img.subsample(xi, yi)
return img
def zoom(self, *args, **kwargs):
return super(Image, self).zoom(*args, **kwargs)
def subsample(self, *args, **kwargs):
return super(Image, self).subsample(*args, **kwargs)
def getsize(self):
with open(self.file, 'rb') as fhandle:
head = fhandle.read(24)
if len(head) != 24:
return
if imghdr.what(self.file) == 'png':
check = struct.unpack('>i', head[4:8])[0]
if check != 0x0d0a1a0a:
return
x, y = struct.unpack('>ii', head[16:24])
elif imghdr.what(self.file) == 'gif':
x, y = struct.unpack('<HH', head[6:10])
elif imghdr.what(self.file) == 'jpeg':
try:
fhandle.seek(0)
size = 2
ftype = 0
while not 0xc0 <= ftype <= 0xcf:
fhandle.seek(size, 1)
byte = fhandle.read(1)
while ord(byte) == 0xff:
byte = fhandle.read(1)
ftype = ord(byte)
size = struct.unpack('>H', fhandle.read(2))[0] - 2
fhandle.seek(1, 1)
x, y = struct.unpack('>HH', fhandle.read(4))
except Exception:
return
else:
return
return x, y
Вызов:
img = Image(file='file.png')
img = img.resize(30, 18)
Автор решения: FotonPC
→ Ссылка
Зато есть поддержка всех форматов:
import PIL
import PIL.Image
import PIL.ImageTk
import tkinter as tk
class Image:
def __init__(self, file = ''):
self.img = PIL.Image.open(file)
self.TkImage = PIL.ImageTk.PhotoImage(self.img)
def resize(self, size):
self.img = self.img.resize(size)
self.TkImage = PIL.ImageTk.PhotoImage(self.img)
root = tk.Tk()
imga = Image('images/img.tiff')
imga.resize(200, 100)
tk.Label(root, image=imga.TkImage).pack()
root.mainloop()