I'm able to resize a given .bmp horizontally, but the code for vertical resizing is not working. Here is my code for vertical expansion.
// resize vertically
//move pointer to start of scanline of outptr
fseek(outptr, -3 * (bi2.biWidth + padding), SEEK_CUR);
fgetpos (outptr,&pos);
//an array of RGBTRIPLE to store one scanline
RGBTRIPLE triple[bi2.biWidth + padding];
//reading the already written first line
for (int p = 0 ; p < bi2.biWidth + padding; p++)
{
fread(&triple[p], sizeof(RGBTRIPLE), 1, outptr);
}
fgetpos (outptr,&pos);
//writing the copied array to outptr
for (int k = 0 ; k < n; k++)
{
for (int p = 0 ; p < bi2.biWidth + padding; p++)
fwrite(&triple[p], sizeof(RGBTRIPLE), 1, outptr);
}
This is executed after reading the first scanline of the original bmp. I used gdb to see the values of triple
's elements, but I found that they're all garbage values.
Also when I check the position of the file position indicator in outptr
using fgetpos()
, I find it not changing!
Update: here's my code after modifications
// iterate over infile's scanlines
fpos_t pos;
for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
{
// iterate over pixels in scanline
fgetpos (outptr,&pos);
for (int j = 0; j < bi.biWidth; j++)
{
// temporary storage
RGBTRIPLE triple;
// read RGB triple from infile
fread(&triple, sizeof(RGBTRIPLE), 1, inptr);
// write RGB triple to outfile n times horizontally
for (int k = 0 ; k < n; k++)
{
fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
}
}
// skip over padding in infile, if any
fseek(inptr, padding_in, SEEK_CUR);
// then add padding to outfile
for (int l = 0; l < padding; l++)
{
fputc(0x00, outptr);
}
// resize vertically
//move pointer to start of scanline of outptr
fsetpos( outptr, &pos );
//an array of RGBTRIPLE to store one scanline
RGBTRIPLE triplex[bi2.biWidth];
//reading the already written first line
for (int m = 0 ; m < bi2.biWidth ; m++)
{
fread(&triplex[m], sizeof(RGBTRIPLE), 1 , outptr);
}
//skip padding
fseek(outptr, padding, SEEK_CUR);
for (int mn = 0 ; mn < n ; mn++)
{
//writing the copied array to outptr
for (int o = 0 ; o < bi2.biWidth ; o++)
{
fwrite(&triplex[o], sizeof(RGBTRIPLE), 1 , outptr);
}
for (int p = 0; p < padding; p++)
{
fputc(0x00, outptr);
}
}
}