如何使用Python中的Tkinter保存按钮保存图像

4

我尝试使用tkinter制作“另存为”按钮,将图像保存在特定位置目录中,但遇到了问题。

from tkinter import *
from tkinter import ttk
from tkinter import filedialog
from PIL import ImageTk, Image, ImageDraw
import cv2
import numpy as np

img = cv2.imread('face_person1.jpg')
# convert the images to PIL format...
edged = Image.fromarray(img)

edged = ImageTk.PhotoImage(edged)

def savefile():
    hsl = Image.open(edged)
    hsl = filedialog.asksaveasfile(mode='w', defaultextension=".jpg")
    if hsl is None:
        return
    sv = edged.save()
    sv.close()


button = Button(text="save as", command=savefile)
button.pack()

错误信息是:
Exception in Tkinter callback fp = io.BytesIO(fp.read())
AttributeError: 'numpy.ndarray' object has no attribute 'read'

先尝试设置代码在没有Tkinter的情况下工作(例如,使用硬编码的输出文件名),以便您可以看到异常的完整上下文。 - Karl Knechtel
如果你想保存它,不要在PIL.ImageImageTk.PhotoImage中使用相同的变量edge,因为ImageTk.PhotoImage没有保存函数。你必须保存PIL.Image - furas
如果您想保存它,无需打开它。如果变量“hsl”中有图像,请不要为其分配名称。 - furas
1个回答

1

要保存图像,您必须使用PIL.Image,因此不要将PhotoImage分配给用于保存PIL.Image的变量。

edge = Image.fromarray(img)

tk_edge = ImageTk.PhotoImage(edge)

而且你必须使用文件名来保存它

edge.save(filename)

完整的工作示例
import tkinter as tk
from tkinter import ttk
from tkinter import filedialog
from PIL import ImageTk, Image, ImageDraw
import cv2
import numpy as np

# --- functions ---

def savefile():
    filename = filedialog.asksaveasfile(mode='w', defaultextension=".jpg")
    if not filename:
        return
    edge.save(filename)

# --- main ---

root = tk.Tk()

img = cv2.imread('face_person1.jpg')
edge = Image.fromarray(img)

tk_edge = ImageTk.PhotoImage(edge)
label = tk.Label(root, image=tk_edge)
label.pack()

button = tk.Button(root, text="save as", command=savefile)
button.pack()

root.mainloop()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接