首页 > 解决方案 > 在 tkinter 应用程序中调整 PIL rgb 图像的大小

问题描述

背景

我正在创建一个允许显示图像的小型幻灯片应用程序。原始图像非常大(2000 x 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))
    [...]

在此处输入图像描述

实际的

在此处输入图像描述

是什么原因造成的,有没有办法解决?高度赞赏帮助!

标签: pythonnumpypython-imaging-library

解决方案


dtype=uint8np.zeros(...)图像数据设置:

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

推荐阅读