我正在尝试为一个类创建一个方法,该方法简单地读取PNG文件直到IHDR图像头的结尾(不包括其CRC32块)。问题在于每个“多字节”整数(即IHDR数据块长度、宽度和高度)。以下是我的代码:
#include <iostream>
#include <fstream>
using namespace std;
typedef struct PNG_HEADER pngHeader;
struct PNG_HEADER{
unsigned char PNGSignature[8];
size_t nb;
unsigned char ImageHeader[4];
size_t width;
size_t height;
unsigned char bitDepth;
unsigned char colorType;
unsigned char compressionMethod;
unsigned char filterMethod;
unsigned char interlaceMethod;
};
class testPNG{
public:
bool readPNGHeader(string filename){
pngHeader PNGheader;
ifstream file(filename.data(), std::ios_base::binary);
if(!file.is_open())
return false;
if( !file.read((char *)&PNGheader, sizeof(PNGheader)))
return false;
for(int i = 0; i < 8; i++)
printf("%d ", PNGheader.PNGSignature[i]);
printf("\n");
printf("%d\n", PNGheader.nb);
for(int i = 0; i < 4; i++)
printf("%d ", PNGheader.ImageHeader[i]);
printf("\n");
printf("%d\n", PNGheader.width );
printf("%d\n", PNGheader.height );
printf("%d\n", PNGheader.bitDepth );
printf("%d\n", PNGheader.colorType );
printf("%d\n", PNGheader.compressionMethod );
printf("%d\n", PNGheader.filterMethod );
printf("%d\n", PNGheader.interlaceMethod );
return true;
}
};
int main(void)
{
testPNG test;
test.readPNGHeader("test.png");
return 0;
}
以下是输出结果(注释在控制台上不显示):
137 80 78 71 13 10 26 10 //[PNG Signature OK!][1]
218103808 //this should read 13 as the length is the sum of the number of byte needed for each data field contained in the IHDR Data chunk that follows the IHDR Image Header chunk.
73 72 68 82 //[IHDR Image Header chunk OK!][2]
1879244800 //fail to give the correct width
973078528 //fail to give the correct height
8 // OK!
6 // OK!
0 // OK!
0 // OK!
0 // OK!
如w3c网站所述,数据块的长度值存储在"四字节无符号整数"中。图像的宽度和高度也是如此。我尝试了无符号整数和无符号短整数,但似乎都不起作用。
即使我使用了printf(我不知道如何使用cout将字符格式化为整数),如果可能的话,我正在寻找一个C++解决方案。
谢谢