【问题标题】:Determine whether an image is PNG despite .BMP extension尽管有 .BMP 扩展名,但确定图像是否为 PNG
【发布时间】:2013-05-30 02:25:39
【问题描述】:

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

 string x = Path.GetExtension(file);

由此我们确定它的扩展名是.bmp。现在问题在于检查它是否为 png 格式。我被困在这部分。

我这样做的原因是因为我想让我的图像透明,而 .bmp 图像不能很好地处理它。 谢谢!

【问题讨论】:

  • 查看接受的答案和第一条评论:stackoverflow.com/questions/670546/…
  • @GeorgeJohnston 即使文件的扩展名为 .bmp,最后 8 位也会是另一篇文章中的答案吗?有趣
  • @haysam 前 8 个字节,而不是后 8 位,但是是的 - 扩展名只是文件名的一部分,位图是 '.bmp' 而 PNG 是 '.png' 只是惯例
  • @Blorgbeard 谢谢你的帮助

标签: c# image


【解决方案1】:

读取文件的前 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
}

【讨论】:

  • 是的,您不能总是信任文件扩展名。您应该始终检查文件签名(前几个魔术字节)以确保文件实际上是它声称的类型。
  • -1 这是不正确的-@Andrew dh 的回答如下
【解决方案2】:

以上答案不正确,代码应该是:

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");

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      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
          }
      }
      

      【讨论】:

      • 读取整个图像比读取标题更昂贵。
      猜你喜欢
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 2021-03-19
      • 2016-06-28
      • 2014-07-07
      • 2016-01-04
      相关资源
      最近更新 更多