|
■No89612 (なり さん) に返信 > もちろん、JPEGの場合には以下のように書き直して使用しています。 先の No89606 の投稿では、 dec を PngBitmapDecoder にしておいたうえで 『これで (Jpeg に)文字列を埋め込むことができました』 と書かれていたことに、ちぐはぐさを感じました…。(^^; (しかも enc の宣言が漏れている)
PngBitmapDecoder 版の不具合コードを示すなら、 Jpeg の話を述べた後の、Png 画像への追質問となる > これは一体どうすれば良いでしょうか? > 後、同様にPNG画像にも文字列を埋め込もうとしてみたのですが、 のあたりに記した方が良かったですね。
> テキストエディタで開いてASCIIとして確認しています。 せめてバイナリエディタや EXIF ビューワーの類を使うべきかと。
JPEG は ASCII ファイルでは無いですし、文字列部分だけを見るにしても、 非 ASCII 文字列の場合、開始位置が 1 バイトずれただけで 正しく読めなくなります。たとえば Shift_JIS における 0x8181 = 0x8182 ≠ 0x8281 a 0x8282 b などのように。
> バイナリエディタで確認したところ、 > XP Comment タグ 0x9c9c > として埋め込まれていることが分かりました。
XP Comment は UCS-2 を前提としているので、"Data" という 4 文字は、 44,00,61,00,74,00,61,00,00,00 として格納されるはずです。 恐らくは、この NULL 文字(0x00) を空白(0x20) と誤読されたのでしょう。
> これをASCIIデータとして埋め込みたいのですが > どのようにすれば良いですか?
UserComment であれば ASCII にも対応していますが、 XPComment は Unicode 前提のタグなわけですから、 そこに ASCII を埋め込むべきではないですよね。 それに、何故 ASCII で無ければならないのかも分からないです。
最初の質問を見る限りでは、文字列を COM 拡張セグメント (0xFF,0xFE) に 埋め込む話だったように見えましたが、途中から EXIF タグに埋め込む話に 変わっているようです。そもそも今回、文字列を埋め込む目的は何でしょうか。 埋め込んだ値を、どのようなアプリから利用しようとしているのでしょうか?
このまま当初の「目的」が明かされないまま「手段」を論じ続けると、迷走してしまいそうなので、 まずは、どういう目的で ASCII として埋め込もうとしているのかを明確にしてみてください。 内容次第では、何か代替案を出せる方が居るかもしれません。
本来は、利用側の使用目的に合わせて、格納先の領域を決めるべきとは思いますが、 たとえば ASCII 前提のエントリならどこでも良いというのなら、 EXIF で データタイプ 2 (ASCII) なタグ (たとえば 0x010E の ID) を使うこともできますし、 0x9286 の ID (User Comment) で ASCII モードを指定することもできますよね。 あるいは、未使用の 最初の質問通りに「セグメント」を用いて、 当初の COM (0xFFFE) セグメントや未使用の APP# (0xFFE#) セグメントを使うとか。
もちろん、そのために必要な記述はそれぞれ異なってくるでしょうし、格納先によっては、 GDI+ ライブラリ (System.Drawing 名前空間)や WPF(Avalon) ライブラリ (System.Windows 名前空間)ではなく、 オープンソースのライブラリ等に頼ることになるかもしれません。
|