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

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

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

Exifは、デジタルカメラで撮影した画像データに、撮影時の状況などさまざまな情報(メタデータ)を添付して保存する画像ファイル形式の規格です。この付加情報により、データ管理や機器同士のデータ交換、最適な設定の出力などを行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

8717閲覧

Python piexifを使って画像のタグ情報を編集したい

per_

総合スコア41

exif

Exifは、デジタルカメラで撮影した画像データに、撮影時の状況などさまざまな情報(メタデータ)を添付して保存する画像ファイル形式の規格です。この付加情報により、データ管理や機器同士のデータ交換、最適な設定の出力などを行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

1クリップ

投稿2020/07/20 01:01

編集2020/07/20 01:48

前提・実現したいこと

PythonプログラムからJPGの"タグ"を取得および編集したいと考えています。

Windows10
Pythonバージョン3.7
イメージ説明

できていること・わかっていること

調べているうち、Pillow(PIL)ライブラリではEXIF情報の取得しかできないと知りました。
そこで、取得および編集も可能であるpiexifライブラリも使用することを考えています。

上記2つのライブラリを用いて以下のことはできました。
・手動で設定してあるタグを取得する
・EXIFにおける、プロパティのタグ部分の情報
id:40094
tag名:XPKeyword

該当のソースコード

python

1import pprint 2from PIL import Image 3import piexif 4 5filename = r"画像の絶対パス/nekohoge.jpg" 6im = Image.open(filename) 7exif = im._getexif() 8 9for tag_id, value in exif.items(): 10 if tag_id == 40094: 11 strv = str(value) 12 print(strv.replace('\x00', '')) 13 # >>>b'cat;test;cute' 14 15 16exif_dict = piexif.load(im.info["exif"]) 17 18pprint.pprint(exif_dict) 19# >>> {'0th': {270: b'neko_hoge', 20# 34665: 2144, 21# 40091: (110,0,101,0,107,0,111,0,95,0,104,0,111,0,103,0,101,0,0,0), 22# 40094: (99,0,97,0,116,0,59,0,116,0,101,0,115,0,116,0,59,0,99,0,117,0,116,0,101,0,0,0)}, 23# '1st': {}, 24# 'Exif': {}, 25# 'GPS': {}, 26# 'Interop': {}, 27# 'thumbnail': None} 28

※一部見やすいように表記を整えています。

わからないこと

  1. piexifを用いて取得したこの情報がタグにあたる部分だと思うのですが、

40094: (99,0,97,0,116,0,59,0,116,0,101,0,115,0,116,0,59,0,99,0,117,0,116,0,101,0,0,0)
PILを用いて得た情報と表示形式が大きく異なるため、どういう表示をしているのかがわかりません。
⇒自己解決しました。
各要素の数字において、0は処理を飛ばし、他の数値をchr(数値)で表示することでcat;test;cuteを取得できました。

0. 公式ドキュメントでは決まったid部分を変更することは可能なようですが、
上記のような画像タグ(id:40094)部分を、指定して変更するやり方が分かりませんでした。
そもそも不可能なのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

エンコーディングutf-16-leで表現されたタプルのようなのでencode/decode関数を書きました。
これを介すると文字列として取得、変更できて保存もできました。

Python

1from PIL import Image 2import piexif 3 4def decode(t): 5 b = bytes(t) 6 return b[:-2].decode('utf-16-le') 7 8def encode(s): 9 b = s.encode('utf-16-le') + b'\x00\x00' 10 return tuple([int(i) for i in b]) 11 12 13filename = r"test.jpg" 14im = Image.open(filename) 15exif_dict = piexif.load(im.info["exif"]) 16 17keyword = exif_dict["0th"][piexif.ImageIFD.XPKeywords] # 40094: {'name': 'XPKeywords', 'type': TYPES.Byte}, 18print(keyword) # (99, 0, 97, 0, 116, 0, 59, 0, 116, 0, 101, 0, 115, 0, 116, 0, 59, 0, 99, 0, 117, 0, 116, 0, 101, 0, 0, 0) 19 20keyword = decode(keyword) 21print(keyword) # cat;test;cute 22 23keyword += ';dog' 24 25keyword = encode(keyword) 26print(keyword) # (99, 0, 97, 0, 116, 0, 59, 0, 116, 0, 101, 0, 115, 0, 116, 0, 59, 0, 99, 0, 117, 0, 116, 0, 101, 0, 59, 0, 100, 0, 111, 0, 103, 0, 0, 0) 27 28exif_dict["0th"][piexif.ImageIFD.XPKeywords]= keyword 29 30# 別ファイルに保存 31exif_bytes = piexif.dump(exif_dict) 32im.save('ret.jpg', "jpeg", exif=exif_bytes)

投稿2020/07/20 02:24

can110

総合スコア38341

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

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

per_

2020/07/20 02:56

実現したいことを簡潔に行うことができました。 エンコーデイングについて理解できていなかったので、これを機に勉強します。 ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問