2012-08-30 3 views
2

Je reçois plusieurs png d'un autre processus à partir de sa sortie standard en tant que flux. Je veux prendre ce flux de mémoire et l'enregistrer en tant que plusieurs fichiers png. Je l'ai regardé PngBitmapEncoder/PngBitmapDecoder, mais je ne peux pas sembler obtenir un multi-pages en sortir (chaque fois que je crée un décodeur à l'aide PngBitmapDecoder.Create, decoder.Frames.Count est toujours 1. Voici comment je crée le décodeur:C# enregistrement de plusieurs fichiers png à partir d'un MemoryStream

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

Am Je fait quelque chose de mal?

Répondre

3

Il n'y a pas une telle chose que plusieurs pages PNG
. un décodeur PNG ne reviendra plus d'une trame.

Vous devez lire chaque image séparément.

+0

La seule chose qui m'est donnée est un flux avec plusieurs pngs dedans - pouvez-vous pointer vers une direction générale où je devrais commencer à regarder? – jltest

+0

Essayez d'appeler 'Create()' plusieurs fois. – SLaks

0

Je reçois plusieurs PNGs d'un autre processus de sa sortie standard comme un flux

Il est pas clair ce que cela signifie. PNG ne prend pas en charge plusieurs images ou pages dans un fichier. Recevez-vous plusieurs fichiers PNG concaténés en un seul flux? Si tel est le cas (ce qui serait plutôt étrange), vous n'avez pas vraiment besoin de décoder les fichiers PNG, juste pour scinder le flux et écrire chacun (aveuglément) dans un fichier différent. Une approche rapide et sale (pas tout à fait infaillible) est de scanner le flux pour le PNG signature (8 octets) pour détecter le début d'une nouvelle image.

Si vous préférez décoder les flux successifs (semble trop), vous pouvez utiliser ce pngcs library, instanciant un PngReader pour chaque image; Assurez-vous simplement d'appeler PngReader.ShouldCloseStream(false) afin que le flux ne soit pas fermé lorsque chaque image se termine.

0

Oui, il existe un format PNG de plusieurs pages. C'est ce qu'on appelle MNG (Multiple-image Network Graphics). C'est presque aussi vieux que PNG (Vérifiez libpng.org pour le format MNG).

Et il y a une bibliothèque C# qui peut vous aider avec cette

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

Au cours des 4 dernières années, un format appelé APNG (Portable Network Animated Graphics) a commencé à être accepté et utilisé par les navigateurs comme Firefox. Il y a une enveloppe pour C#

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

Enregistrer plusieurs PNGs en utilisant un seul fichier sera beaucoup plus rapide que d'utiliser plusieurs fichiers.

Questions connexes