首页 > 后端开发 > C++ > 如何在 C# 中可靠地验证图像文件格式?

如何在 C# 中可靠地验证图像文件格式?

Barbara Streisand
发布: 2024-12-29 17:57:14
原创
686 人浏览过

How to Reliably Validate Image File Formats in C#?

如何在 C# 中验证图像文件格式

从文件加载图像时,验证对于防止诸如 OutOfMemoryExceptions 之类的错误至关重要。然而,仅仅依靠文件扩展名是不可靠的。

验证函数原型

bool IsValidImage(string fileName);
bool IsValidImage(Stream imageStream);
登录后复制

解决方案:基于字节签名的图像验证

可靠的方法是检查文件的字节签名,这提供有关其格式的信息。这是一个 C# 实现:

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

public static ImageFormat GetImageFormat(byte[] bytes)
{
    // Byte signatures for various image formats
    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

    // Compare the byte signatures to the input bytes
    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;
}
登录后复制

使用示例

// Example 1: Validate an image using a file path
if (IsValidImage(filePath))
{
    // Load the image safely
}

// Example 2: Validate an image using a stream
Stream imageStream = new FileStream(filePath, FileMode.Open);
if (IsValidImage(imageStream))
{
    // Load the image safely
}
登录后复制

以上是如何在 C# 中可靠地验证图像文件格式?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板