gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:05:16 26 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

关于c# - 通过文件元数据 .NET Core 3.1 C# 查找 PNG 图像宽度/高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60857830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com