image

2010年12月10日

pythonでJPEG画像のEXIF情報を扱うのが、けっこう手間取ったので、ここに記しておく。 pythonの日本語情報は、表面的なものはあるけど、ちょっと突っ込んだものはやはり少ないと実感。

exif.pyというライブラリもあるが、追加ライブラリを使わずにやりたかったので、Python Image Libraryを使う。

import Image

i=Image.open("sample.jpg")
exif=i._getexif()
print exif.__class__

for tag,value in exif.items():
    print str(tag)+ str(tag.__class__) + "==>" + str(value) + str(value.__class__)

_getexif()で取得したEXIF情報は、DICT型になっている。そして、各要素のKEYは、int型になっているため、このままでは何が何の情報なのか、さっぱりわからない。
ちなみにvalue側は、タプルだったり、stringsだったり、いろいろ違うようだ。ややこしい。

$ python exiftest.py 
<type 'dict'>
36864<type 'int'>==>0221<type 'str'>
37121<type 'int'>==><type 'str'>
37378<type 'int'>==>(196608, 65536)<type 'tuple'>
36867<type 'int'>==>2010:12:05 11:19:56<type 'str'>
36868<type 'int'>==>2010:12:05 11:19:56<type 'str'>
40965<type 'int'>==>8602<type 'int'>
40960<type 'int'>==>0100<type 'str'>
37383<type 'int'>==>5<type 'int'>
37385<type 'int'>==>16<type 'int'>
37386<type 'int'>==>(28, 1)<type 'tuple'>
40962<type 'int'>==>4752<type 'int'>
41486<type 'int'>==>(4752000, 894)<type 'tuple'>
271<type 'int'>==>Canon<type 'str'>
272<type 'int'>==>Canon EOS 50D<type 'str'>
(以下略)

そこで、exiftagsというモジュールで、要素の名前に変換してやる。

import Image
import ExifTags

i=Image.open("sample.jpg")
exif=i._getexif()

for tag,value in exif.items():
    if tag!=37500: 
        tagname=ExifTags.TAGS.get(tag)
        print str(tagname) + "==>" + str(value)

出力は、こんな感じ。

$ python exiftest.py 
ExifVersion==>0221
ApertureValue==>(196608, 65536)
DateTimeOriginal==>2010:12:05 11:19:56
DateTimeDigitized==>2010:12:05 11:19:56
ExifInteroperabilityOffset==>8602
FlashPixVersion==>0100
MeteringMode==>5
Flash==>16
FocalLength==>(28, 1)
ExifImageWidth==>4752
FocalPlaneXResolution==>(4752000, 894)
Make==>Canon
Model==>Canon EOS 50D
(以下略)

なお、37500のexif要素には、何やらバイナリデータが入っていたので(サムネイルか?)、出力をはじいています。



sylphide_ffr31mr at 00:15コメント(0)トラックバック(0) 
記事検索
最新コメント
livedoor プロフィール
月別アーカイブ
  • ライブドアブログ