Получить ImageFormat от System.Drawing.Image.RawFormat - PullRequest
10 голосов
/ 26 ноября 2010

Этот код не работает при попытке вызова Image.Save(MemoryStream, ImageFormat).

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

Значение не может быть нулевым. Имя параметра: encoder "

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

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

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

СпасибоBen

Ответы [ 8 ]

16 голосов
/ 14 июня 2011

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

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";
}
9 голосов
/ 26 апреля 2011

Извините, я не нашел возможности напрямую извлечь "правильный" ImageFormat из проанализированного или сгенерированного объекта Image.

Это мой код, вы можете принять его, сохранив статический член ImageFormatmimetype.

                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, но я думаю, что вы не сможете избежать переключения или цикла.

С уважением, Матиас

6 голосов
/ 12 ноября 2012

вы ищете это?


System.Drawing.Imaging.ImageFormat fmt = new System.Drawing.Imaging.ImageFormat(generatedImage.RawFormat.Guid);
1 голос
/ 17 марта 2013

Существует также способ сохранить Image в его RawFormat до некоторого Stream. Смотри http://bytes.com/topic/c-sharp/answers/944402-how-access-raw-image-data-resource-file#post3733044

Для меня это работает следующим образом:

byte[] GetRawImageData(Image img)
{
    using(MemoryStream ms = new MemoryStream())
    {
        img.Save(ms, img.RawFormat);
        return ms.ToArray();
    }
}
0 голосов
/ 30 января 2019

Свежий, современный и общий ответ для поиска расширения изображения в RawFormat и сохранения выглядит так:

var formatDescription = ImageCodecInfo.GetImageDecoders().FirstOrDefault(w => w.FormatID == image.RawFormat.Guid)?.FormatDescription;

filePath = Path.ChangeExtension(filePath, formatDescription);

image.Save(filePath);
0 голосов
/ 27 марта 2018

Cesare Imperiali * Ответ 1001 * выше сработал в моих тестах.Единственным недостатком (если это имеет значение) является то, что .ToString () для Jpeg возвращает «[ImageFormat: b96b3cae-0728-11d3-9d7b-0000f81ef32e]» вместо «Jpeg».

Если это имеет значение дляВы можете получить точный статический формат ImageFormat с меньшим количеством кода следующим образом:

public static class ImageFilesHelper
{
    public static List<ImageFormat> ImageFormats =>
        typeof(ImageFormat).GetProperties(BindingFlags.Static | BindingFlags.Public)
          .Select(p => (ImageFormat)p.GetValue(null, null)).ToList();

    public static ImageFormat ImageFormatFromRawFormat(ImageFormat raw) =>
        ImageFormats.FirstOrDefault(f => raw.Equals(f)) ?? ImageFormat.Bmp;

}
// Usage:
var format = ImageFilesHelper.ImageFormatFromRawFormat(Image.FromFile(myFile).RawFormat);
0 голосов
/ 12 марта 2014

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

Сначала я проверял ImageCodecinfo и, если код не находит формат изображения, я сравнил формат изображения, используя решение Матиаса Ваттке.

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

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

0 голосов
/ 17 января 2014

Перевод Чебурека на 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
...