通过文件元数据查找 PNG 图像宽度/高度 .NET Core 3.1 C#

M3r*_*ein 3 c# sdl cross-platform sdl-2 .net-core

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

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

我见过的所有解决方案要么适用于 JPEG,要么使用 System.Drawing for .NET Core。需要引用一个庞大的库来处理像获取图像宽度和高度这样的小事对我来说似乎很荒谬,所以我想我也许可以从文件的元数据中读取它们。

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

M3r*_*ein 8

感谢JimiRetired Ninja,我能够弄清楚如何从 PNG 文件获取宽度/高度。

其实很简单。PNG 文件具有非常清晰定义的结构,正如退休忍者 (Retired Ninja) 所指出的那样。

我正在寻找图像的宽度和高度,它位于 8 字节长标题后面的“块”中。由于我碰巧知道我的图像格式将是 PNG 并且该文件有效,因此我可以跳过所有验证和验证并直接跳到数据本身:宽度为 16 - 20 字节,高度为 20 - 24(字节) 8 - 12 是块名称;IHDR,一种特殊的块类型,12 - 16 是块的长度;0,可能是因为它是一个特殊的固定大小的块)。我建议查看上面链接的维基百科页面以了解该格式的工作原理,它确实使它变得非常简单。我还在十六进制编辑器中打开了我的一个 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);
    }
Run Code Online (Sandbox Code Playgroud)