Find image format using Bitmap object in C#

后端 未结 11 2469
半阙折子戏
半阙折子戏 2020-11-29 19:50

I am loading the binary bytes of the image file hard drive and loading it into a Bitmap object. How do i find the image type[JPEG, PNG, BMP etc] from the Bitmap object?

相关标签:
11条回答
  • 2020-11-29 20:23

    one weird problem i faced when i was trying to get the mime type using imagecodeinfo.. for some png files the guids were not exactly same...

    first i was checking with the ImageCodecinfo and if code does not find the imageformat then i compared the imageformat using Matthias Wuttke's solution.

    if both the above mentioned solution failed then used the extension method to get the file mime type..

    if the mime type changes then the file also changes, we were calculating the downloaded files checksum to match with the checksum of the original file on the server .. so for us it was importent to get proper file as output.

    0 讨论(0)
  • 2020-11-29 20:25

    Based on Alex's work above (which I actually vote as the solution, since it's one line - but I can't vote yet haha), I came up with the following function for an image library. It requires 4.0

      Public Enum Formats
        Unknown
        Bmp
        Emf
        Wmf
        Gif
        Jpeg
        Png
        Tiff
        Icon
      End Enum
    
      Public Shared Function ImageFormat(ByVal Image As System.Drawing.Image) As Formats
        If Not System.Enum.TryParse(Of Formats)(System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders().ToList().[Single](Function(ImageCodecInfo) ImageCodecInfo.FormatID = Image.RawFormat.Guid).FormatDescription, True, ImageFormat) Then
          Return Formats.Unknown
        End If
      End Function
    
    0 讨论(0)
  • 2020-11-29 20:26

    Not to bother to on old topic, but to complete this discussion, I want to share my way to query all image formats, known by windows.

    using System.Diagnostics;
    using System.Drawing;
    using System.Drawing.Imaging;
    
    public static class ImageExtentions
    {
        public static ImageCodecInfo GetCodecInfo(this System.Drawing.Image img)
        {
            ImageCodecInfo[] decoders = ImageCodecInfo.GetImageDecoders();
            foreach (ImageCodecInfo decoder in decoders)
                if (img.RawFormat.Guid == decoder.FormatID)
                    return decoder;
            return null;
        }
    }
    

    Now you can use it as an an image extension as shown below:

    public void Test(Image img)
    {
        ImageCodecInfo info = img.GetCodecInfo();
        if (info == null)
            Trace.TraceError("Image format is unkown");
        else
            Trace.TraceInformation("Image format is " + info.FormatDescription);
    }
    
    0 讨论(0)
  • 2020-11-29 20:29

    If you want to know the format of an image, you can load the file with the Image class, and check its RawFormat property:

    using(Image img = Image.FromFile(@"C:\path\to\img.jpg"))
    {
        if (img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg))
        {
          // ...
        }
    }
    
    0 讨论(0)
  • 2020-11-29 20:30

    of course you can. ImageFormat doesn't mean much. ImageCodecInfo has much more meaning.

    red_dot.png

    red_dot.png

    <a href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==">
        <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="red_dot.png" title="red_dot.png"/>
    </a>
    

    code:

    using System.Linq;
    
    //...
    
    //get image
    var file_bytes = System.Convert.FromBase64String(@"iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==");
    var file_stream = new System.IO.MemoryStream(file_bytes);
    var file_image = System.Drawing.Image.FromStream(file_stream);
    
    //list image formats
    var image_formats = typeof(System.Drawing.Imaging.ImageFormat).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static).ToList().ConvertAll(property => property.GetValue(null, null));
    System.Diagnostics.Debug.WriteLine(image_formats.Count, "image_formats");
    foreach(var image_format in image_formats) {
        System.Diagnostics.Debug.WriteLine(image_format, "image_formats");
    }
    
    //get image format
    var file_image_format = typeof(System.Drawing.Imaging.ImageFormat).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static).ToList().ConvertAll(property => property.GetValue(null, null)).Single(image_format => image_format.Equals(file_image.RawFormat));
    System.Diagnostics.Debug.WriteLine(file_image_format, "file_image_format");
    
    //list image codecs
    var image_codecs = System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders().ToList();
    System.Diagnostics.Debug.WriteLine(image_codecs.Count, "image_codecs");
    foreach(var image_codec in image_codecs) {
        System.Diagnostics.Debug.WriteLine(image_codec.CodecName + ", mime: " + image_codec.MimeType + ", extension: " + @image_codec.FilenameExtension, "image_codecs");
    }
    
    //get image codec
    var file_image_format_codec = System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders().ToList().Single(image_codec => image_codec.FormatID == file_image.RawFormat.Guid);
    System.Diagnostics.Debug.WriteLine(file_image_format_codec.CodecName + ", mime: " + file_image_format_codec.MimeType + ", extension: " + file_image_format_codec.FilenameExtension, "image_codecs", "file_image_format_type");
    

    debug output:

    image_formats: 10
    image_formats: MemoryBMP
    image_formats: Bmp
    image_formats: Emf
    image_formats: Wmf
    image_formats: Gif
    image_formats: Jpeg
    image_formats: Png
    image_formats: Tiff
    image_formats: Exif
    image_formats: Icon
    file_image_format: Png
    image_codecs: 8
    image_codecs: Built-in BMP Codec, mime: image/bmp, extension: *.BMP;*.DIB;*.RLE
    image_codecs: Built-in JPEG Codec, mime: image/jpeg, extension: *.JPG;*.JPEG;*.JPE;*.JFIF
    image_codecs: Built-in GIF Codec, mime: image/gif, extension: *.GIF
    image_codecs: Built-in EMF Codec, mime: image/x-emf, extension: *.EMF
    image_codecs: Built-in WMF Codec, mime: image/x-wmf, extension: *.WMF
    image_codecs: Built-in TIFF Codec, mime: image/tiff, extension: *.TIF;*.TIFF
    image_codecs: Built-in PNG Codec, mime: image/png, extension: *.PNG
    image_codecs: Built-in ICO Codec, mime: image/x-icon, extension: *.ICO
    Built-in PNG Codec, mime: image/png, extension: *.PNG
    
    0 讨论(0)
提交回复
热议问题