0

I'm struggling a bit with pset4, it would be really helpful if I can get some advice. It does enlarge the size but create a faulty image.

I am trying to use 'recopy' method here. Could anybody help me with some advice?

Also, I was wondering why absis used for abs(bi.biHeight). Isn't biHeight already always positive integer?

int main(int argc, char *argv[]) { // ensure proper usage if (argc != 4 || atoi(argv[1]) > 100 || atoi(argv[1]) < 1 ) { fprintf(stderr, "Usage: ./copy 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)
{
    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;
}

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

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

// new padding
int 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);


// read infile's scanline, pixel by pixel
for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
{
    for (int j = 0; j < bi.biWidth; j++) //bi.biWidth[0]......bi.biWidth[j].
    {

        // temporary storage
        RGBTRIPLE triple; 

        // read RGB triple from infile
        fread(&triple, sizeof(RGBTRIPLE), 1, inptr);

        // write RGB triple to outfile
        fwrite(&triple, sizeof(RGBTRIPLE), n, outptr);
    }

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

    // insert padding if needed
    for (int k = 0; k < newpadding; k++)
    {
        fputc(0x00, outptr);
    }

    // go back the scanline
    for (int m = 0; m < n - 1; m++)
    {
        fseek(inptr, -(bi.biWidth + newpadding), SEEK_CUR);
    }
}

// close infile
fclose(inptr);

// close outfile
fclose(outptr);

// success
return 0;

}

1 Answer 1

0

There are a few problems here, first off after you horizontally resize the first row you are not vertically resizing that n times, you are merely skipping back your file cursor n-1 times. You need to do that whole thing of the horizontal resizing j loop plus skipping back once, n-1 times. Then do horizontal resizing one more time without skipping back so it goes onto the next line. Do this for the whole bi.height of the infile. Also I noticed a mistake which I made at first when I did this pset. A big clue is that when skipping back to the start of the infile's line fseek takes bytes not pixels (3 bytes) in its offset (second) parameter. Also bi.height is not always a positive integer. Check the header info in the Microsoft url they give you in the bmp.h comment section. You are close. Good luck!

2
  • Thank you so much for replying. I was mentally so frustrated that I put my faulty code here as a last resort and although it did really have many errors, including the one you mentioned about 'fseek', I somehow got motivated with your comment and looked again on the structure and the details that I missed. Your comment was very helpful, I just got it solved, literally 10 minutes before the library closes! Many thanks indeed.
    – hellocsk
    Mar 18, 2017 at 16:48
  • well done! always satisfying finishing these cs50 problems Mar 18, 2017 at 19:34

You must log in to answer this question.

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