C ++如何获取png文件的图像大小(在目录中)

时间:2011-03-18 15:47:22

标签: c++ image png

有没有办法在特定路径中获取png文件的尺寸?我不需要加载文件,我只需要在directx中加载纹理的宽度和高度。

(我不想使用任何第三方库)

4 个答案:

答案 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块。它应该是文件中的第一位数据,因此应该很容易获得。