2016-05-05 20 views
2

これは動作します:PythonのイメージライブラリとKeyError例外: 'JPG'

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固有の問題ですか?イメージライブラリにフォーマットデータを追加するためにできることはありますか?

答えて

5

saveの第2引数はない拡張である、image file formatsに指定されているように、format引数で、JPEGファイルのフォーマット指定子がJPEG、ないJPGです。この場合にはファイル名だけではなく、ファイルオブジェクトを使用することができること

image.save(name) 

注:あなたが保存する形式を決定するPILをしたい場合は

、次のような、第二引数を無視することができます。

詳細は documentation of .save() methodを参照してください:

format – Optional format override. If omitted, the format to use is determined from the filename extension. If a file object was used instead of a filename, this parameter should always be used.

また、あなたは拡張子を確認することができますし、手動でフォーマットを決めます。例:

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) 
関連する問題