有没有办法在特定路径中获取png文件的尺寸?我不需要加载文件,我只需要在directx中加载纹理的宽度和高度。
(我不想使用任何第三方库)
答案 0 :(得分:11)
宽度是一个4字节的整数,从文件中的偏移量16开始。高度是从偏移量20开始的另一个4字节整数。它们都是网络顺序,因此您需要转换为主机顺序才能正确解释它们。
#include <fstream>
#include <iostream>
#include <winsock.h>
int main(int argc, char **argv) {
std::ifstream in(argv[1]);
unsigned int width, height;
in.seekg(16);
in.read((char *)&width, 4);
in.read((char *)&height, 4);
width = ntohl(width);
height = ntohl(height);
std::cout << argv[1] << " is " << width << " pixels wide and " << height << " pixels high.\n";
return 0;
}
答案 1 :(得分:6)
不,如果不阅读部分文件,就无法做到。幸运的是,如果您不需要读取实际的图像数据,文件头很简单,您可以在没有库的情况下读取它们。
如果你确定你有一个有效的PNG文件,你可以从偏移量16和20(每个4个字节,big-endian)读取宽度和高度,但是验证这个也是个好主意。文件的前8个字节正好是“89 50 4E 47 0D 0A 1A 0A”(十六进制),字节12-15正好是“49 48 44 52”(ASCII中的“IHDR”)。
答案 2 :(得分:3)
图像的大小位于标题中,因此您需要加载文件并解析标题。
因此,既然您不想使用第三方库,您可以随时查看PNG规范并实现自己的解析器。
答案 3 :(得分:1)
您可以随时手动解码文件,只需查找您感兴趣的位。Here's a link to an article about PNG file formats.。您正在寻找包含宽度和高度的IHDR块。它应该是文件中的第一位数据,因此应该很容易获得。