有没有一种方法可以获取特定路径中png文件的尺寸?我不需要加载文件,只需要宽度和高度即可在DirectX中加载纹理。
(而且我不想使用任何第三方库)
文件中宽度从偏移量16开始是一个4字节整数,高度是从偏移量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;
}
目前的代码适用于Windows。如果需要在Linux(或*bsd等)上使用,您需要将<winsock.h>
替换为#include <arpa/inet.h>
。
根据@Jerry的答案,但不包括winsock.h文件
void get_png_image_dimensions(std::string& file_path, unsigned int& width, unsigned int& height)
{
unsigned char buf[8];
std::ifstream in(file_path);
in.seekg(16);
in.read(reinterpret_cast<char*>(&buf), 8);
width = (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + (buf[3] << 0);
height = (buf[4] << 24) + (buf[5] << 16) + (buf[6] << 8) + (buf[7] << 0);
}
图片的大小信息在文件头中,因此您需要加载文件并解析文件头。
因此,如果您不想使用第三方库,您可以查看PNG规范并实现自己的解析器。