C++如何获取目录中PNG文件的图像尺寸

9

有没有一种方法可以获取特定路径中png文件的尺寸?我不需要加载文件,只需要宽度和高度即可在DirectX中加载纹理。

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

5个回答

16

文件中宽度从偏移量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>


7
不,你不能在不读取文件的一部分的情况下完成它。幸运的是,文件头足够简单,如果您不需要读取实际的图像数据,则可以在没有库的情况下读取它们。
如果您确定拥有有效的PNG文件,则可以从偏移16和20(每个4字节,大端)读取宽度和高度,但验证文件的前8个字节是否完全为“89 50 4E 47 0D 0A 1A 0A”(十六进制),以及字节12-15是否完全为“IHDR”(ASCII码)也可能是一个好主意。

3

根据@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);
        }

3

图片的大小信息在文件头中,因此您需要加载文件并解析文件头。

因此,如果您不想使用第三方库,您可以查看PNG规范并实现自己的解析器。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接