2010-11-26 1391 views
10

Este código falla al intentar llamar al Image.Save(MemoryStream, ImageFormat).Obtener ImageFormat desde System.Drawing.Image.RawFormat

tengo la excepción:

un valor no puede ser null.Parameter nombre:. Codificador"

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

Funciona si paso en un objeto ImageFormat directamente por ejemplo ImageFormat.Jpeg

¿Cuál es la mejor forma de convertir el rawformat en ImageFormat (idealmente sin una declaración de interruptor? o un montón de sentencias if)

Gracias Ben

Respuesta

8

Lo siento, no he encontrado ninguna posibilidad de extraer directamente una ImageFormat "correcta" del objeto de imagen analizada o generado.

Este es mi código, puede adoptarlo almacenando el miembro estático ImageFormat en lugar del tipo mimetype.

   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"; 

Se podría poner en orden la conexión utilizando un conjunto de miembros ImageFormat estáticas, pero creo que no será capaz de evitar un interruptor o un bucle.

Saludos cordiales, Matthias

+0

¿Qué debería hacer para .jpg? – Elnaz

15

utilizo siguiente método hepler para el mismo:

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

Aunque esta no es una respuesta a la pregunta, es una muy buena forma de evitar declaraciones grandes de interruptor/si. –

+0

¡Trabajó para mí también! Lo traduje a VB.NET para una simple tarea de cambio de tamaño de la imagen. Agregaré eso como una respuesta por si alguien lo quiere. – BoffinbraiN

5

se busca para esto?


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

La traducción de la respuesta de VB.NET Cheburek:

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

me trataron método Cheburek de comparar el GUID. pero para algunas de las imágenes png las guids no coincidían. así que tuve que escribir una lógica que usará los métodos mencionados por la solución de Matthias Wuttke y la solución de Cheburek.

primero estaba comprobando con el ImageCodecinfo y si el código no encuentra el formato de imagen, entonces comparé el formato de imagen con la solución de Matthias Wuttke.

si tanto la solución mencionada no se utiliza el método de extensión para obtener el tipo de archivo MIME ..

si cambia el tipo MIME a continuación, el archivo también cambia, nos cálculo de la suma de comprobación de los archivos descargados para que coincida con el suma de comprobación del archivo original en el servidor ... así que para nosotros fue importante obtener el archivo correcto como salida.

Cuestiones relacionadas