0

i am quite stuck with the vertical procedures on this problem. I've implemented a for loop which will re-draw the horizontal scanline N times, can't figure out why my image is writing black pixels though. Can someone please point me in the right direction?

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

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

#include "bmp.h"

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

// remember filenames
char* infile = argv[2];
char* outfile = argv[3];
int n = atoi(argv[1]);
// tests n
if (n < 1 || n > 100)
    {

        printf("n must between 1 and 100\n");
        return 1;
    }

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

// update header
BITMAPFILEHEADER new_bf = bf;   
BITMAPINFOHEADER new_bi = bi;     

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

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

new_bi.biSizeImage = (new_bi.biWidth * sizeof(RGBTRIPLE) + new_padding) * abs(new_bi.biHeight);
new_bf.bfSize = 54 + new_bi.biSizeImage;



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

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


// iterate over infile's scanlines
for (int i = 0, biHeight = abs(new_bi.biHeight); i < biHeight; i++)
{
   // Perform the horizontal resize many times to get a vertical one.
    for (int h = 0; h < n; h++)
    {

    // 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 t = 0; t < n; t++)
        {
        fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
        }


    }
    // then add it back (to demonstrate how)
    for (int k = 0; k < new_padding; k++)
    {
        fputc(0x00, outptr);
    }

    }

    // skip over padding, if any
    fseek(inptr, padding, SEEK_CUR);

}

// close infile
fclose(inptr);

// close outfile
fclose(outptr);

// that's all folks
return 0;
[![enter image description here][1]][1]}
0

What's left for you to do is basically this:

enter image description here

Watch this video:

https://www.youtube.com/watch?v=zOylgRdzv_U&feature=youtu.be&t=10m1s

PS: Other than that, you're iterating over the new height when you should be iterating over the old one.

9
  • what does it mean when Zamyla say's "padding is not an RGB triple therefore we won't be reading or writing it in"? Also, one other issue is that my new bmp is not scaling properly. For example when N=3, i end up with a 8x8 image, but if N = 5, i get the correct 15x15 dimensions. Dec 9 '16 at 2:57
  • can someone please help? Dec 9 '16 at 19:26
  • paste a link here to your updated code and I can take a look Dec 9 '16 at 20:27
  • pastebin.com/U758nQj9 Dec 9 '16 at 20:34
  • I think you forgot to save and compile your file, because that code right there passes all check50 tests Dec 9 '16 at 20:37

You must log in to answer this question.

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