0
#include <stdio.h>
#include <stdlib.h>

#include <string.h>

#include "bmp.h"

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

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

//ensure n less than 100

if(n > 100 || n < 1)
{
    fprintf(stderr, "n shouldnt be more than 100");
    return 1;
}

// 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;
}


BITMAPINFOHEADER bi_out;
bi_out=bi;

bi_out.biHeight *= n;
bi_out.biWidth *= n;

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

bi_out.biSizeImage = ((sizeof(RGBTRIPLE) * bi_out.biWidth) + padding2) * abs(bi_out.biHeight);
bf.bfSize = bi_out.biSizeImage + 54; // sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);





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

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




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

    //create vertical scaling --noder loop--return cursor to beg line of file
    for(int f = 0; f < n; ++f)
    {


         // 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);

            for(int k = 0; k < n; ++k)
            {
            fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
            }

        }


        for (int k = 0; k < padding2; k++)
        {
            fputc(0x00, outptr);
        }


     //return cursor to beg of line
        fseek(inptr,-(bi.biWidth - padding),SEEK_CUR);


    }

    fseek(inptr,0,SEEK_END); //got to end of line
}


// close infile
fclose(inptr);

// close outfile
fclose(outptr);

// success
return 0;


 }

1 Answer 1

1

There are a number of problems that need to be fixed.

The code doesn't skip the padding at the end of each line in the input file, so it gets treated as image data.

It always goes back to the beginning of the first line (sort of, see previous error). After the first line is processed, it needs to stay where it is, not go back.

Finally, the last fseek doesn't go to the end of a line. It goes to the end of the file!

Those are the big problems, there may be more or more may appear as code is edited. I'll leave it to you to figure out how to implement the fixes! Happy coding! ;-)

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 .