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 "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
Get step-by-step solutions from verified subject matter experts
