在 python 中的 tkinter window 中将图像调整为标签时图像模糊

Got blurred image on resizing image as label in tkinter window in python

我尝试在 tkinter 上放置图像标签 window,我添加了放大和缩小图像的功能并在主 tkinter 上移动图像 window

但是当我点击增长按钮时,它增加了尺寸但变模糊了,对于收缩按钮反之亦然

这是我的代码,告诉我哪里错了?

from tkinter import* 
from PIL import Image,ImageTk 
from tkinter import Tk, Label, Button
from tkinter.filedialog import askopenfilename 
import tkinter as tk 

root = Tk() 

root.title("image edit")
root.geometry('1000x600+500+100')
root.resizable(False,False)

#take image file from the system 
Tk().withdraw()
filepath = askopenfilename()
img = Image.open(filepath)
tk_im = ImageTk.PhotoImage(img)

xi=100
yi=100
wi=100
hi=100
#function to increase size of label 
def grow():
             
    global img
    global my_label
    global xi
    global yi
    global wi 
    global hi 
    i=0
    while i<2:
      img = img.resize((xi, yi))
      tk_im=ImageTk.PhotoImage(img)
  
      my_label.configure(width=wi, 
      height=hi,image=tk_im)
    
      my_label.image=tk_im
      xi+=1
      yi+=1
      i+=1 
      wi+=1
      hi+=1

#function to decrease size of image 
def shrink():
    global my_label
    global img
    global xi
    global yi
    global wi 
    global hi 
    i=0
    while i<2:
      img = img.resize((xi, yi))
      tk_im=ImageTk.PhotoImage(img)
      my_label.configure(width=wi,
      height=hi,image=tk_im)
    
      my_label.image=tk_im
      xi-=1
      yi-=1
      i+=1 
      wi-=1
      hi-=1

set image in label

my_label=Label(root,image=tk_im)  
my_label.image=tk_im

my_label.pack()

buttons to resize image

grow_button=Button(root,text=
"grow",command=grow)

grow_button.pack()

shrink_button=Button(root,text=
"shrink",command=shrink)

shrink_button.pack()

root.mainloop() 

您的代码不完全是 'wrong',因为人们对质量的期望水平不同。如果您想自己设置质量,但是我建议您使用最近邻重采样调整大小,这样您就不会引入任何新的模糊颜色 - 只是图像中已经存在的颜色:

import numpy as np
from PIL import Image

im = Image.open("ImageTK").convert('RGB')
im = im.resize((200,200),resample=Image.NEAREST)
im.save("result.png")

您可以使用以下方法从 Pillow 图像转换为 numpy 数组:

numpy_array = np.array(pillowImage)

并从 numpy 数组到枕头图像:

pillow_image = Image.fromarray(numpyArray)

您也可以使用 PIL。Image/openCV 和 PIL.ImageFilter 模块:

from PIL import Image, ImageFilter
import cv2

image = cv2.resize(image, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
image = Image.fromarray(image)

这里,fxfy是你要自己设置的值。

您不应修改原始图像,因为它的质量可能会发生变化,尤其是在缩小后。将调整后的图片保存到另一张图片中,如下所示:

      resized_img = img.resize((xi, yi))  # don't modify the original image
      tk_im = ImageTk.PhotoImage(resized_img)