Question: mplement a program called resize that resizes (i.e., enlarges) 24-bit uncompressed BMPs by a factor of n. Implement your program in a file called resize.c

mplement a program called resize that resizes (i.e., enlarges) 24-bit uncompressed BMPs by a factor of n.

Implement your program in a file called resize.c in a directory called resize.

Your program should accept exactly three command-line arguments, whereby

the first (n) must be a positive integer less than or equal to 100,

the second must be the name of a BMP to be resized, and

the third must be the name of the resized version to be written.

+ If your program is not executed with such, it should remind the user of correct usage, as with fprintf (to stderr), and main should return 1.

Your program, if it uses malloc, must not leak any memory.

/** * Copies a BMP piece by piece, just because. */ #include #include

#include "bmp.h"

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

// remember filenames char *infile = argv[1]; char *outfile = argv[2];

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

// open output file FILE *outptr = fopen(outfile, "w"); if (outptr == NULL) { fclose(inptr); fprintf(stderr, "Could not create %s. ", 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. "); 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;

// 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 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 < padding; k++) { fputc(0x00, outptr); } }

// close infile fclose(inptr);

// close outfile fclose(outptr);

// success return 0; }

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!