Хорошо, это было нелегко, но я думаю, что у меня есть решение, хотя вам нужно использовать некоторые частные методы 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.