I am trying to create a method for a class that simply reads the PNG file up to the end of the IHDR Image header (without its CRC32 chunk. The trouble comes with every "more than one byte" integers (i.e IHDR data chunk length, width and height). Here is my code:
#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;
}
And the printed result is this (comments not shown on the console obviously):
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!
As it is written on the w3c website; the length value (of data chunk) is stored in "A four-byte unsigned integer" . The same goes with the width and height of the image. And so I tried unsigned int and unsigned short too but nothing seems to work.
Even though I used printfs (I don't know how to format chars as ints with cout), I am looking for a C++ solution if possible.
Thank you