パスワードを忘れた? アカウント作成
11148792 journal
日記

tsubu_csの日記: WPFでのメタデータ取り扱いで悩む

日記 by tsubu_cs

前回 (続、WPFを使った画像の加工方法で悩む) からの続き。
回転は自前で行うこととして、メタデータを維持する方法ではまる。

加工してもなるべく付帯情報は維持したいという話で、
WPFでのメタデータの取り扱いを 2~3週間探ってみた。
メタデータはBitmapMetadataクラスで取り扱っているらしい
……が、なんなのこれ。

最初深く考えずに BitmapFrame.Createでframeを取り出した後、
frame.Metadata を Clone() して流用しようしたが例外が発生。
ま、そういうこともあるよね~と、一から構築してみることにする。

■ 問題1
BitmapMetadataのコンストラクタ にあるパラメータの説明では、
「ビットマップ イメージの形式。"gif"、"jpg"、"png"、または "tiff" として指定します。」
とある。
ほうほうと思いつつ下に記載された例をみたら、列挙されていない
"exif" 使ってますやんか!

BitmapMetadata tiffMetadata = new BitmapMetadata("tiff");
tiffMetadata.SetQuery("/ifd/{ushort=1000}", 9999);
tiffMetadata.SetQuery("/ifd/{uint=1001}", 23456);
tiffMetadata.SetQuery("/ifd/{uint=1002}", 34567);
tiffMetadata.SetQuery("/ifd/PaddingSchema:padding", (UInt32)4096);
tiffMetadata.SetQuery("/ifd/exif", new BitmapMetadata("exif"));
tiffMetadata.SetQuery("/ifd/exif/PaddingSchema:padding", (UInt32)4096);

# 当然他のメタデータスキーマの場合どうすんのさと疑問に思うわけで

■ 問題2

var metadata = new BitmapMetadata("jpg");
var bmpframe = BitmapFrame.Create(frame, null, metadata, null);

と作ったmetadataをすぐに BitmapFrame.Create() に渡す例をみたので、
なるほどと思い"tiff"に代えたものでやってみたら例外発生。

TIFFの場合は何も書かないと例外を起こすみたい……
metadata.SetQuery("/ifd/PaddingSchema:padding", (UInt32)4096);
とか差しさわりのない文を入れると避けられる。

■ 問題3
SetQueryやGetQueryで使うクエリーの説明がない。
調べたらWICで使うクエリーが使えるみたいだけど、それでええんか?
C# 使う人が全て C++ みたいと思うのか?

■ 問題4
XMPというメタデータスキーマへのアクセスは、TIFFの場合 /ifd/xmp という
クエリーを使えばよいみたいなのだけど、例外が発生する。
(/ifd/{ushort=700} も同様だった)

JPEGのアクセスで使う /xmp ではTIFFでも発生しない
……が、それで正しいのかが分からない。
WICでの説明でもJPEGとTIFFはメタデータの構造違うからね~(意訳) と記載されてるし、
/xmpで正しいとも思えない。

--
という感じで、もうわけ分からん状態。
個人的には、metadata.Convert("tiff") とか簡単な指定でなるべく情報を
保ってくれるとありがたかったのだけど……
今の実装はさすがに丸投げし過ぎじゃないっすかね、MSさん
と愚痴がこぼれそう。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

計算機科学者とは、壊れていないものを修理する人々のことである

読み込み中...