如何使用 Python PIL (Pillow) 将图像保存在特定文件目录中而不会由于以下原因而出现 KeyError:save_handler = SAVE[format.upper()]

How to save images in specific file directories using Python PIL (Pillow) without getting a KeyError due to: save_handler = SAVE[format.upper()]

我正在尝试从周期性 table 的较大图像中裁剪特定元素,然后将它们保存在特定文件目录中,这个文件目录在一个附加文件夹中,这个文件夹在与我尝试使用的程序相同的文件目录。

我查看了另一个关于堆栈溢出的已回答问题,它与我的问题有相似之处: How can I save an image with PIL? ,但是该用户使用了 'numpy'。我以前只在学校学过 python 基础知识,我利用空闲时间学习 'tkinter',现在 'PIL'(Pillow),我是 python 和这些模块的新手我正在努力掌握两者令人困惑的文档,而且我也不知道 'numpy' 是什么或如何使用它。

这是我正在尝试的代码 运行:

#Saving G1 elements as their own image


from PIL import Image


Periodic_Table = Image.open("Periodic Table Bitmap.bmp")
G1_List = ["Hydrogen.bmp","Lithium.bmp","Sodium.bmp",
           "Potassium.bmp","Rubidium.bmp","Caesium.bmp","Francium.bmp"]

starting_coords = (180,86,340,271)
for i in range(7):
    y1 = 86 + (i * 187)
    y2 = 86 + ((i+1)* 187) - 3
    cropped_region = (180,y1,340,y2)
    G1_Element = Periodic_Table.crop(cropped_region)
    G1_Name = G1_List[i]
    G1_Element.save(
        "C:\Users\Kids\Documents\Robert\Python Programming\Periodic Table Quiz\PIL Programs and Images\Group 1 Elements"
        , G1_Name)

我也试过 运行使用相同的代码,其中 G1_List 中的项目没有“.bmp”扩展名,但图像名称的格式如下:

#Saving G1 elements as their own image

from PIL import Image

Periodic_Table = Image.open("Periodic Table Bitmap.bmp")
G1_List = ["Hydrogen","Lithium","Sodium","Potassium","Rubidium","Caesium","Francium"]

starting_coords = (180,86,340,271)
for i in range(7):
    y1 = 86 + (i * 187)
    y2 = 86 + ((i+1)* 187) - 3
    cropped_region = (180,y1,340,y2)
    G1_Element = Periodic_Table.crop(cropped_region)
    G1_Name = G1_List[i]
    G1_Name_Formatted = ("%s" % (G1_Name)) + ".bmp"
    G1_Element.save(
        "C:\Users\Kids\Documents\Robert\Python Programming\Periodic Table Quiz\PIL Programs and Images\Group 1 Elements"
        , G1_Name_Formatted)

在这两种情况下,我都会收到此错误消息:

save_handler = SAVE[format.upper()]
KeyError: 'HYDROGEN.BMP'

从post我把link粘贴到前面,建议去掉'.'来自 '.bmp',因此可以识别大写的扩展名,但这也不起作用。

任何解决方案将不胜感激,最好不要使用其他模块,例如 'numpy',但是如果必须使用其中任何一个,我将不熟悉它们,并且需要答案中的代码如果我要理解的话,请向我详细解释。

注意:我正在使用位图图像,因为我在某些 python 文档中了解到我计划与 PIL (Pillow) 一起使用的 tkinter 仅与位图图像兼容:https://pillow.readthedocs.io/en/5.2.x/reference/ImageTk.html

谢谢

您正在将文件名作为第二个参数传递给 Image.save

但是,第二个参数是(可选的)文件格式 - 如果指定,它必须与注册的文件格式相匹配,例如GIFBMPPNG、...

您可能想要做的是连接路径和图像名称 - 无需指定格式。

import os

...

# dir_path can be set outside of your loop
dir_path = "C:\Users\Kids\Documents\Robert\Python Programming\Periodic Table Quiz\PIL Programs and Images\Group 1 Elements"
...
G1_Name_Formatted = ("%s" % (G1_Name)) + ".bmp"
file_path = os.path.join( dir_path, G1_Name_Formatted  ) 
G1_Element.save( file_path )

或者如果您想明确指定格式,请将最后一部分更改为:

G1_Element.save( file_path, "BMP" )