2011-07-05 2 views
9

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

Во всяком случае, так я доволен GIF/МПГ/частей на миллион, класс 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) 

Спасибо!

ответ

7

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

scale_w = new_width/old_width 
scale_h = new_height/old_height 
photoImg.zoom(scale_w, scale_h) 
+0

что мне нужно! Проблема только в том, что zoom() требует целочисленных аргументов, что немного странно, так как я могу перемасштабировать, скажем, от 640x480 до 320x240: в этом случае я бы получил масштаб (0,0). Или масштабирование небольшого коэффициента, меньше, чем 2x – alessandro

+1

Тогда, я думаю, вы должны использовать метод 'subample'. – Constantinius

+1

Думаю, это нужно будет сделать! Просто выяснилось также. Вероятно, было немного удобнее иметь один метод изменения размера, но дизайнеры Tk не думали об этом (если вам это нужно, используйте PIL) _ по адресу http://effbot.org/zone/ Tkinter-photoimage-полутоновой-ramp.htm – alessandro

10

Так как 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) 
1

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

В основном изображение уменьшено до наименее распространенного коэффициента двух размеров, а затем субсидируется по размеру оригинала. Это оставляет вам изображение желаемого размера.

Смежные вопросы