PNG标题的阅读宽度和高度

Reading width and height of PNG header

本文关键字:高度 标题 PNG      更新时间:2023-10-16

我正在尝试读取PNG文件的宽度和高度。这是我的代码:

struct TImageSize {
    int width;
    int height;
};
bool getPngSize(const char *fileName, TImageSize &is) {
    std::ifstream file(fileName, std::ios_base::binary | std::ios_base::in);
    if (!file.is_open() || !file) {
        file.close();
        return false;
    }
    // Skip PNG file signature
    file.seekg(9, std::ios_base::cur);
    // First chunk: IHDR image header
    // Skip Chunk Length
    file.seekg(4, std::ios_base::cur);
    // Skip Chunk Type
    file.seekg(4, std::ios_base::cur);
    __int32 width, height;
    file.read((char*)&width, 4);
    file.read((char*)&height, 4);
    std::cout << file.tellg();
    is.width = width;
    is.height = height;
    file.close();
    return true;
}

如果我试着从维基百科的这张图片中读取,我会得到这些错误的值:

252097920(应为800)
139985408(应为600)

注意函数是而不是返回false,所以width和height变量的内容必须来自文件。

看起来你差了一个字节:

// Skip PNG file signature
file.seekg(9, std::ios_base::cur);

PNG规范规定标题长度为8字节,因此您希望将"9"改为"8"。位置从0开始

还需要注意的是,规范中说整数是网络(大端)顺序,所以你可能想要或需要使用ntohl(),或者在小端系统上转换字节顺序。

使用libpng或stb_image或类似的东西可能比尝试自己解析png更值得,除非您这样做是为了学习。

当你看便携式网络图形技术细节时,它说签名是8字节而不是9。

另外,您确定您的系统具有与PNG标准相同的字节顺序吗?Ntohl(3)将确保正确的字节顺序。