Изменение размера изображения под PhotoImage - PullRequest
15 голосов
/ 05 июля 2011

Мне нужно изменить размер изображения, но я хочу избежать PIL, поскольку я не могу заставить его работать под OS X - не спрашивайте меня, почему ...

В любом случае, так как я удовлетворен gif / pgm / ppm, класс PhotoImage мне подходит:

photoImg = PhotoImage(file=imgfn)
images.append(photoImg)
text.image_create(INSERT, image=photoImg)

Проблема в том, как мне изменить размер изображения? Следующее работает только с PIL, что не эквивалентно PIL?

img = Image.open(imgfn)
img = img.resize((w,h), Image.ANTIALIAS)
photoImg = ImageTk.PhotoImage(img)
images.append(photoImg)
text.image_create(INSERT, image=photoImg) 

Спасибо!

Ответы [ 4 ]

11 голосов
/ 07 июля 2016

Поскольку для zoom() и subsample() требуется целое число в качестве параметров, я использовал оба.

Мне пришлось изменить размер изображения 320x320 до 250x250, в результате я получил

imgpath = '/path/to/img.png'
img = PhotoImage(file=imgpath)
img = img.zoom(25) #with 250, I ended up running out of memory
img = img.subsample(32) #mechanically, here it is adjusted to 32 instead of 320
panel = Label(root, image = img)
8 голосов
/ 05 июля 2011

Вы должны использовать методы subsample() или zoom() класса PhotoImage.Для первого варианта вы сначала должны рассчитать масштабные коэффициенты, просто объясненные в следующих строках:

scale_w = new_width/old_width
scale_h = new_height/old_height
photoImg.zoom(scale_w, scale_h)
1 голос
/ 14 сентября 2018

Если у вас не установлен PIL -> установите его

(для пользователей Python3 + -> использовать 'pip install pillow' в cmd)

from tkinter import *
import tkinter
import tkinter.messagebox
from PIL import Image
from PIL import ImageTk

master = Tk()

def callback():
    print("click!")

width = 50
height = 50
img = Image.open("dir.png")
img = img.resize((width,height), Image.ANTIALIAS)
photoImg =  ImageTk.PhotoImage(img)
b = Button(master,image=photoImg, command=callback, width=50)
b.pack()
mainloop()
1 голос
/ 25 ноября 2016

У меня была такая же проблема, и я обнаружил, что ответ @Memes работает довольно хорошо.Просто убедитесь, что ваш коэффициент максимально уменьшен, так как по какой-то причине для subsample() требуется довольно много времени.

По существу, изображение уменьшено до наименьшего общего множителя двух размеров,и затем субсидируется оригинальным размером.Это оставляет вас с изображением нужного размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...