background
Я создаю небольшое приложение для создания слайд-шоу, которое позволяет отображать изображение. Исходное изображение довольно большое (2000 на 2000 пикселей), поэтому я хочу изменить его размер, чтобы он соответствовал экрану. Это работает как ожидалось.
Изображение, по сути, представляет собой массив со значениями от 0 до 16 бит. Чтобы заставить PIL отображать цвета, я дублирую массив, манипулирую каждым каналом индивидуально, преобразую в объект Image, масштабирую и отображаю. Здесь, кажется, изменение масштаба не работает должным образом.
подход
Я делюсь версией моего кода без кода, которая повторяет эту проблему, по крайней мере, в моей системе.
import tkinter as tk
import numpy as np
from PIL import Image, ImageTk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
self.images = {}
self.load_image()
self.show_image()
def load_image(self):
img = np.zeros((2000,2000))
img[100:800, 100:800] = 255
self.images[0] = img
def show_image(self):
img = self.images[0]
img = np.repeat(img[:,:,np.newaxis], 3, axis=2)
img = Image.fromarray(img, 'RGB')
img = img.resize((1000,1000))
img = ImageTk.PhotoImage(img)
self.persistent_img = img
self.canvas = tk.Canvas(self.parent, height=1000, width=1000)
self.canvas.grid(row=0, column=0)
self.canvas.create_image(0,0,anchor='nw', image=img)
if __name__ == '__main__':
root = tk.Tk()
MainApplication(root)
root.mainloop()
ожидается
На самом деле, это работает с кодом выше, если я просто перемасштабирую одноканальное изображение:
img = np.zeros((2000,2000))
img[100:800, 100:800] = 255
self.images[0] = img
[...]
img = self.images[0]
img = Image.fromarray(img)
img = img.resize((1000,1000))
[...]
фактический
Что является причиной этого, и есть ли способ обойти? Помощь высоко ценится!