■89622 |
Re[21]: 画像ファイルのヘッダーに文字列を埋め込む方法 |
□投稿者/ 魔界の仮面弁士 -(2018/12/10(Mon) 18:12:35)
| ■No89620 (なり さん) に返信 > 目的は > 文字列を COM 拡張セグメント (0xFF,0xFE) に埋め込むことです。
それは「手段」ですよね。『何のために』埋め込むのかを訊ねています。 また、何故それが ASCII で無ければならないのかの説明も欲しいです…。
本来はまず目的があって、その実現のために手段を選択するはずですが、 目的が不明のため、COM セグメントだったり XP Comment タグだったりと 回答が揺れてしまい、回り道をしているように見受けられます。
で。そもそも Exif を出力した JPEG フォーマットの場合、 SOI,APP1,DQT,DHT,SOF0,SOS,EOI (オプションでAPP2,DRI) のマーカーセグメントを使うことになっていて、 それ以外の APP や COM は含めないという仕様らしいです。
ただし JPEG 規定では、EOI (0xFFD9) のセグメントは JPEG ファイルの終わりを表すマーカーであり、それ以降には 何を記録しても良い事になっています。(なので EOI がファイル終端であるとは限らない) なので、EOI の後にコメントのセグメントが付与されているファイルもあるようで。
> ASCIIなら1バイトずれるという問題はないはずです。 ずれることが無かったとしても、JPEG ファイル自体が ASCII では無いことは自明なわけですから、 いずれにせよテキストエディタで開くのは、結果の確認方法としては不十分かと思います。
下記の本によれば、そもそも COM セグメントの Character Set は 未定義だそうなので、ASCII 前提という仕様が正しいとも言い切れず…。 https://books.google.co.jp/books?id=AepB_PZ_WMkC&pg=PA107
> ExIFである必要はなく、ASCIIで埋め込めるのなら > COMセグメントで全く問題ありません。 COM セグメントへの出力だとしたら、.NET Framework 標準の GDI+ ライブラリ (System.Drawing 名前空間)や WPF(Avalon) ライブラリ (System.Windows 名前空間)では 扱えないかもしれません。
Exif であっても構わないけれど、ASCII が前提(マルチバイト文字は使用不可)という点は 崩せないというのなら、0x8298 (Copyright) タグを使うのはどうでしょう。 本来は撮影者もしくは加工者を記録するためのタグですが、先に使っていた BitmapMetadata クラスの Copyright プロパティを使えるので、修正量も軽微かと思います。
> あと、気になっているのですが > JPEGにしてもPNGにしても > 埋め込んだ文字列を読み込むにはどうしたら良いのでしょうか?
読み出し方法すら決まってないのなら、ASCII に拘る必要も無いような。
具体的なコードはあえて記載せずにおきますが、JPEG で用いた BitmapMetadata.Comment については、そのまま読み書きできるので エンコーダーをデコーダーに変えるだけでいけるはずです。 ちなみに System.Drawing.Bitmap からなら、PropertyItem クラスでも OK。 https://dobon.net/vb/dotnet/graphics/getexifinfo.html
SetQuery した PNG についても同様で、エンコーダーをデコーダーに変えた上で、 GetQuery メソッドを使えば取り出せるはずです。 渡すべきクエリ文字列は、SetQuery/GetQuery 共に同じ。 メタデータの存在チェックが必要な場合は ContainsQuery メソッド、 インプレース更新なら InPlaceBitmapMetadataWriter クラスについて調べてみてください。
ちなみに、BitmapMetadata を For Each することで メタデータのクエリ文字列を String として列挙できます。 それによって画像ファイル内のすべての情報を得られるわけでは無いですけれど。
あるいは、画像がいったんファイル化されているのなら、 エクスプローラーで ファイルのプロパティの「詳細」タブで視認できますし、 プログラムからは ShellFolderItem.ExtendedProperty メソッドで読みだせそうです。 http://bbs.wankuma.com/index.cgi?mode=al2&namber=15019&KLOG=31
ShellFolderItem だと書き込めないので、編集には別の方法が必要そうですが。 https://ja.stackoverflow.com/questions/17098/ http://eternalwindows.jp/shell/shellex/shellex11.html
> 提示してくださった方法 > https://dobon.net/vb/bbs/log3-44/26468.html > が、ExIFによるものだったため、 > これを使用しました。
その代替案で十分だったのかどうかが分からないので、 目的が知りたかったのですけれどね。
仮に、ASCII バイナリしか認めないという前提という点が 先に来るなら、XPComment での代用は望めないでしょう。 埋め込んだ文字列を、どのアプリで使うのかにもよるわけですから。
読み書きできれば方法も文字コードも問わない場合、 下記のように色々な実装パターンがあるようです。 (VB から扱いやすいかどうかは考慮せず) https://www.kanzaki.com/docs/sw/photo-rdf.html |
|