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基于坐标范围批量剪裁(图像)并将剪裁后的图像保存到指定的新文件夹中