When I run my program by imputing 1, it prints out an exact copy (like it should). But, when I try running my program by imputing 2 (or anything else), it prints out the same size image with seemingly random colored pixels.

I am pretty sure I have to update the info header,but I am not sure how. When I try to change bfSize, height, etc, my file won't compile. All help is greatly appreciated, thank in advance!

This is what would not compile:

new_bfSize = bfSize * grow;
new_biHeight = biHeight * grow;
new_biWidth = biWidth * grow;
new_biSizeImage = new_biWidth + sizeof(RGBTRIPLE) + padding2 + abs(new_biHeight);
newbfSize = new_biSizeImage + sizeof(BITMAPINFOHEADER);

Here is my code(without that section):

int main (int argc, char* argv[])

{ // ensure proper usage if (argc != 4) { printf("Usage: ./copy infile outfile\n"); return 1; }

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

//make sure number is greater than 1 and less than 100
if ( grow < 1 || grow > 101)
    printf("Your number must be greater than one and less than 100.\n");
    return 2; // 2?

// 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)
    fprintf(stderr, "Could not create %s.\n", outfile);
    return 3;

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

// read infile's BITMAPINFOHEADER
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)
    fprintf(stderr, "Unsupported file format.\n");
    return 4;

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

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

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

// iterate over infile's scanlines
for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
    // repeat rows
    for (int g = 0; g< grow; g++)
        // 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);

            // repeat
            for (int l = 0; l < grow; l++)
                // write RGB triple to outfile
                fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);


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

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

// close infile

// close outfile

// that's all folks
return 0;


Thank you so much!


Based on the information in your question, I'd say that you're getting undeclared variable errors when you try to compile. It looks like the root problem is a lack of understanding on how to access and/or change structure elements. You should review the class material on structs.

Look at your line of code: new_bfSize = bfSize * grow; Because of the way this line is written, the compiler treats bfSize as a simple var, not an element of a struct. Since it wasn't declared anywhere, it causes a compile error. I don't see new_bfSize declared anywhere, so whether it is supposed to be a struct element or a simple var, it will also generate a compile error.

Assuming new_bfSize was supposed to be a simple var, the code should have looked like this:

int new_bfSize = bf.bfSize * grow;

This both declares the var new_bfSize and initializes it. Note the addition of bf. This specifies the structure name and bfSizedeclares the structure element.

Review the class info on structs for more in-depth info and then try again to update the appropriate header struct elements. Once you have the headers correct with scaling > 1, then work on the image data.

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

  • Thank you! I have watched all the videos on pest. Do you know any websites that I can go to for more information? Thanks again! Aug 14 '16 at 16:04

You must log in to answer this question.

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