Python PIL将图像保存在目录中,如果名称相同,则不覆盖

Posted

技术标签:

【中文标题】Python PIL将图像保存在目录中,如果名称相同,则不覆盖【英文标题】:Python PIL save Image in directory no override if the name is same 【发布时间】:2015-09-22 13:52:46 【问题描述】:

我正在尝试制作图像的备份副本,因为它会经常调整大小。我正在询问图像所在的路径(Tkinter),然后我将路径和图像添加到“-original”并将其保存在我从中获取它的同一目录中。

问题是每次我使用这个函数时它都会覆盖原来的函数,因为没有循环让程序检查是否已经存在带有“-original”的文件。

我就是这样保存备份的:

        pfad = askopenfilename()
        im_backup = Image.open(pfad)
        start_string = pfad[:pfad.index(".")]
        ende_string = pfad[pfad.index("."):]
        im_backup.save(start_string + "-original" + ende_string)

目前我正在研究一个可以使用 os 的解决方案,但我觉得它必须很简单。我把 PIL.Image.save 的文档变红了,还有更多参数可以传入保存,但我不知道必须使用哪个参数来防止覆盖。

我当前的解决方案(还没有工作)正在检查 os.listdir(directory) 是否已经有一个 (start_string + "-original" + ende_string) 文件,并且只有在它为 false 时才将其保存在那里。

提前致谢!

【问题讨论】:

【参考方案1】:

考虑使用os.path.splitxext 而不是切片和索引。您也可以使用os.path.isfile 代替listdir

import os
pfad = askopenfilename()
name, ext = os.path.splitext(pfad)
backup_name = name + "-original" + ext
if not os.path.isfile(backup_name):
    im_backup = Image.open(pfad)
    im_backup.save(backup_name)

【讨论】:

太棒了,你刚刚做了双重帮助!运行良好,非常感谢!【参考方案2】:

通过将某些内容传递给.save(),机器人可能会做你想做的事情。

文档中可能让您认为有可能的是:

file – 文件名或文件对象。 format – 可选的格式覆盖。 如果省略,则使用的格式由文件名确定 延期。如果使用文件对象而不是文件名,则此 应始终使用参数。 options – 图像写入器的额外参数。

但在源代码中有行,

self.encoderinfo = params
self.encoderconfig = ()

其中所有选项都存储在与编码器相关的变量中,因此可能不是您想要的。

所以,你或许应该考虑按照@Kevin 的建议去做。

【讨论】:

是的,这是让我感到困惑的部分,但它解决了 Kevin 提供了一个可行的解决方案,甚至改进了我的方法。不过也感谢您的回复。

以上是关于Python PIL将图像保存在目录中,如果名称相同,则不覆盖的主要内容,如果未能解决你的问题,请参考以下文章

使用PIL在python中旋转并将expand参数设置为true时指定图像填充颜色

Python使用PIL基于坐标范围批量剪裁(图像)并将剪裁后的图像保存到指定的新文件夹中

通过套接字发送pil图像而不保存python

路径名太长,尝试在 Python 中使用 OpenCV 或 PIL.Image 保存图像时出错

标签中的Python PIL图像自动调整大小

PIL 将大图像保存为静态