LoginSignup
1
1

PNGにメタデータを埋め込む

Last updated at Posted at 2024-07-04

PNG 画像に文字列データを埋め込み、また、そこから文字列データを読み取ります。

メタデータの収容エリアには tEXt チャンクを使います。JPEG なら Exif あるいはヘッダコメントに相当するものです。

処理は、Python の画像処理ライブラリ Pillow/PIL から行います。

PNGファイルを読む

まず PNG ファイルを読みます。Pillow で画像ファイルを開くには PIL.Image.open() です。

>>> from PIL import Image
>>> img = Image.open('240704-qrcode.png')
メタデータを用意する

PNG メタデータの操作には PIL.PngImagePlugin.PngInfo クラスを使います。インスタンス化したら、.add_text() メソッドからデータのキーと値を追加します。

>>> from PIL.PngImagePlugin import PngInfo
>>> metadata = PngInfo()
>>> metadata.add_text('url',
 'https://www.amazon.co.jp/Python-Pillow-PIL-%E8%B1%8A%E6%B2%A2%E8%81%A1/dp/4877835253')
メタデータ込みで画像ファイルを保存する

保存には、PIL.Image.save()です。画像フォーマットはファイル名の拡張子から自動的に決定されます。保存時に pnginfoキーワード引数を使ってメタデータを指定するところがポイントです。

>>> img.save('new.png', pnginfo=metadata)
ファイルからメタデータを読む

メタデータを読むには、Pillow/PIL で開いて、text属性を読むだけです。

>>> img_new = Image.open('new.png')
>>> img_new.text
{'url':
 'https://www.amazon.co.jp/Python-Pillow-PIL-%E8%B1%8A%E6%B2%A2%E8%81%A1/dp/4877835253'}
おまけ

Pillow が読める画像フォーマットは Pillow ドキュメントの Handbook > Appendices > Image file formats に示されています。

プログラム的に調べるなら、PIL.Image.OPEN 辞書に収容されています。ただし、先に Image.init() をかけないと用意されません。

>>> Image.init()
1
>>> Image.OPEN.keys()
dict_keys(['PNG', 'BMP', 'DIB', 'GIF', 'JPEG', 'PPM', 'BLP', 'BUFR', 'CUR', 'PCX',
  'DCX', 'DDS', 'EPS', 'FITS', 'FLI', 'FTEX', 'GBR', 'GRIB', 'HDF5', 'JPEG2000',
  'ICNS', 'ICO', 'IM', 'IMT', 'IPTC', 'MCIDAS', 'MPEG', 'TIFF', 'MSP', 'PCD',
  'PIXAR', 'PSD', 'QOI', 'SGI', 'SPIDER', 'SUN', 'TGA', 'WEBP', 'WMF', 'XBM',
  'XPM', 'XVTHUMB'])
おわりに

URL を収容した QR コードを(Python qrcode で)作成していたのですが、コード自体は読まずにもとの URL をチェックできる方法を探していて、この方法に行きつきました。

new.png

Pillow/PIL は使い込んだつもりでしたが、PngInfo を使ったのは実は今日が初めてです。まだまだ修行が足りていないようです。約2年前(2022年9月)に書いた Pillow/PIL の教本では JPEG の品質パラメータ、GIF/WebPのアニメーション関連パラメータは紹介しましたが、そこまでは手が回りませんでした。ここで、追加させてもらった次第です。

ご購入はこちらから【 出版社 | ヨドバシカメラ | 楽天ブックス | amazon.co.jp 】。

表紙

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1