如何检查文件是什么类型的图像?

巧克力

新成员
已加入
2020年12月15日
留言内容
2
编程经验
3-5
检查代码:


C#:
public enum ImageFormat
        {
            bmp,
            jpeg,
            gif,
            tiff,
            png,
            unknown
        }

        public static ImageFormat GetImageFormat(byte[] bytes)
        {
            var bmp = Encoding.ASCII.GetBytes("BM");     // BMP
            var gif = Encoding.ASCII.GetBytes("GIF");    // GIF
            var png = new byte[] { 137, 80, 78, 71 };    // PNG
            var tiff = new byte[] { 73, 73, 42 };         // TIFF
            var tiff2 = new byte[] { 77, 77, 42 };         // TIFF
            var jpeg = new byte[] { 255, 216, 255, 224 }; // jpeg
            var jpeg2 = new byte[] { 255, 216, 255, 225 }; // jpeg canon

            if (bmp.SequenceEqual(bytes.Take(bmp.Length)))
                return ImageFormat.bmp;

            if (gif.SequenceEqual(bytes.Take(gif.Length)))
                return ImageFormat.gif;

            if (png.SequenceEqual(bytes.Take(png.Length)))
                return ImageFormat.png;

            if (tiff.SequenceEqual(bytes.Take(tiff.Length)))
                return ImageFormat.tiff;

            if (tiff2.SequenceEqual(bytes.Take(tiff2.Length)))
                return ImageFormat.tiff;

            if (jpeg.SequenceEqual(bytes.Take(jpeg.Length)))
                return ImageFormat.jpeg;

            if (jpeg2.SequenceEqual(bytes.Take(jpeg2.Length)))
                return ImageFormat.jpeg;

            return ImageFormat.unknown;
        }

但我不确定如何使用它:

C#:
images = Directory.GetFiles(@"d:\satimages", "*.jpg");

            int counter = 0;

            foreach (string file in images)
            {
                using (var img = Image.FromFile(file))
                {
                    GetImageFormat(                
                }
            }

我要确保图像文件不是gif类型,然后将该文件转换为gif类型。
我已经有了转换方法,它可以很好地转换为gif,但是我想先检查文件是否不是gif,并且只有在不是gif的情况下,才将其转换为gif,但是我不确定如何使用GetImageFormat。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,510
地点
悉尼,澳大利亚
编程经验
10+
That method is expecting a byte array. How do you get a byte array from a file? It's not by calling Image.FromFile. There's no mention of an Image object anywhere in that code.
 
已加入
2018年10月4日
留言内容
11
地点
瑞典斯德哥尔摩
编程经验
10+
检查代码:


C#:
public enum ImageFormat
        {
            bmp,
            jpeg,
            gif,
            tiff,
            png,
            unknown
        }

        public static ImageFormat GetImageFormat(byte[] bytes)
        {
            var bmp = Encoding.ASCII.GetBytes("BM");     // BMP
            var gif = Encoding.ASCII.GetBytes("GIF");    // GIF
            var png = new byte[] { 137, 80, 78, 71 };    // PNG
            var tiff = new byte[] { 73, 73, 42 };         // TIFF
            var tiff2 = new byte[] { 77, 77, 42 };         // TIFF
            var jpeg = new byte[] { 255, 216, 255, 224 }; // jpeg
            var jpeg2 = new byte[] { 255, 216, 255, 225 }; // jpeg canon

            if (bmp.SequenceEqual(bytes.Take(bmp.Length)))
                return ImageFormat.bmp;

            if (gif.SequenceEqual(bytes.Take(gif.Length)))
                return ImageFormat.gif;

            if (png.SequenceEqual(bytes.Take(png.Length)))
                return ImageFormat.png;

            if (tiff.SequenceEqual(bytes.Take(tiff.Length)))
                return ImageFormat.tiff;

            if (tiff2.SequenceEqual(bytes.Take(tiff2.Length)))
                return ImageFormat.tiff;

            if (jpeg.SequenceEqual(bytes.Take(jpeg.Length)))
                return ImageFormat.jpeg;

            if (jpeg2.SequenceEqual(bytes.Take(jpeg2.Length)))
                return ImageFormat.jpeg;

            return ImageFormat.unknown;
        }

但我不确定如何使用它:

C#:
images = Directory.GetFiles(@"d:\satimages", "*.jpg");

            int counter = 0;

            foreach (string file in images)
            {
                using (var img = Image.FromFile(file))
                {
                    GetImageFormat(              
                }
            }

我要确保图像文件不是gif类型,然后将该文件转换为gif类型。
我已经有了转换方法,它可以很好地转换为gif,但是我想先检查文件是否不是gif,并且只有在不是gif的情况下,才将其转换为gif,但是我不确定如何使用GetImageFormat。
应该这样做,如果您担心性能,则不应该像这样读取完整的图像文件,而应该读取GetImageFormat方法所需的字节,但这是一种实现方法...
C#:
images = Directory.GetFiles(@"d:\satimages", "*.jpg");

            int counter = 0;

            foreach (string fileInfo in images)
            {
                    GetImageFormat(File.ReadAllBytes(fileInfo.FullPath));
           
            }
 
已加入
2018年10月4日
留言内容
11
地点
瑞典斯德哥尔摩
编程经验
10+
为什么只测试前4个字节时为什么要使用ReadAllBytes?该代码读取一个文件夹中的所有.jpg图像,每个文件和许多文件可能有兆字节,这可能会浪费大量内存和处理资源。
应该这样做,如果您担心性能,则不应该像这样读取完整的图像文件,而应该读取GetImageFormat方法所需的字节,但这是一种实现方法...
 
已加入
2018年10月4日
留言内容
11
地点
瑞典斯德哥尔摩
编程经验
10+
通常,似乎有一种观念是,最好指出一些问题,而不仅仅是在此论坛中提供替代(更好)的解决方案作为答案。这让我觉得是我不知道...在这个论坛上,语气被否定性/坏脾气所淹没?
从文件读取一些字节:
byte[] buffer = new byte[4];
try
{
     using (FileStream fs = new FileStream(image.Name, FileMode.Open, FileAccess.Read))
     {
          var bytes_read = fs.Read(buffer, 0, buffer.Length);
          fs.Close();

          if (bytes_read != buffer.Length)
          {
              // Couldn't read 4 bytes
          }
     }
}
catch (System.UnauthorizedAccessException ex)
{
     Debug.Print(ex.Message);
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,510
地点
悉尼,澳大利亚
编程经验
10+
通常,似乎有一种观念是,最好指出一些问题,而不仅仅是在此论坛中提供替代(更好)的解决方案作为答案。
这几乎就像我们要促使人们以正确的方向为自己思考,而不是仅仅给他们一些复制和粘贴的东西。那到底有多负面?您的意见可能会有所不同,但是事实证明,最好的学习方法就是做事。如果您尝试失败了,那么您总是可以问,但是如果您不尝试,那么您就不会像开发人员那样努力。例如,我经常倾向于沙发"answers"作为问题,因为我试图向人们指出他们应该问自己的问题。就个人而言,我在论坛上发帖的目的不仅仅是解决人们的问题,而是帮助人们成为他们所能做到的最好的开发人员。有时这涉及提供明确的解决方案,有时涉及使他们以不同的方式思考自己。对我来说,期待复制/粘贴解决方案而不是自己思考是很不利的。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
@Joakim ,欢迎您的贡献。  :)

但是,您还必须承认,他们的建议可能比您认为的建议更好。" 更好 "答案,最终,如果您的解决方案不受欢迎,您很可能会收到答复,告诉您原因。考虑到其他人为您提出的解决方案概述的逻辑,您应该将这些答复视为改善当前答案的技巧,而不应视之为苛刻的批评。约翰的两个观点都很好,可以帮助您提出更好的答案。

我们在这里主要指的是OP,还可以帮助其他提供建议答案的人,并通过提供关于如何将给定解决方案变为更好的解决方案和一些更改的可接受答案的建议来帮助他们。

至于:
否定性/坏脾气使这个论坛的语气过载了?
如果您有更多的证据,如果您想报告任何具体信息,我将通过VIA PM与您打开对话框,如有必要,我会将其转发给董事会的管理员。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,514
地点
弗吉尼亚州切萨皮克
编程经验
10+
据我所知,我是该委员会唯一的负面南希。这里的大多数其他人都非常非常鼓舞,并试图培养新的开发人员。就像我开玩笑说的那样 @谢平 ' "evil twin".  :)
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
最佳 底部