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

问题描述 投票:0回答:1

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

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

我为此所见的所有解决方案都是针对JPEG,或针对System.Drawing用于.NET Core。对于获取像图像宽度和高度这样琐碎的东西,需要引用一个庞大的库对我来说似乎很荒谬,因此我认为我可以从文件的元数据中读取它们。

是否有用于查找图像文件宽度/高度的轻型跨平台解决方案(不需要具有很多其他用途的大型库?

c# .net-core cross-platform sdl sdl-2
1个回答
1
投票

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

实际上非常简单。正如退休忍者here指出的那样,PNG文件具有非常清晰定义的结构。

我正在寻找图像的宽度和高度,它在8字节长的标头之后是一个“块”。由于我确实确定我的图像格式将为PNG并且文件有效,因此我可以跳过所有验证和验证并直接跳到数据本身:宽度为16-20字节,高度为20-24字节(字节)块名称为8-12; IHDR是特殊的块类型,块的长度为12-16; 0,可能是因为它是特殊且固定大小的块)。我建议您查看上面链接的Wikipedia页面,以了解该格式的工作原理,它确实使它非常简单。我还用十六进制编辑器打开了一个PNG文件,以将真实示例与Wikipedia所述的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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.