Skip to content

Resize - version 1.0 #1

Description

@Alexico1969

// resizes a BMP file

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

#include "bmp.h"

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

// remember filenames

char *infile = argv[2];
char *outfile = argv[3];

// remember enlargement factor

int n = atoi(argv[1]);

n+=0;

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

//---- here I will have to put some code to update the file size, image size, width and the height

int padding;

//padding = bi.biSizeImage - (bi.biWidth*bi.biHeight);


bi.biWidth *= n;
bi.biHeight *= n;

padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;

bi.biSizeImage = ((sizeof(RGBTRIPLE) * bi.biWidth) + padding) *abs(bi.biHeight);
bf.bfSize = bi.biSizeImage+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);



//---- end of my update code


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

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

// determine padding for scanlines
padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;

int oldPadding = padding;
oldPadding +=0;

// 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
            for (int l = 0; l < n; l++)  // for loop to multiply WIDTH
            {
                fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);

                padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;

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

}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions