0

It is able to resize horizontally and vertically but i am not getting the correct enlarged image.

include

include

include "bmp.h"

int main(int argc, char* argv[]) { // ensure proper usage if (argc != 4) { printf("Usage: ./resize n 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)
{
    printf("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;
}

// write outfile's BITMAPFILEHEADER
BITMAPFILEHEADER bf_resize;
BITMAPINFOHEADER bi_resize;
bf_resize=bf;
bi_resize=bi;


bi_resize.biWidth=bi.biWidth*n;
bi_resize.biHeight=bi.biHeight*n;

 int padding1 =  (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
 int padding2=(4 - (bi_resize.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;

bi_resize.biSizeImage=((bi_resize.biWidth*sizeof(RGBTRIPLE)+padding2)*(abs(bi_resize.biHeight)*sizeof(RGBTRIPLE)));
bf_resize.bfSize=bi_resize.biSizeImage+54;

// write outfile's BITMAPINFOHEADER
fwrite(&bf_resize, sizeof(BITMAPFILEHEADER), 1, outptr);
fwrite(&bi_resize, sizeof(BITMAPINFOHEADER), 1, outptr);


// determine padding for scanlines


// 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(int m=0;m<n;m++)
        {
        fwrite(&triple,sizeof(RGBTRIPLE),1,outptr);  
        }
    }
    // skip over padding, if any
    fseek(inptr, padding1, SEEK_CUR);

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

//go over the start position again for vertical resizing. fseek(inptr,((bi.biWidthsizeof(RGBTRIPLE)+padding2)(abs(bi.biHeight)*sizeof(RGBTRIPLE))),SEEK_CUR); for(int p=0;p for(int q=0;q

        fread(&triple,sizeof(RGBTRIPLE),1,inptr);

        for(int r=0;r<n;r++)
        {
            fwrite(&triple,sizeof(RGBTRIPLE),1,outptr);
        }
    }
}
// close infile
fclose(inptr);

// close outfile
fclose(outptr);

// that's all folks
return 0;

}

2
  • You should add more spaces to fix the part of your code that is not displaying as formatted code.
    – Evan
    Commented Jul 1, 2016 at 16:49
  • Check your header info with peek, make sure it all matches
    – David M
    Commented Jul 1, 2016 at 23:29

1 Answer 1

1

You have problems in two areas. First, you have header values that are incorrectly calculated. Run ./resize 1 small.bmp s2.bmp and compare the two files using peek. They should be identical. You should quickly see the problem.

Next, your vertical scaling has serious issues. The first for loop does a fine job with processing the file for a resize factor of 1, but then you have a second for loop to scale it vertically. The input file has already hit EOF. After that, the fseek then moves the pointer well beyond the end of the input file. In short, the entire last for loop does nothing because reinitializes triple, then it reads nothing, therefore prints nothing (which is disturbing in itself. It should write something.) Anyways, the big picture is that the code should be writing copies of each horizontal line as each line is processed. It can't write one copy of every line and go back and write another set and another set until it has repeated n times.

This should get you started. If this answers your question, please click on the check mark to accept. Let's keep up on forum maintenance. ;-)

You must log in to answer this question.

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