2017-06-14 2 views
2

J'ai une image au format png que je voudrais charger et convertir en flux bmp. Le code que je utilise pour ce faire est la suivante:System.Drawing.Image des données est différent entre l'enregistrement d'un fichier et un flux

 // Image.FromFile yields the same result. 
     FileStream originalFile = File.Open("image.png", FileMode.Open); 
     System.Drawing.Image fileImage = System.Drawing.Image.FromStream(originalFile); 

     MemoryStream bmpStream = new MemoryStream(); 
     fileImage.Save(bmpStream, System.Drawing.Imaging.ImageFormat.Bmp); 

Résultat: https://pastebin.com/raw/p1TBjnD1

Cependant, le flux ce produit est différent lors de l'enregistrement dans un fichier et l'ouvrir comme ceci:

 FileStream originalFile = File.Open("image.png", FileMode.Open); 
     System.Drawing.Image fileImage = System.Drawing.Image.FromStream(originalFile); 

     FileStream bmpStream; 
     fileImage.Save("image.bmp", System.Drawing.Imaging.ImageFormat.Bmp); 
     bmpStream = File.Open("image.bmp", FileMode.Open); 

Résultat: https://pastebin.com/raw/vSdRwZpL

Il semble y avoir une sorte de tête manquant lors de l'enregistrement d'un flux. Pourquoi est-ce, et comment puis-je facilement l'ajouter à mes flux sans avoir à enregistrer dans des fichiers?

Ma question n'est pas comment faire cela, mais pourquoi le flux n'inclut pas cet en-tête pendant que le fichier le fait.

+0

Copie possible de [System.Drawing.Image pour diffuser C#] (https://stackoverflow.com/questions/1668469/system-drawing-image-to-stream-c-sharp) –

+1

Je ne pense pas , c'est une question concernant pourquoi la sortie est différente pas comment le faire. – Cryru

+1

Pouvez-vous télécharger l'original png quelque part afin que nous puissions nous tester avec le même ensemble de données? –

Répondre

1

Ils ne sont pas différents, mais lorsque vous vider ou copier ou faire quelque chose d'autre avec un flux de mémoire, vous devez toujours le remettre à sa position initiale. Si vous ne réinitialisez pas la position, il est possible que vous n'ayez rien à lire dans le MemoryStream. Dans le cas de Image.Save(), c'est encore plus difficile car la méthode Save place la position MemoryStream au début des données d'image (après l'en-tête) en supposant que c'est ce que vous voulez.