1

following the pseudocode to resize vertically - can you tell me if I'm on the right lines? Looks like too many nested for loops.

 // horizontal resize
   // for each row
        for (int i = 0; i < bio.biHeight; i++){
        // for each pixel in row
         for (int j = 0; j < bio.biWidth; j++){
                write to outfile n times......
             // write outfile padding
             fwrite(&triple,sizeof(RGBTRIPLE),1,outptr);
             // skip over infile padding
           fseek(inptr, padding, SEEK_CUR);
             }

I havent implemented writing to outfile n times because I don't want to add another for loop.

UPDATED CODE:

/**
* 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: ./copy infile outfile\n");
    return 1;
}

if (atoi(argv[1]) > 100){
 printf("Please enter number smaller than 100...");
  return 1;
}

int n = atoi(argv[1]);

// remember filenames
char* infile = argv[2];
char* outfile = argv[3];

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

// copy these file headers so they can be written to output file
BITMAPFILEHEADER bfo = bf;
BITMAPINFOHEADER bio = bi;

// new height and width
bio.biHeight = bi.biHeight * n;
bio.biWidth = bi.biWidth * n;

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

// new padding
int newpadding = (4-bio.biWidth * sizeof(RGBTRIPLE) % 4) % 4; 

bio.biSizeImage = ((bio.biWidth) * sizeof(RGBTRIPLE) + (newpadding)) * abs(bio.biHeight);
bfo.bfSize = (bio.biSizeImage) + 54;

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


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



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


// determine padding for scanlines



// 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);
        for (int a = 0; a < n; a++){
            for (int b = 0; b < n; b++){
                fread(&triple, sizeof(RGBTRIPLE), 1, inptr);
                {
                    for (int c = 0; c < n; c++){
                        fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
                    }
                    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

There are a few issues I see in your code.

You define your file headers, but you don't read them or set pointers to them, which means you can't track them.

You need padding n times for each pixel. You also don't skip over resize padding in either direction when you add the padding.

The equations you use to determine the new size of the image and the padding also has an issue in it. You need to multiply by the absolute height as well.

You also need to fix your returns. You return 1 twice.

Using GDB should help you find any more errors in your program. If you still have issues, comment below!

| improve this answer | |
  • Thanks, I still haven't solved it. I will add udpated code to the original question, getting a really weird output image. – i'i'i'i'i'i'i'i'i'i Jan 13 '17 at 12:00
  • @Iona-KathrynEvans See edit above. – SuperNovaCoder Jan 13 '17 at 15:34

You must log in to answer this question.

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