I'm having problems with the header manipulation. My code seems to factor well images but it doesn't calculate well bi.biSizeImage
and bf.bfSize
.
This is what I've done:
// read infile's BITMAPFILEHEADER. Is going to read 1 object of size BITMAPFILEHEADER from inptr and place it in the adress pointed by &bf
BITMAPFILEHEADER bf;
fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);
// read infile's BITMAPINFOHEADER. Is going to read 1 object of size BITMAPINFOHEADER from inptr and place it in adress pointed by &bi
BITMAPINFOHEADER bi;
fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);
// save BITMAPFILEHEADER and BITMAPINFOHEADER from infile
BITMAPFILEHEADER bf_original = bf;
BITMAPINFOHEADER bi_original = bi;
int original_padding = (4 - (bi_original.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
// update outfile's BITMAPINFOHEADER by factor
bi.biWidth = bi.biWidth * factor;
bi.biHeight = bi.biHeight * factor;
int padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
bi.biSizeImage = bi.biWidth * abs(bi.biHeight) * sizeof(RGBTRIPLE) + padding * abs(bi.biHeight);
bf.bfSize = bi.biSizeImage + sizeof(BITMAPFILEHEADER);
// write outfile's BITMAPFILEHEADER. Is going to write from buffer bf, 1 object of size BITMAPFILEHEADER to outputr
fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr);
// write outfile's BITMAPINFOHEADER. Is going to write from bugger bf, 1 object of size BITMAPINFOHEADER to outputr.
fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, outptr);
Now, this code gives me completely wrong metadata info. For example, for a 3x3 image resized by a factor of 4, these are the results:
offset type name staff me
2 DWORD bfSize 000001e6 00000032
34 DWORD biSizeImage 000001b0 00000024
Been trying to debug this for a while now and I'm burnout and frustated. I just don't understand why it doesn't work. It should be working.