【发布时间】:2014-04-20 03:46:27
【问题描述】:
我正在尝试为一个类创建一个方法,该方法只读取 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;
}
打印出来的结果是这样的(控制台上明显没有显示cmets):
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 网站上所写的那样; (数据块的)长度值存储在 "A four-byte unsigned integer" 中。图像的the width and height 也是如此。所以我也尝试了 unsigned int 和 unsigned short ,但似乎没有任何效果。
即使我使用了 printfs(我不知道如何使用 cout 将字符格式化为整数),但如果可能的话,我正在寻找 C++ 解决方案。
谢谢
【问题讨论】: