Изменение размера изображения PIL rgb в приложении tkinter - PullRequest
0 голосов
/ 06 января 2020

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))
    [...]

enter image description here

фактический

enter image description here

Что является причиной этого, и есть ли способ обойти? Помощь высоко ценится!

1 Ответ

1 голос
/ 07 января 2020

Следует установить dtype=uint8 в np.zeros(...) для данных изображения:

np.zeros((2000, 2000), dtype=np.uint8)
...