I am having an issue with extracting the proper height and width of a png file. The width prints properly, but the height does not. I am currently inputting an image of height 2264 pixels * width 2382 pixels yet my output is this: Image width: 2382, Image height: 1229472850
. Below is my code, any suggestions would be helpful.
int loadImage(std::string fileName, void(*inputConversionType)()) {
// extract the file extension from the file name
size_t dotPos = fileName.rfind(".");
if (dotPos == std::string::npos) {
std::cout << "Error: invalid file name, no extension found" << std::endl;
return 1;
}
std::string extension = fileName.substr(dotPos 1);
// open the file in binary mode
std::ifstream file(fileName, std::ios::binary);
if (!file.is_open()) {
std::cout << "Error: unable to open file " << fileName << std::endl;
return 1;
}
// get the size of the file and read the contents into a buffer
file.seekg(0, std::ios::end);
int fileSize = file.tellg();
file.seekg(0, std::ios::beg);
std::vector<unsigned char> buffer(fileSize);
file.read(reinterpret_cast<char*>(&buffer[0]), buffer.size());
file.close();
if (extension == "png") {
if (buffer.size() < 24) {
std::cout << "Not a valid PNG file" << std::endl;
return 1;
}
std::vector<unsigned char>::iterator it = buffer.begin();
if (*it != 137 || *(it 1) != 80 || *(it 2) != 78 || *(it 3) != 71 || *(it 4) != 13 || *(it 5) != 10 || *(it 6) != 26 || *(it 7) != 10) {
std::cout << "Not a valid PNG file" << std::endl;
return 1;
}
// increment iterator by 8
it = 8;
std::string type(it, it 4);
it = 4;
unsigned int height = (*it << 24) | (*it << 16) | (*it << 8) | (*it );
unsigned int width = (*it << 24) | (*it << 16) | (*it << 8) | (*it );
std::cout << "Image width: " << width << ", Image height: " << height << std::endl;
}
}
I was expecting this to output the correct height and width of pixels and print it to the screen.
CodePudding user response:
The width and height are stored in the png header with width first then height, but you are reading height followed by width. Also it = 4
should be it = 8
this ensures you are in the correct position to read both values correctly.
This means that the last four lines of the corrected code are now:
it = 8;
unsigned int width = (*it << 24) | (*it << 16) | (*it << 8) | (*it );
unsigned int height = (*it << 24) | (*it << 16) | (*it << 8) | (*it );
std::cout << "Image width: " << width << ", Image height: " << height << std::endl;
This gives the expected output of:
Image width: 2382, Image height: 2264