Com*_*eek 4 c++ file-io png image file
我正在尝试读取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;
}
Run Code Online (Sandbox Code Playgroud)
如果我试图从维基百科的这张图片中读取,我会得到这些错误的值:
252097920(应为800)
139985408(应为600)
请注意,该函数不返回false,因此width和height变量的内容必须来自文件.
它看起来像是一个字节:
// Skip PNG file signature
file.seekg(9, std::ios_base::cur);
Run Code Online (Sandbox Code Playgroud)
该PNG规范说的头是8个字节长,所以你想要的"9"是一个"8"来代替.职位从0开始.
另请注意,规范说整数是网络(大端)顺序,因此如果您使用的是小端系统,则可能需要或需要使用ntohl()或以其他方式转换字节顺序.
可能值得使用libpng或stb_image或类似的东西,而不是试图自己解析png - 除非你这样做是为了学习.
| 归档时间: |
|
| 查看次数: |
5557 次 |
| 最近记录: |