通过文件元数据查找 PNG 图像 width/height .NET Core 3.1 C#

Finding PNG image width/height via file metadata .NET Core 3.1 C#

我在 C# 中使用 .NET Core 3.1,并且在使用 SDL2(包括 SDL2_image)。

我需要找到一种在使用 SDL2_image.IMG_Load(Filename) 加载图像文件之前获取其宽度和高度的方法,因为如果图像尺寸超过 GPU 的最大纹理大小,这会崩溃。

我见过的所有解决方案都是针对 JPEG 的,或者 System.Drawing 用于 .NET Core 的。需要引用一个庞大的库来处理像获取图像宽度和高度这样微不足道的事情对我来说似乎很荒谬,所以我想我可以从文件的元数据中读取它们。

是否有任何轻量级、跨平台的解决方案(不需要具有许多其他预期用途的大型库)来查找图像文件的 width/height?

感谢 Jimi and Retired Ninja,我能够弄清楚如何从 PNG 文件中获取 width/height。

其实很简单。正如 Retired Ninja here 指出的那样,PNG 文件具有非常清晰定义的结构。

我正在寻找图像的宽度和高度,它们位于 8 字节长 header 之后的 "chunk" 中。因为我碰巧确定我的图像格式将是 PNG 并且文件有效,所以我可以跳过所有验证和验证并直接跳到数据本身:宽度为 16 - 20 字节,高度为 20 - 24(字节8 - 12 是块名称;IHDR,一种特殊的块类型,12 - 16 是块的长度;0,可能是因为它是一个特殊的 fixed-size 块)。我建议查看上面链接的维基百科页面以了解格式的工作原理,它确实非常简单。我还在十六进制编辑器中打开了我的一个 PNG 文件,将真实示例与维基百科上描述的 PNG 格式进行比较,使其更容易理解。

因此,我能够使用以下代码使其正常工作:

    public Size GetImageSize(string Filename)
    {
        BinaryReader br = new BinaryReader(File.OpenRead(Filename));
        br.BaseStream.Position = 16;
        byte[] widthbytes = new byte[sizeof(int)];
        for (int i = 0; i < sizeof(int); i++) widthbytes[sizeof(int) - 1 - i ] = br.ReadByte();
        int width = BitConverter.ToInt32(widthbytes, 0);
        byte[] heightbytes = new byte[sizeof(int)];
        for (int i = 0; i < sizeof(int); i++) heightbytes[sizeof(int) - 1 - i] = br.ReadByte();
        int height = BitConverter.ToInt32(heightbytes, 0);
        return new Size(width, height);
    }