Good afternoon and a happy New year to you all.
I am currently having issues with resize.c My resized file is made but will not open in the CS50 IDE. I get an error saying that it is an unsupported file format.
I have only got as far as the horizontal resize but I fear I am getting too much padding. I initially thought it may be the headers that were incorrect but I have used ~cs50/pset4/peek to compare my resized file with the original and all is good. Having looked at the files with xxd it appears that the resized file has more ...'s at the end which I am guessing is the padding?
My code so far is:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bmp.h"
int main(int argc, char *argv[])
{
// ensure proper usage. 4 arguments must be given
if (argc != 4)
{
fprintf(stderr, "Usage: ./copy infile outfile\n");
return 1;
}
// remember filenames
//atof converts string to double. Reminder.
float f = atof(argv[1]);
//Need to add the if statement that limits f to between 0.0 and 100
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
//Creates two structs of type BITMAPFILEHEADER, one called bf for the original file, one called bf_new for the new file
BITMAPFILEHEADER bf;
BITMAPFILEHEADER bf_new;
//Reads the input file and stores the data in the struct bf
fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);
//Assigns the values of bf to bf_new
bf_new = bf;
// read infile's BITMAPINFOHEADER
//Creates two structs of type BITMAPINFOHEADER, one called bi for the original file, one called bi_new for the new file
BITMAPINFOHEADER bi;
BITMAPINFOHEADER bi_new;
//Reads the input file and stores the data in the struct bi
fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);
//Assigns the values of bi to bi_new
bi_new = bi;
// 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;
}
//Multiplies the width of the input file by the value of f and stores in struct bi_new
bi_new.biWidth = bi.biWidth * f;
//Multiplies the height of the input file by the value of f and stores in struct bi_new
bi_new.biHeight = bi.biHeight * f;
// determine padding for scanlines. Both old and new files
int padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
int padding_new = (4 - (bi_new.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;
//Sets the total image size, including pixels and padding
bi_new.biSizeImage = ((sizeof(RGBTRIPLE) * bi_new.biWidth) + padding_new) * abs(bi_new.biHeight);
//Sets the total image size in bytes. Includes pixels, padding and headers
bf_new.bfSize = bi_new.biSizeImage + 54;
// write outfile's BITMAPFILEHEADER using new data
fwrite(&bf_new, sizeof(BITMAPFILEHEADER), 1, outptr);
// write outfile's BITMAPINFOHEADER using new data
fwrite(&bi_new, sizeof(BITMAPINFOHEADER), 1, outptr);
// 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);
//Writes the RGB triple value to the output file n times. Horizontal resize
for (int k = 0; k < f; k++)
{
// write RGB triple to outfile
fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
}
}
// Add new padding
for (int m = 0; m < padding_new; m++)
{
fputc(0x00, outptr);
}
// skip over infile padding, if any
fseek(inptr, padding, SEEK_CUR);
// set pointer to beginning of input file scanline
fseek(inptr, 54 + (bi.biWidth * 3 + padding_new) * i, SEEK_SET);
}
// close infile
fclose(inptr);
// close outfile
fclose(outptr);
// success
return 0;
}