Search code examples
cimage-processingmodulemodularitypgm

Modulization Gone Awry


So I had one large function that worked. Then I decided to modify it and now I am just printing out a black square. I am attaching my code to see if any one would understand what is happening. These three function where once large function: Function 1

int
readpgm (pgm_type * header, char input[80], char output[80])
{
    FILE *instream;

    int size, read;
    instream = fopen (input, "rb");

    fileChecker (instream);

    fscanf (instream, "%2s%d%d%d", header->filetype, &header->width,
        &header->height, &header->maxgray);

    if (!header->filetype[0] == 'P' || !header->filetype[1] == '5') {
        fatal ("Incorrect Type");
    }

    size = header->width * header->height;

    header->p = malloc (size * sizeof (char));

    read = fread (header->p, 1, size, instream);
    if (read != size) {
        fatal ("Incorrect Size");
    }

    return size;
}

void
crop (pgm_type * header, char output[80])
{
    printf ("Height: %i, Width: %i, Total pixels: %i \n", header->height,
        header->width, header->height * header->width);

    int temp, y1, y2, x1, x2, wide, high;

    printf ("Please Enter x1 y1 x2 y2 \n");


    scanf ("%i %i %i %i", &x1, &y1, &x2, &y2);
    if (y1 > y2) {
        temp = y1;
        y1 = y2;
        y2 = temp;
    }
    if (x1 > x2) {
        temp = x1;
        x1 = x2;
        x2 = temp;
    }
    wide = x2 - x1 + 1;
    high = y2 - y1 + 1;

    printFile (wide, high, x1, x2, y1, y1, header, output);
}

void
printFile (int wide, int high, int x1, int x2, int y1, int y2,
       pgm_type * header, char output[80])
{
    FILE *outstream;

    outstream = fopen (output, "wb");

    fileChecker (outstream);

    fprintf (outstream, "%2s\n%i %i\n%i\n", header->filetype, wide, high,
         header->maxgray);

    pixel image[header->height][header->width];
    pixel *pix = malloc ((wide * high) * sizeof (char));

    int a = 0;

    for (int b = 0; b < header->height; ++b) {
        for (int c = 0; c < header->width; ++c) {
            image[b][c] = header->p[a];
            ++a;
        }
    }

    int k = 0;
    for (int i = y1; i <= y2; ++i) {
        for (int j = x1; j <= x2; ++j) {
            pix[k] = image[i][j];
            ++k;
        }
    }

    fwrite (pix, 1, (wide * high) * sizeof (pixel), outstream);
    free (pix);
    fclose (outstream);
}

The first two function are call in main.


Solution

  • This works for me.

    //gcc c2.c -std=c99  -g -Wall -Wextra
    #include <stdio.h>
    #include <malloc.h>
    #include <assert.h>
    
    typedef struct pgm_type pgm_type;
    struct pgm_type{
      char filetype[2];
      int width,height,maxgray;
      unsigned char*p;
    };
    
    
    int
    readpgm (pgm_type * header, char*fn)
    {
        FILE *instream;
    
        int size, read;
        instream = fopen (fn,"rb");
    
        assert(instream);
    
        fscanf (instream, "%2s%d%d%d", header->filetype, &header->width,
            &header->height, &header->maxgray);
        printf("%2s %d %d %d\n",header->filetype,header->width,
           header->height,header->maxgray);
    
        if (!header->filetype[0] == 'P' || !header->filetype[1] == '5') {
          printf ("Incorrect Type");
        }
    
        size = header->width * header->height;
    
        header->p = malloc (size * sizeof (char));
    
        read = fread (header->p, 1, size, instream);
        if (read != size) {
          printf ("Incorrect Size");
        }
    
        return size;
    }
    
    void
    printFile (int x1, int x2, int y1, int y2,pgm_type * header, char*fn)
    {
        FILE *outstream;
        int wide=x2-x1+1,high=y2-y1+1;
        printf("cropping to %dx%d\n",wide,high);
        outstream = fopen (fn, "wb");
    
        assert (outstream);
    
        fprintf (outstream, "%2s\n%i %i\n%i\n", header->filetype, wide, high,
             header->maxgray);
    
        unsigned char image[header->height][header->width];
        unsigned char *pix = malloc ((wide * high) * sizeof (char));
    
        int a = 0;
    
        for (int b = 0; b < header->height; ++b) {
            for (int c = 0; c < header->width; ++c) {
                image[b][c] = header->p[a];
                ++a;
            }
        }
    
        int k = 0;
        for (int j = y1; j <= y2; ++j) {
            for (int i = x1; i <= x2; ++i) {
                pix[k] = image[j][i];
                ++k;
            }
        }
    
        fwrite (pix, wide,high, outstream);
        free (pix);
        fclose (outstream);
    }
    
    
    int
    main()
    {
      pgm_type h;
      readpgm(&h,"lena.pgm");
      printFile(64,129,32,230,&h,"o2.pgm");
      return 0;
    }