PNG标题的阅读宽度和高度
Reading width and height of PNG header
我正在尝试读取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)将确保正确的字节顺序。
相关文章:
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 对于C++,方括号中的标题必须总是在引号中的标题之上吗
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- 为什么我不应该把所有东西都放在标题中?
- C++:如何根据地形高度更新玩家身高?
- WinAPI 检查窗口是否具有常规标题栏
- 如何更改QComboBox项目的高度大小?
- 如何更改窗体上所有控件的标题?[C++生成器]
- 提升用于解析标题列的精神语法
- 更改高度贴图,使其在 4x4 网格上显示 16 个 hieghtmap
- 我试图用这段代码找到二叉树的高度,但它一直返回 0,有人可以告诉我为什么吗?
- 所以我正在为我的学校作业练习继承,但我无法正确实施标题保护
- C++:如何计算二叉树中其值模块高度小于 2 的节点数?
- 如何删除已输入的书以及如何使标题,语言和名称在上面放置空格不会出错?
- 使用类 ?C++ 和 SFML 以及标题中的 15 个字符
- Gtkmm 窗口为空白,不显示任何小部件或标题
- 我将如何在 cpp 中生成一个随机且独特的标题
- 如何查找QDockWidget标题栏的高度
- 从标题(宽度、高度等)获取图像信息,而无需打开它
- PNG标题的阅读宽度和高度