2010-11-26 2 views
10

Dieser Code schlägt fehl, wenn versucht wird, Image.Save(MemoryStream, ImageFormat) aufzurufen.ImageFormat von System.Drawing.Image.RawFormat abrufen

Ich bekomme die Ausnahme:

ein Wert nicht null.Parameter Name sein kann. Geber“

ImageFormat format = generatedImage.RawFormat as ImageFormat; 
image.ImageData = generatedImage.Save(format); 

Es funktioniert, wenn ich in einem ImageFormat Objekt direkt zB ImageFormat.Jpeg passieren

Wie konvertiert man am besten rawformat in ImageFormat (idealerweise ohne eine switch-Anweisung) oder viele if-Anweisungen)

Dank Ben

Antwort

8

Es tut mir leid, ich habe keine Möglichkeit, direkt eine „richtige“ Imageformat vom analysiert oder generiert Image-Objekt zu extrahieren.

Dies ist mein Code, den Sie verwenden können, indem Sie das statische ImageFormat-Element anstelle des Mimetyps speichern.

   if (image.RawFormat.Equals(ImageFormat.Jpeg)) 
        binary.MetaInfo.Mimetype = "image/jpeg"; 
       else if (image.RawFormat.Equals(ImageFormat.Bmp)) 
        binary.MetaInfo.Mimetype = "image/bmp"; 
       else if (image.RawFormat.Equals(ImageFormat.Emf)) 
        binary.MetaInfo.Mimetype = "image/emf"; 
       else if (image.RawFormat.Equals(ImageFormat.Exif)) 
        binary.MetaInfo.Mimetype = "image/exif"; 
       else if (image.RawFormat.Equals(ImageFormat.Gif)) 
        binary.MetaInfo.Mimetype = "image/gif"; 
       else if (image.RawFormat.Equals(ImageFormat.Icon)) 
        binary.MetaInfo.Mimetype = "image/icon"; 
       else if (image.RawFormat.Equals(ImageFormat.Png)) 
        binary.MetaInfo.Mimetype = "image/png"; 
       else if (image.RawFormat.Equals(ImageFormat.Tiff)) 
        binary.MetaInfo.Mimetype = "image/tiff"; 
       else if (image.RawFormat.Equals(ImageFormat.Wmf)) 
        binary.MetaInfo.Mimetype = "image/wmf"; 

Man könnte es durch die Verwendung einer Reihe von statischen Imageformat Mitglieder, aber ich denke, Sie werden nicht in der Lage sein, einen Schalter zu vermeiden oder eine Schleife aufzuräumen.

Mit freundlichen Grüßen, Matthias

+0

Was soll ich für .jpg tun? – Elnaz

15

Ich verwende folgende hepler Methode für die gleiche:

public static string GetMimeType(Image i) 
{ 
    var imgguid = i.RawFormat.Guid; 
    foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageDecoders()) 
    { 
     if (codec.FormatID == imgguid) 
      return codec.MimeType; 
    } 
    return "image/unknown"; 
} 
+0

Obwohl dies keine Antwort auf die Frage ist, ist es eine sehr gute Möglichkeit, große switch/if-Anweisungen zu vermeiden. –

+0

Arbeitete auch für mich! Ich übersetzte es in VB.NET für eine einfache Bildgrößenänderungsaufgabe. Ich füge das als Antwort hinzu, nur für den Fall, dass jemand es möchte. – BoffinbraiN

5

suchen Sie das?


System.Drawing.Imaging.ImageFormat fmt = new System.Drawing.Imaging.ImageFormat(generatedImage.RawFormat.Guid); 
0

Die VB.NET Übersetzung von Cheburek Antwort:

Private Function GetMimeType(i As Drawing.Image) As String 
    Dim imgguid As Guid = i.RawFormat.Guid 
    For Each codec As ImageCodecInfo In ImageCodecInfo.GetImageDecoders() 
     If (codec.FormatID = imgguid) Then 
      Return codec.MimeType 
     End If 
    Next 
    Return "image/unknown" 
End Function 
0

Ich versuchte Cheburek Verfahren zur Bestimmung der guid zu vergleichen. aber für einige png-bilder stimmen die guids nicht überein. Also musste ich eine Logik schreiben, die sowohl die von Matthias Wuttkes Lösung als auch die von Chebureks Lösung genannten Methoden verwendet.

Zuerst habe ich mit dem ImageCodecinfo gecheckt und wenn Code das Imageformat nicht findet dann habe ich das Imageformat mit Matthias Wuttkes Lösung verglichen.

beide, wenn die oben genannte Lösung gescheitert verwendet dann die Erweiterung Methode, um die Datei MIME-Typ zu bekommen ..

wenn der MIME-Typ ändert dann auch die Datei ändert, wurden wir die heruntergeladenen Dateien Prüfsumme Berechnung mit dem übereinstimmen Prüfsumme der Originaldatei auf dem Server. Für uns war es wichtig, die richtige Datei als Ausgabe zu erhalten.