Find image format using Bitmap object in C#

后端 未结 11 2524
半阙折子戏
半阙折子戏 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:05

    A couple of clean extension methods on type Image for determining this, based on the find by Alex above (ImageCodecInfo.GetImageDecoders()).

    This is highly optimized after the first call, as the static ImageCodecsDictionary is saved in memory (but only after it has been used once).

    public static class ImageCodecInfoX
    {
    
        private static Dictionary _imageCodecsDictionary;
    
        public static Dictionary ImageCodecsDictionary 
        {
            get
            {
                if (_imageCodecsDictionary == null) {
                    _imageCodecsDictionary =
                        ImageCodecInfo.GetImageDecoders()
                        .Select(i => {
                            var format = ImageFormats.Unknown;
                            switch (i.FormatDescription.ToLower()) {
                                case "jpeg": format = ImageFormats.Jpeg; break;
                                case "png": format = ImageFormats.Png; break;
                                case "icon": format = ImageFormats.Icon; break;
                                case "gif": format = ImageFormats.Gif; break;
                                case "bmp": format = ImageFormats.Bmp; break;
                                case "tiff": format = ImageFormats.Tiff; break;
                                case "emf": format = ImageFormats.Emf; break;
                                case "wmf": format = ImageFormats.Wmf; break;
                            }
                            return new ImageCodecInfoFull(i) { Format = format };
                        })
                        .ToDictionary(c => c.CodecInfo.FormatID);
                }
                return _imageCodecsDictionary;
            }
        }
    
        public static ImageCodecInfoFull CodecInfo(this Image image)
        {
            ImageCodecInfoFull codecInfo = null;
    
            if (!ImageCodecsDictionary.TryGetValue(image.RawFormat.Guid, out codecInfo))
                return null;
            return codecInfo;
        }
    
        public static ImageFormats Format(this Image image)
        {
            var codec = image.CodecInfo();
            return codec == null ? ImageFormats.Unknown : codec.Format;
        }
    }
    
    public enum ImageFormats { Jpeg, Png, Icon, Gif, Bmp, Emf, Wmf, Tiff, Unknown }
    
    /// 
    /// Couples ImageCodecInfo with an ImageFormats type.
    /// 
    public class ImageCodecInfoFull
    {
        public ImageCodecInfoFull(ImageCodecInfo codecInfo = null)
        {
            Format = ImageFormats.Unknown;
            CodecInfo = codecInfo;
        }
    
        public ImageCodecInfo CodecInfo { get; set; }
    
        public ImageFormats Format { get; set; }
    
    }
    

提交回复
热议问题