0

I was trying to solve resize problem, I started by resizing horizontally, it worked, but the image is corrupted, because the code messes the padding part, I'm not sure I understand padding and the fseek() part, so a little help would be appreciated. this is the code till now: /** * Copies a BMP piece by piece, just because. */

include

include

include "bmp.h"

int main(int argc, char *argv[]) { int newPadding; int z=0; // ensure proper usage if (argc != 4) { fprintf(stderr, "Usage: ./copy infile outfile\n"); return 1; }

// remember filenames
int n=atoi(argv[1]);
char *infile = argv[2];
char *outfile = argv[3];

// open input file 
FILE *inptr = fopen(infile, "r");
if (inptr == NULL)
{
    fprintf(stderr, "Could not open %s.\n", infile);
    return 2;
}

// open output file
FILE *outptr = fopen(outfile, "w");
if (outptr == NULL)
{
    fclose(inptr);
    fprintf(stderr, "Could not create %s.\n", outfile);
    return 3;
}

// read infile's BITMAPFILEHEADER
BITMAPFILEHEADER bf;
fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);

// read infile's BITMAPINFOHEADER
BITMAPINFOHEADER bi;
fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);

// ensure infile is (likely) a 24-bit uncompressed BMP 4.0
if (bf.bfType != 0x4d42 || bf.bfOffBits != 54 || bi.biSize != 40 || 
    bi.biBitCount != 24 || bi.biCompression != 0)
{
    fclose(outptr);
    fclose(inptr);
    fprintf(stderr, "Unsupported file format.\n");
    return 4;
}


// determine padding for scanlines
int padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;

//determine new width & height
bi.biWidth=n*bi.biWidth;
bi.biHeight=n*bi.biHeight;
newPadding =  (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
bi.biSizeImage=((sizeof(RGBTRIPLE)*bi.biWidth)+newPadding)*abs(bi.biHeight);
bf.bfSize= bi.biSizeImage+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

// write outfile's BITMAPFILEHEADER
fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr);

// write outfile's BITMAPINFOHEADER
fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, outptr);

// iterate over infile's scanlines
for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
{


    // iterate over pixels in scanline
    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
        for(z=0;z<n;z++)
        fwrite(&triple, sizeof(RGBTRIPLE), n, outptr); //write to outfile n times


    }

    // skip over padding, if any
    fseek(inptr, padding, SEEK_CUR);

    // then add it back (to demonstrate how)
            for (int k = 0; k < padding; k++)
    {
             fputc(0x00, outptr);
    }

}

// close infile
fclose(inptr);

// close outfile
fclose(outptr);

// success
return 0;

}

1 Answer 1

0

You redefine bi.biWidth and bi.biHeight as new, outfile ones. However, in your loop you want to iterate over infile ones.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .