如何在Python中将抓取的图像保存到用户输入目录

问题描述 投票:0回答:2

我已经处理过这段代码:

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

请帮助我。据我所知,选择目录后,我需要命令保存什么。你知道怎么做吗?

python image canvas tkinter export
2个回答
0
投票

要将 PIL 图像保存到文件中,您必须使用

Image.save
方法。要使其正常工作,有两件事很重要:

  1. 文件必须以二进制模式打开。

    这意味着您必须更改

    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')
    
  2. 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()

0
投票

我猜您正在使用

ImageGrab
中的
PIL
模块,即使您没有在代码片段中显示
import
命令。如果
PIL
处于活动状态,您可以使用以下方式写入图像:

img.save(filename,'PNG')

请注意,

filedialog.asksaveasfile
返回文件名,而不是文件对象。这样就可以直接在前面的命令中使用了

© www.soinside.com 2019 - 2024. All rights reserved.