如何告诉我的脚本在Python中使用PIL处理一个特定的图像文件扩展名


编辑:我更改了这个问题的标题,因为我意识到我只需要告诉下面的代码只处理PNG图像文件,而不处理其他文件。我找到了一些解决方案,但都不起作用。请允许我解释一下:

我在使用这个代码时遇到了麻烦,我在这里找到了另一位作者的问题。

简言之,我试图取一个装满PNG图像的文件夹,裁剪它们,并将结果放在一个单独的文件夹中;我在Windows 11中的Jupyter笔记本中使用这个。

****我意识到当我把所有的源文件复制到我的Linux根目录中的一个子目录中时;区域标识符";每个图像的文件。**这就是剧本的用武之地。它不仅尝试吸收PNG文件,还尝试处理这些Zone.Identifier文件。

为了进行测试,我手动删除了这些多余的文件,脚本运行得很好。

这是代码:

from PIL import Image
import os.path
SOURCE_DIRECTORY = "/home/andy/crop/nyc/"
TARGET_DIRECTORY = "/home/andy/crop/output/nyc/"
directory_list = os.listdir(SOURCE_DIRECTORY)
def crop():
for source_file in directory_list:
source_path = os.path.join(SOURCE_DIRECTORY, source_file) 
if os.path.isfile(source_path):
raw_image = Image.open(source_path)
file_name = os.path.basename(source_path)
file_name, extension = os.path.splitext(file_name)
image_cropped_top = raw_image.crop((344, 340, 474, 519))
image_cropped_top.save(TARGET_DIRECTORY + file_name+'.png', "PNG", quality=100)
crop()

这是一个错误:

---------------------------------------------------------------------------
UnidentifiedImageError                    Traceback (most recent call last)
Input In [39], in <cell line: 20>()
17             image_cropped_top = raw_image.crop((344, 340, 474, 519))
18             image_cropped_top.save(TARGET_DIRECTORY + file_name+'.png', "PNG", quality=100)
---> 20 crop()
Input In [39], in crop()
11 source_path = os.path.join(SOURCE_DIRECTORY, source_file) 
12 if os.path.isfile(source_path):
---> 13     raw_image = Image.open(source_path)
14     file_name = os.path.basename(source_path)
15     file_name, extension = os.path.splitext(file_name)
File ~/miniconda3/lib/python3.9/site-packages/PIL/Image.py:3147, in open(fp, mode, formats)
3145 for message in accept_warnings:
3146     warnings.warn(message)
-> 3147 raise UnidentifiedImageError(
3148     "cannot identify image file %r" % (filename if filename else fp)
3149 )
UnidentifiedImageError: cannot identify image file '/home/andy/crop/nyc/DUDE.png:Zone.Identifier'

因此,我的问题可能有一些需要调整代码的解决方案,但我不确定如何解决。我们可以:

  • 阻止创建这些文件(在我运行脚本之前,在复制和粘贴过程中(
  • 通过代码忽略此ZoneIdentifier文件,或者-只选择要在代码中裁剪的PNG文件,或者
  • 将源和文件路径更改为linux目录之外的一个目录,在windows中,可能是我的桌面,在那里没有创建这些区域标识符文件

我更喜欢告诉代码只选择PNG文件,这似乎是最直接的方式。我该怎么做才能让它发挥作用?谢谢

您只需要glob:

import glob
for file in glob.glob('/path/to/images/*.png'):
print(file

最新更新