python - 在 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))
[...]
实际的
是什么原因造成的,有没有办法解决?高度赞赏帮助!
解决方案
应dtype=uint8
为np.zeros(...)
图像数据设置:
np.zeros((2000, 2000), dtype=np.uint8)
推荐阅读
- go - 在结构中表示可选 time.Time 的惯用方式
- go - 读入一个结构会覆盖另一个
- c++ - 在可变参数函数中转发特定范围的参数
- java - 如何以编程方式在 intellij idea 中设置全局 gradle 设置(gradle vm 选项)?
- c++ - windows下使用cmake编译glfw
- c# - C# VSTO for Outlook - 触发 VBA 宏的按钮
- css - 元素上 chrome 背景中分辨率为 1920x1080 的 CSS
- javascript - JS json数组比较数组并删除重复项
- sap - 获取访问令牌失败:通过 OAuth2Bearer 访问 S4HANA 时未找到有效的 JWT 承载
- php - 用户在上传后注销 [PHP]