主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Python: Exifの表現方法を考える

                
tags: python
 けっこう前から作っていたExifをいじるPythonライブラリのバージョンを1.0.0にした。もうアルファやベータではなくなった。途中でExifをPythonでどうやって表現するか選択があったのでそのあたりなどを書いておく。
https://github.com/hMatoba/Piexif

 ExifはJPEGに含まれていることがある画像以外のメタデータだ。デジカメで撮った写真のJPEGにはそのカメラの情報や撮影時の設定などさまざまな情報がExifで記録されている。
 Exifはキーとバリューの対データの集合だ。たとえば横方向の画像解像度を表すXResolutionを示すキーがあり、そのあとに2048だの4096だのと対応するバリューが記録されている。このキーバリューの対がいくつか集まっているのがExif。実際にはキーの型は固定だが、バリューは数値、文字列、バイナリなど様々な型を取る。
 PythonでExifを表すにはどうすればいいだろう。辞書型が適していると考えられる。Pythonの辞書型はバリューの型をあらかじめ宣言する必要はない。バリューとして様々な型で値を入れられる。辞書型はPythonの基本型の一つなので、Pythonを知る人なら扱いに困ることもないだろう。
exif_dict = dict(
Width = 400,
Height = 300,
Maker = "Sigma",
Flash = 1,
)


 Exifの別の表現方法を考える。クラスを使うのも手。この方法は静的片付け言語でExifを表現する場合と似たものになるだろう。ただこれを使うなら新たな構造のオブジェクトを作らなければならない。
class Exif:
Width = None
Height = None
Maker = None
Flash = None

exif = Exif()
exif.Width = 400
exif.Height = 300
exif.Maker = "Sigma"
exif.Flash = 1


 Exifを実際に使う場合を考える。Exifではさまざまな情報を表現するため多くのキーを定義しているが、実際には基本的な情報以外にどの情報が記録されているかデータを展開してみるまでわからない。おそらくExifをいじるライブラリにもとめられる機能の一つに、いかに簡単に記録された情報をひととおり見るかということがある。記録情報の一覧表示を辞書型Exifの場合とクラス使用Exifの場合でやってみる。
辞書型使用
for name in exif_dict:
print(name, exif_dict[name])

クラス使用
attrs = [name for name in exif.__class__.__dict__ if name[0] != "_"]
for name in attrs:
v = getattr(exif, name)
if v is not None:
print(name, v)

 クラス使用では見慣れないものを使いつつちょっと複雑になっている。アンダースコア付きのプロパティを呼んでいるし避けたい書き方。一方で辞書型使用では簡潔に書けている。
 ExifをPythonで表現する方法としてクラスを使うか辞書型を使うかということだが、辞書型を使ったほうが実装が楽。それに辞書型は基礎的な型なのでライブラリの使用難度も特別上がることはないだろう。そう考えてExifは辞書型で表現することにした。
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。