2

ストリームとしての標準出力から、別のプロセスから複数のpngを取得しています。このメモリストリームを取得して、複数のpngファイルとして保存したいと思います。を見てきましたがPngBitmapEncoder/PngBitmapDecoder、そこから複数のページを取得できないようです(を使用してデコーダーを作成するPngBitmapDecoder.Create場合decoder.Frames.Countは常に1です。デコーダーの作成方法は次のとおりです。

BitmapDecoder decoder = PngBitmapDecoder.Create(memStream,
                                                BitmapCreateOptions.PreservePixelFormat,
                                                BitmapCacheOption.Default);

私は何か間違ったことをしていますか?

4

4 に答える 4

3

複数ページのPNGのようなものはありません。
PNGデコーダーが複数のフレームを返すことはありません。

各画像を個別に読む必要があります。

于 2012-08-30T13:42:06.340 に答える
0

はい、マルチページ PNG のようなものがあります。これは MNG (マルチイメージ ネットワーク グラフィックス) と呼ばれます。PNG とほぼ同じくらい古いものです (MNG 形式については、libpng.org を確認してください)。

そして、それを助けることができるC#ライブラリがあります

http://www.codeproject.com/Articles/35289/NET-MNG-Viewer

過去 4 年間で、APNG (Animated Portable Network Graphics) と呼ばれる形式が受け入れられ、Firefox などのブラウザーで使用されるようになりました。C#用のラッパーがあります

https://code.google.com/p/sharpapng/

1 つのファイルのみを使用して複数の PNG を保存すると、複数のファイルを使用するよりもはるかに高速になります。

于 2013-07-31T18:08:05.003 に答える
0

msdn にサンプルがあります

http://msdn.microsoft.com/fr-fr/library/system.windows.media.imaging.bitmapdecoder.aspx

于 2012-08-30T13:43:41.643 に答える
0

標準出力からストリームとして別のプロセスから複数のpngを取得しています

これが何を意味するのかは明らかではありません。PNG は、1 つのファイルで複数の画像またはページをサポートしていません。単一のストリームとして連結された複数の PNG ファイルを受信して​​いますか? これが事実である場合 (かなり奇妙になります)、実際に PNG をデコードする必要はなく、ストリームを分割してそれぞれを (盲目的に) 別のファイルに書き込むだけです。手っ取り早い方法 (完全に確実というわけではありません) は、ストリームをスキャンしてPNG 署名(8 バイト) を探し、新しい画像の開始を検出することです。

連続するストリームをデコードしたい場合 (やり過ぎのようです)、このpngcs ライブラリを使用して、画像ごとに PngReader をインスタンス化できます。PngReader.ShouldCloseStream(false)各画像が終了したときにストリームが閉じないように必ず呼び出し てください。

于 2012-08-31T03:07:48.450 に答える