如何使用 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
。
但是,第二个参数是(可选的)文件格式 - 如果指定,它必须与注册的文件格式相匹配,例如GIF
、BMP
、PNG
、...
您可能想要做的是连接路径和图像名称 - 无需指定格式。
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" )
我正在尝试从周期性 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
。
但是,第二个参数是(可选的)文件格式 - 如果指定,它必须与注册的文件格式相匹配,例如GIF
、BMP
、PNG
、...
您可能想要做的是连接路径和图像名称 - 无需指定格式。
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" )