我正在使用带有C#的.NET Core 3.1,并且正在使用SDL2(包括SDL2_image)。
我需要找到一种方法来使用SDL2_image.IMG_Load(Filename)
加载图像文件,然后再获取其宽度和高度,因为如果图像的尺寸超过GPU的最大纹理大小,则会崩溃。
我为此所见的所有解决方案都是针对JPEG,或针对System.Drawing用于.NET Core。对于获取像图像宽度和高度这样琐碎的东西,需要引用一个庞大的库对我来说似乎很荒谬,因此我认为我可以从文件的元数据中读取它们。
是否有用于查找图像文件宽度/高度的轻型跨平台解决方案(不需要具有很多其他用途的大型库?
由于Jimi和Retired 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);
}