Python 图像库和 KeyError: 'JPG'

18

这个有效:

from PIL import Image, ImageFont, ImageDraw

def create_image_file(name='test.jpeg', ext='jpeg', size=(500, 500), color=(5, 179, 200)):
    file_obj = open(name, 'w')
    image = Image.new("RGBA", size=size, color=color)
    usr_font = ImageFont.truetype(
        "/Users/myuser/ENV/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/ttf/Vera.ttf", 59)
    d_usr = ImageDraw.Draw(image)
    d_usr = d_usr.text((105, 280), "Test Image", (0, 0, 0), font=usr_font)
    image.save(file_obj, ext)
    file_obj.close()

if __name__ == '__main__':
    f = create_image_file()

但是如果我将参数改为:

def create_image_file(name='test.jpg', ext='jpg', ...)

引发了异常:

File "/Users/myuser/project/venv/lib/python2.7/site-packages/PIL/Image.py", line 1681, in save
    save_handler = SAVE[format.upper()]
KeyError: 'JPG'

我需要处理用户上传的图片,这些图片的扩展名是.jpg。这是一个 Mac 特有的问题吗?是否有什么方法可以将格式数据添加到图像库中?

1个回答

30
save 的第二个参数不是扩展名,而是格式参数,如图像文件格式中所指定的那样,对于 JPEG 文件的格式说明符是 JPEG,而不是 JPG
如果你想让PIL决定要保存哪种格式,可以忽略第二个参数,例如:
image.save(name)

请注意,在这种情况下,您只能使用文件名而不是文件对象。

有关详细信息,请参见.save()方法的文档

format - 可选格式覆盖。 如果省略,则从文件名扩展名确定要使用的格式。 如果使用了文件对象而不是文件名,则始终应使用此参数。

或者,您可以检查扩展名并手动决定格式。 例如:

def create_image_file(name='test.jpeg', ext='jpeg', size=(500, 500), color=(5, 179, 200)):
    format = 'JPEG' if ext.lower() == 'jpg' else ext.upper()
    # ...
    image.save(file_obj, format)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接