C# 确定图像是否为PNG(尽管扩展名为.BMP)

C# 确定图像是否为PNG(尽管扩展名为.BMP),c#,image,C#,Image,我想检查目录中的图像是否为png类型,但扩展名为.bmp。下面确定它是否是.bmp扩展名 string x = Path.GetExtension(file); 由此我们确定其扩展名为.bmp。现在问题在于检查它是否为png格式。我被这部分卡住了 我之所以这样做,是因为我希望我的图像是透明的,.bmp图像不能很好地与之配合。 谢谢大家! 读取文件的前4个字节: byte[] b = new byte[4]; using (var fs = new FileStream(filename))

我想检查目录中的图像是否为png类型,但扩展名为
.bmp
。下面确定它是否是
.bmp
扩展名

 string x = Path.GetExtension(file);
由此我们确定其扩展名为
.bmp
。现在问题在于检查它是否为png格式。我被这部分卡住了

我之所以这样做,是因为我希望我的图像是透明的,.bmp图像不能很好地与之配合。
谢谢大家!

读取文件的前4个字节:

byte[] b = new byte[4];
using (var fs = new FileStream(filename))
{
    fs.Read(b, 0, 4);
}
if (b.ToString().Contains("PNG"))
{
    // this is a png file
}

上述答案不正确,代码应为:

var header = new byte[4];
using (var fs = new FileStream(filename))
{
    fs.Read(header, 0, 4);
}

var strHeader = Encoding.ASCII.GetString(header);
return strHeader.ToLower().EndsWith("png");

我们可以用这个来检查文件扩展名

 Byte[] imageBase64 = ....

 var encodedFile = Encoding.ASCII.GetString(imageBase64);
 return encodedFile.ToLower().StartsWith("?png", StringComparison.InvariantCultureIgnoreCase);

这里是我个人喜欢的另一个例子,因为您不必检查字符串(使用System.Drawing库)


请参阅接受的答案和第一条评论:@GeorgeJohnston即使文件扩展名为.bmp,最后8位将是另一篇文章中的答案?Interesting@haysam前8个字节,不是最后8位,但是是的-扩展名只是文件名的一部分,位图是“.bmp”,png是“.png”@Blorgbeard,这是惯例。谢谢你的帮助。是的,你不能总是相信文件扩展名。您应该始终检查文件签名(前几个魔法字节),以确保文件实际上是它声称的类型。-1这是不正确的-下面由@Andrew dh Works生成的answr读取整个图像比读取标题更昂贵。
using (var fs = new FileStream(filename))
{
    var fsImage = System.Drawing.Image.FromStream(fs);
    if (fsImage.RawFormat == System.Drawing.Imaging.ImageFormat.Jpeg)
    {
       // Do something with Jpegs
    }
    else if (fsImage.RawFormat == System.Drawing.Imaging.ImageFormat.Png)
    {
       // Do something with Pngs
    }
}