[C#] 画像からExif情報を削除するRemovePropertyItemメソッドの挙動がおかしい件

Bitmapクラス (Imageクラスから派生) のメソッドを眺めていたら、プロパティ項目を削除するメソッドを発見。

Image.RemovePropertyItem メソッド (System.Drawing)
http://msdn.microsoft.com/ja-jp/library/system.drawing.image.removepropertyitem(v=vs.110).aspx

Exif情報などメタデータはプロパティ項目として画像に格納されているので、画像ファイルを読み込んでこのメソッドでプロパティ項目を削除して保存しなおせば、Exif情報が削除された画像ファイルが作成できるはず。そう思って試してみたのだけどうまくいかない。画像ファイルを読み込んだBitmapインスタンスからはプロパティ項目を削除できるのだが、保存しなおした画像ファイルには削除したはずのプロパティ項目が復活しているのだ。おかしい。

テストコード

以下のコードで挙動を調べた。

結果と個人的な推察

インスタンス上で変更したプロパティ情報は、保存したファイルにも反映される。しかし、削除したプロパティ情報は保存したファイルでは復活してしまう。これは.NETのバグだろうか。いや、文書には書かれていないけど、恐らくは仕様だろう。僕の予想は以下の通り。

画像データに加えてメタ情報が格納されることで画像ファイルは以前に増して肥大化している。極端な例だけど、わずか5×5ピクセルの画像に10GBのメタデータが付加されることだってあり得る。もしImageクラスに画像ファイルの内容を全て保持するようにすると、オブジェクトが肥大化してメモリを圧迫するのは明らか。そこでImageクラスの設計者は、クラスの機能に必要なデータだけを保持することにした。その弊害として、オブジェクトを別ファイルに書き出しすと、元ファイルにあったメタ情報が継承されないという問題が起こる。これを回避するために、ファイルを書き出す際には元ファイルからメタ情報を直接転記するようにしたのだろう。

僕の予想が当たっているかどうかはわからないけど、もし仕様ならばきちんと文書に記して欲しい。挙動がはっきりわからなければ使えない。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です