質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2486閲覧

【piexif】画像の情報を取得できない【Python】

netz-eng

総合スコア105

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/08/12 18:09

編集2021/08/13 05:13

前提・実現したいこと

jpg形式の画像にタグをコーディングしたいのですが、情報取得の段階で詰まってしまいました。
エラーメッセージもシンプルで、どこをどう改善すればいいかわかりません。

有識者の方、知恵を貸してください!

エラーメッセージ

python

1KeyError: 'exif'

該当のソースコード

python

1import piexif 2 3#エンコード関数 4def encode(s): 5 b = s.encode('utf-16-le') + b'\x00\x00' 6 return tuple([int(i) for i in b]) 7 8#タグ設定関数 9def Tag(filename, keyword): 10 im = Image.open(filename) 11 exif_dict = piexif.load(im.info["exif"]) 12 keyword = encode(keyword) 13 exif_dict["0th"][piexif.ImageIFD.XPKeywords]= keyword 14 exif_bytes = piexif.dump(exif_dict) 15 im.save(filename, "jpeg", exif=exif_bytes) 16 17Tag("任意のファイルパス", "任意のタグ名") 18

コードはネットの情報を参考にしたものです。
ネットを調べても同じエラー例が少なく、困っています。

追記:試したこと

画像の情報を調べる方法を幾つかご回答いただいたので、試してみました。

python

1# (1) 2>>>print(im.info) 3{'jfif': 257, 'jfif_version': (1, 1), 'jfif_unit': 0, 'jfif_density': (1, 1)} 4 5# (2) 6>>>print(type(im)) 7<class 'PIL.JpegImagePlugin.JpegImageFile'> 8 9# (3) 10>>>print(im) 11<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=722x966 at 0x222D4C7FCD0>

補足情報(FW/ツールのバージョンなど)

windows10
Python 3.8.3
piexif 1.1.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

なんとか解決しましたので、こちらに記入します!

回答をいただいた皆様のお力添えあってのことなので、「自己解決しました」というのも烏滸がましいのですが……

同じ画像であらかじめタグをつけたものを作成し、二つの画像の情報を比較してみました。

python

1import piexif 2from PIL import Image 3 4file = r"任意の画像(タグなし)" 5file2 = r"任意の画像(タグあり)" 6 7im = Image.open(file) 8im2 = Image.open(file2) 9 10ed = piexif.load(file) 11ed2 = piexif.load(file2) 12 13ed 14->{'0th': {}, 'Exif': {}, 'GPS': {}, 'Interop': {}, '1st': {}, 'thumbnail': None} 15ed2 16->{'0th': {34665: 2110, 40094: (97, 0, 97, 0, 97, 0, 59, 0, 98, 0, 98, 0, 98, 0, 0, 0)}, 'Exif': {}, 'GPS': {}, 'Interop': {}, '1st': {}, 'thumbnail': None} 17 18ed["0th"] 19->{} 20ed2["0th"] 21->{34665: 2110, 40094: (97, 0, 97, 0, 97, 0, 59, 0, 98, 0, 98, 0, 98, 0, 0, 0)} 22 23ee = ed2["0th"][piexif.ImageIFD.XPKeywords]

得られたeeをデコードしてみると、きちんとあらかじめ設定したaaa, bbbというタグが出てきました。
続いて、タグなしの画像に以下のコードを試しました。

python

1#タグありの画像から得たed2["0th"]をコピー 2ed["0th"]={34665: 2110, 40094: (97, 0, 97, 0, 97, 0, 59, 0, 98, 0, 98, 0, 98, 0, 0, 0)} 3 4eb = piexif.dump(ed) 5im.save(file, "jpeg", exif=eb)

結果、タグなしの画像にタグをつけることができました。
実際のコード内では、下のようにエンコードしたキーワードを中に入れています。

python

1ed["0th"] = {34665: 2110, 40094: keyword}

最後に、ご回答いただいた皆様、本当にありがとうございました!
自力では辿り着けませんでした。これからもよろしくお願いします。

投稿2021/08/13 08:14

netz-eng

総合スコア105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

当然のことですが、Exif形式の画像はexif情報を持っていますが、Exif形式でない画像はexif情報を持っていません。ネットにある画像の場合はExif形式でない画像が普通です。

こういう処理をする場合は、自分のスマホかデジカメで撮った写真でテストしないとKeyError: 'exif'が起きる可能性は大きいです。

スマホの写真ならKeyError: 'exif'は起こりません。

投稿2021/08/12 21:48

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

netz-eng

2021/08/13 05:17

ご回答ありがとうございます。 そうなんですね! 初めて知りました。 自分の目的としては画像にタグ付けを行いたいだけなので、piexifを使うことには拘っていません。 代替案等、何かご存じありませんか?
ppaul

2021/08/13 05:35

入れたタグを読むアプリしだいです。 読むアプリが自作アプリなら、 def Tag(filename, keyword): im = Image.open(filename) im.info[tag"] = keyword im.save(filename, "jpeg") で十分です。既存のアプリにタグを読ませたいなら、そのアプリに合わせル必要があるので、今ある情報だけではなんとも言えません。
netz-eng

2021/08/13 06:57

ありがとうございます! 自作アプリで行っているので、試してみました。 結果、エラーは出なくなりましたが、対象の画像にタグは付きませんでした。 keyword部分をエンコード/デコードした状態の両方で試しましたが、結果は同じでした。 試しに、あらかじめタグを設定しておいて下記の文でタグを取得しようとしたところ、エラーが出ました。 k = im.info["tag"] -> KeyError 'tag' つまり、「imにはtagという情報がないから操れません」ということなんですかね?
guest

0

エラーがどこの行で出ているか定かでないですが、提示のコードを見る限りは
exif_dict = piexif.load(im.info["exif"])
ここの可能性が高いように思います。
im.infoは辞書のようですが、これにexifというキーを持つ要素がないのではないでしょうか?

まずはim.infoのタイプを調べて、辞書であればどんなキーと値が存在するか見れば問題点が見えてくるかと思います。

投稿2021/08/12 18:41

udon-ken

総合スコア657

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

netz-eng

2021/08/12 20:09

ご回答ありがとうございます。 質問文にエラー個所を併記し忘れていました。おっしゃる通り、exif_dict = の部分でエラーが発生しています。 >im.infoは辞書のようですが、これにexifというキーを持つ要素がないのでは なるほど、そのように解釈できるんですね。 >im.infoのタイプを調べて とありますが、具体的にどのように調べればよいか、ご提案いただけますか?
udon-ken

2021/08/12 23:19

オブジェクトの型を調べるのは type() 関数を使います。 print(type(調べたいオブジェクト)) です。 おそらくその結果はdictになると思います(正確なところは自分で実行して調べて下さい)。 dictであれば、もっとも単純にはprintで中身が出力されますのでexifというキーと値があるか調べて下さい。 要素が大量にある場合は、適当に工夫して確認してください。
netz-eng

2021/08/13 05:08

お二方とも、ご返信ありがとうございます! 結果を質問文に追記いたします。 >おそらくその結果はdictになると思います とのことですが、print(type(im))の結果にdictは入っていませんでした。 print(im)にもexifの文字列は見当たらず…… この場合、この画像でexifを用いてタグ付けを行うことは不可能なのでしょうか?
udon-ken

2021/08/13 07:27

> im.infoは辞書のようですが キチンと読んで下さい。 あと、 python type() とでもググってtype()関数が何であるか調べて下さい。 型を返すのですから、 >結果にdictは入っていませんでした。 というような返答は的外れです。
netz-eng

2021/08/13 08:09

ご指摘ありがとうございます。 辞書型の意味がようやく分かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問