1

Could you assist me to look at my codes, no idea why after resizing small imagine, it turns out very weird result.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <cs50.h>
#include "bmp.h"


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

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

if ( n < 0 || n > 100)
{
    fprintf(stderr, "resize number is not within 0 < n < 100\n");
    return 2;
}

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

// open output file
FILE *outptr = fopen(outfile, "w");
if (outptr == NULL)
{
    fclose(inptr);
    fprintf(stderr, "Could not create %s.\n", outfile);
    return 4;
}

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

// determine padding for scanlines
// update new header info;

int NewbiWidth  = n* bi.biWidth;
int NewbiHeight = n* bi.biHeight;
int padding = (4 - (bi.biWidth *sizeof(RGBTRIPLE)) % 4) % 4;
int Newpadding = (4 - (NewbiWidth*sizeof(RGBTRIPLE)) % 4) % 4;
bi.biSizeImage = ((sizeof(RGBTRIPLE)*NewbiWidth) + Newpadding) * (abs(NewbiHeight));
bf.bfSize = bi.biSizeImage + 54;

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

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

// iterate over infile's scanlines
for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
{
    for (int j = 0; j < n; j++)
    // iterate over pixels in scanline
    {
         for (int k = 0; k < bi.biWidth; k++)
         {
             // temporary storage
             RGBTRIPLE triple;

             // read RGB triple from infile
             fread(&triple, sizeof(RGBTRIPLE), 1, inptr);

             for (int l = 0; l < n ; l++)
             // write RGB triple to outfile
             fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
         }
            // skip over padding, if any

            for (int m = 0; m < Newpadding; m++)
            fputc(0x00, outptr);

            if(j < n - 1)
            fseek(inptr, -bi.biWidth * sizeof(RGBTRIPLE), SEEK_CUR);
    }
    fseek(inptr, padding , SEEK_CUR);
}

// close infile
fclose(inptr);

// close outfile
fclose(outptr);

// success
return 0;

}

1 Answer 1

3

In the headers, you forget to put the new biWidth and biHeight in the BitmapInfoHeader of the new file.

You do compute the new values, but you don't write them into the headers.


And to quote Cliff B:

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 .