2

我从另一个进程的标准输出作为流获取多个 png。我想把这个内存流保存为多个 png 文件。我看过PngBitmapEncoder/PngBitmapDecoder,但我似乎无法从中获得多页(每当我使用 来创建解码器时PngBitmapDecoder.Createdecoder.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

您在 msdn 上有示例

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

于 2012-08-30T13:43:41.643 回答
0

我从另一个进程的标准输出作为流获取多个png

目前尚不清楚这意味着什么。PNG 不支持在一个文件中包含多个图像或页面。您是否接收到多个连接为单个流的 PNG 文件?如果是这种情况(那会很奇怪),您实际上并不需要解码 PNG,只需拆分流并将每个(盲目地)写入不同的文件。一种快速而肮脏的方法(并非完全万无一失)是扫描流中的PNG 签名(8 个字节)以检测新图像的开始。

如果您想解码连续的流(似乎有点过分),您可以使用这个pngcs 库,为每个图像实例化一个 PngReader;只要确保调用 PngReader.ShouldCloseStream(false),以便在每个图像结束时流不会关闭。

于 2012-08-31T03:07:48.450 回答
0

是的,有一种多页 PNG。它被称为 MNG(多图像网络图形)。它几乎和 PNG 一样古老(查看 libpng.org 以了解 MNG 格式)。

还有一个 C# 库可以帮助你

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

在过去的 4 年中,一种称为 APNG(动画便携式网络图形)的格式开始被 Firefox 等浏览器接受和使用。C# 有一个包装器

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

仅使用一个文件保存多个 PNG 比使用多个文件要快得多。

于 2013-07-31T18:08:05.003 回答