DOBON.NET DOBON.NETプログラミング掲示板過去ログ

PNG画像への文字列の埋め込み

環境/言語:[VistaSP1]
分類:[.NET]

お世話になります。

PNG画像に任意の文字列を埋め込みたく試行錯誤したのですが
どうしても実現できません。

以下、ソースです。
using(MemoryStream StreamIn = new MemoryStream(File.ReadAllBytes(cnszPngFileName))) {
    PngBitmapDecoder dec = new PngBitmapDecoder(StreamIn, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);

    using(FileStream StreamOut = File.Open(cnszPngFileName, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite)) {
        PngBitmapEncoder enc = new PngBitmapEncoder();
        BitmapFrame frm = BitmapFrame.Create(dec.Frames[0]);
        enc.Frames.Add(frm);
        BitmapMetadata meta = (BitmapMetadata)frm.Metadata;
        meta.Comment = "Data";
        enc.Frames.Add(BitmapFrame.Create(frm, null, meta, null));
        enc.Save(StreamOut);
    }
}

Jpegは同様の方法でできたのですが、
Pngでは「このコーデックは、指定されたプロパティをサポートしていません。」という例外が発生してしまいます。

"tEXtチャンク"についても調べたのですが、WPFからどう操作すれば良いのかわからず
ここで質問させていただく事にしました。
どうぞよろしくお願いします。
埋め込む先は「PNG 画像」ではなく「PNG ファイル」って言った方が分かりやすいかと。「PNG 画像に文字列を埋め込む」だと画像に文字を描画しちゃうみたいにも聞こえますし。

png の場合、/tEXt/Comment クエリ文字列で SetQuery メソッドを使って書き込むようです。Comment プロパティは使えません。

> BitmapFrame frm = BitmapFrame.Create(dec.Frames[0]);
> enc.Frames.Add(frm);
> BitmapMetadata meta = (BitmapMetadata)frm.Metadata;
> meta.Comment = "Data";
> enc.Frames.Add(BitmapFrame.Create(frm, null, meta, null));
BitmapFrame を二つ作ってどっちも Frames に追加しちゃってますが、二回目の BitmapFrame.Create/BitmapEncoder.Frames.Add は不要ですよ?
Hongliang様

教えていただいた方法を試した所、実現することができました。

>BitmapFrame を二つ作ってどっちも Frames に追加しちゃってますが、二回目の BitmapFrame.Create/BitmapEncoder.Frames.Add は不要ですよ?
処理内容を理解して作っていないことがバレバレですね。。。
こちらもご指摘いただいた部分を削って何事もなく動作しました。

どうもありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板