0

Can somebody help me understand what's wrong with my code?

/**
 * copy.c
 *
 * Computer Science 50
 * Problem Set 4
 *
 * Copies a BMP piece by piece, just because.
 */

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

#include "bmp.h"

int main(int argc, char* argv[])
{


    // ensure proper usage
    if (argc != 4)
    {

        printf("Usage: ./copy size infile outfile\n");

        return 1;
    }

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

    if(compression < 0 || compression > 100)
    {
        printf("Usage: resize needs to be between 0 and 100\n");
        return 2;
    }

    // open input file 
    FILE* inptr = fopen(infile, "r");
    if (inptr == NULL)
    {
        printf("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);
    //BITMAPFILEHEADER bfr = bf;


    // read infile's BITMAPINFOHEADER
    BITMAPINFOHEADER bi;
    fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);


    int32_t width = bi.biWidth;

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

    // write outfile's BITMAPFILEHEADER
    bi.biHeight = bi.biHeight * compression;
    bi.biWidth = bi.biHeight * compression;
    bi.biSizeImage = bi.biHeight * bi.biWidth;
    bi.biSize = bi.biSizeImage;
    bf.bfSize = bi.biSize;

    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 < width; j++)
        {
            // temporary storage
            RGBTRIPLE triple;


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



            // write RGB triple to outfile
            for(int e = 0; e < compression; e++)
            {
                fread(&triple, sizeof(triple), 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);

    // that's all folks
    return 0;
}

1 Answer 1

0

There are numerous issues. Header fields that aren't updated should be, others are that shouldn't, there are errors in calculating still others. Padding needs to be calculated for both the input file and output file. Then, there are problems with scaling the image data. There may be still more issues.

Given the number of errors, I suggest that you go back and closely review the pset specification, especially what should and should not be updated and how. Note that several fields have very similar names.

Once you have revised the code, try running it against small.bmp with a compression of 1. This should produce an exact copy of the input file. Using the peek and xxd tools, verify that the header data is right, or make the appropriate corrections in the code. Once the headers are correct, then move on and get the image processing code right. Only after you get an exact copy, change compression to 2 and repeat the process.

If this answers your question, please click on the check mark to accept. Let's keep up on forum maintenance. ;-)

1
  • Alright thanks so much Ill go back to the basics
    – blueless
    Commented Aug 31, 2016 at 3:14

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .