我已经处理过这段代码:
from PIL import ImageGrab
def getnsave(event):
widget=event.widget
x=root.winfo_rootx()+widget.winfo_x()
y=root.winfo_rooty()+widget.winfo_y()
x1=x+widget.winfo_width()
y1=y+widget.winfo_height()
formats=[('Images (.png)','*.png'),('Images (.jpg)','*.jpg')]
img=ImageGrab.grab().crop((x,y,x1,y1))
f=filedialog.asksaveasfile(filetypes=(("Portable Network Graphics (*.png)", "*.png"),("All Files (*.*)", "*.*")),mode='w',defaultextension='.png')
if f is None:
return
f.write(img)
f.close()
我收到此错误:
TypeError: write() argument must be str, not Image
请帮助我。据我所知,选择目录后,我需要命令保存什么。你知道怎么做吗?
Image.save
方法。要使其正常工作,有两件事很重要:
文件必须以二进制模式打开。
这意味着您必须更改
w
中的文件模式
filedialog.asksaveasfile(filetypes=(("Portable Network Graphics (*.png)", "*.png"),
("All Files (*.*)", "*.*")),
mode='w',
defaultextension='.png')
到
wb
就像这样:
filedialog.asksaveasfile(filetypes=(("Portable Network Graphics (*.png)", "*.png"),
("All Files (*.*)", "*.*")),
mode='wb',
defaultextension='.png')
PIL 需要知道你想以哪种格式保存图像。您可以从文件扩展名中提取格式,如下所示:
filename = f.name
extension = filename.rsplit('.', 1)[-1]
将所有这些放在一起:
f = filedialog.asksaveasfile(filetypes=(("Portable Network Graphics (*.png)", "*.png"),
("All Files (*.*)", "*.*")),
mode='wb',
defaultextension='.png')
if f is None:
return
filename = f.name
extension = filename.rsplit('.', 1)[-1]
img.save(f, extension)
f.close()
我猜您正在使用
ImageGrab
中的 PIL
模块,即使您没有在代码片段中显示 import
命令。如果 PIL
处于活动状态,您可以使用以下方式写入图像:
img.save(filename,'PNG')
请注意,
filedialog.asksaveasfile
返回文件名,而不是文件对象。这样就可以直接在前面的命令中使用了