首页 >后端开发 >C++ >在将图像文件加载到内存之前,如何在 C# 中验证图像文件?

在将图像文件加载到内存之前,如何在 C# 中验证图像文件?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-04 09:46:35920浏览

How Can I Validate Image Files in C# Before Loading Them into Memory?

在 C# 中验证图像文件

从文件加载图像时,验证其真实性和完整性非常重要,以防止潜在的错误或安全性漏洞。本文解决了在将图像文件完全读入内存之前对其进行验证的问题。

当图像文件(例如“image.jpg”)实际上可能不是 JPG 格式时,就会出现问题。当使用 Image.FromFile(filePath) 等图像加载函数处理图像时,这可能会导致异常,例如 OutOfMemory Exception。

解决方案是使用一个可以在给定文件路径的情况下验证图像的函数或流。示例函数原型可以是:

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 patterns for different 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

    // Check byte sequences to determine image format
    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# 中验证图像文件?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn