Как конвертировать ImageTk в изображение? - PullRequest
0 голосов
/ 15 октября 2019

Допустим, у меня есть ImageTk.PhotoImage изображение, хранящееся в переменной imgtk. Как я могу преобразовать его обратно в Image.Image?

Причина в том, что я хочу изменить его размер, но кажется, что .resize() работает только для Image.Image с.

1 Ответ

1 голос
/ 15 октября 2019

Хорошо, это было нелегко, но я думаю, что у меня есть решение, хотя вам нужно использовать некоторые частные методы label.image. Может быть, есть лучший способ, если бы я хотел посмотреть.

import tkinter as tk
from tkinter import Label
import numpy as np
from PIL import Image, ImageTk

root = tk.Tk()

# create label1 with an image
image = Image.open('pic1.jpg')
image = image.resize((500, 750), Image.ANTIALIAS)
picture = ImageTk.PhotoImage(image=image)
label1 = Label(root, image=picture)
label1.image = picture

# extract rgb from image of label1
width, height = label1.image._PhotoImage__size
rgb = np.empty((height, width, 3))
for j in range(height):
    for i in range(width):
        rgb[j, i, :] = label1.image._PhotoImage__photo.get(x=i, y=j)

# create new image from rgb, resize and use for label2
new_image = Image.fromarray(rgb.astype('uint8'))
new_image = new_image.resize((250, 300), Image.ANTIALIAS)
picture2 = ImageTk.PhotoImage(image=new_image)
label2 = Label(root, image=picture2)
label2.image = picture2

# grid the two labels
label1.grid(row=0, column=0)
label2.grid(row=0, column=1)

root.mainloop()

На самом деле вы можете увеличивать и уменьшать исходное изображение, используя методы zoom для увеличения изображения (zoom(2) удваивает размер) и subsample для уменьшения размера (subsample(2) уменьшает размер изображения пополам).

, например

picture2 = label1.image._PhotoImage__photo.subsample(4)

уменьшает размер изображения до четверти, и вы можете пропустить всепреобразование в изображение.

Согласно label1.image._PhotoImage__photo.subsample.__doc__:

Возвращать новый PhotoImage на основе того же изображения, что и этот виджет, но использовать только каждый X-й или Y-й пиксель. Если y не задано, значение по умолчанию совпадает с x

и label1.image._PhotoImage__photo.zoom.__doc__:

Возвращает новый PhotoImage с таким же изображением, как у этого виджета, но с увеличениемэто с коэффициентом х в направлении X и у в направлении Y. Если y не задано, значение по умолчанию совпадает с x.

...