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 をチェックできる方法を探していて、この方法に行きつきました。
Pillow/PIL は使い込んだつもりでしたが、PngInfo
を使ったのは実は今日が初めてです。まだまだ修行が足りていないようです。約2年前(2022年9月)に書いた Pillow/PIL の教本では JPEG の品質パラメータ、GIF/WebPのアニメーション関連パラメータは紹介しましたが、そこまでは手が回りませんでした。ここで、追加させてもらった次第です。
ご購入はこちらから【 出版社 | ヨドバシカメラ | 楽天ブックス | amazon.co.jp 】。