2010-11-26 2 views
10

Этот код не работает при попытке вызвать Image.Save(MemoryStream, ImageFormat).Получить ImageFormat из System.Drawing.Image.RawFormat

я получаю исключение:

значение не может быть null.Parameter имя:. Кодировщика»

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

Это работает, если я прохожу в ImageFormat объект непосредственно, например, ImageFormat.Jpeg

Каков наилучший способ преобразования rawformat в ImageFormat (в идеале без оператора switch или много, если заявления)

Благодаря Бен

ответ

8

Я сожалею, я не нашел никакой возможности непосредственно извлечь «правильное» ImageFormat из разобранного или сгенерированного объекта Image.

Это мой код, вы можете принять его, сохранив статический элемент ImageFormat вместо 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"; 

Вы могли бы привести в порядок его, используя массив статических членов ImageFormat, но я думаю, вы не сможете избежать выключателя или петли.

С уважением, Matthias

+0

Что делать для .jpg? – Elnaz 2018-01-01 11:23:12

15

Я использую следующий метод Hepler для того же:

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

Хотя это не ответ на вопрос, это очень хороший способ избежать больших операторов switch/if. – 2011-11-10 13:22:48

5

вы ищете это?


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

VB.NET перевод ответа чебурек в:

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

Я попробовал метод чебурек сравнения с GUID. но для некоторых изображений png изображения не совпадали. поэтому мне пришлось написать логику, которая будет использовать как методы, упомянутые решением Маттиаса Уттке, так и решение Чебурека.

Сначала я проверил с ImageCodecinfo, и если код не нашел образ, то я сравнил изображение с помощью решения Matthias Wuttke.

если оба упомянутых выше решение не удалось, то использовали метод расширения, чтобы получить тип файла мим ..

если изменения типа пантомимы, то файл также меняется, мы вычисляли Загруженные файлы контрольной суммы в соответствии с контрольная сумма исходного файла на сервере .. поэтому для нас было важно получить правильный файл в качестве вывода.

 Смежные вопросы

  • Нет связанных вопросов^_^