pushrbx icon

Untitled

pushrbx | PRO | 11/13/13 08:08:33 PM UTC | 0 ⭐ | 379 👁️ | Never ⏰ | []
C |

5.54 KB

|

None

|

0 👍

/

0 👎

// ConsoleApplication6.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "pgm.h"
#include <memory>
 
void getPGMfile (char filename[], PGMImage *img)
{
    FILE *in_file;
    char ch;
    int row, col, type;
    int ch_int;
 
    in_file = fopen(filename, "r");
    if (in_file == NULL)
    {
        fprintf(stderr, "Error: Unable to open file %s\n\n", filename);
        exit(8);
    }
 
    printf("\nReading image file: %s\n", filename);
 
    /*determine pgm image type (only type three can be used)*/
    ch = getc(in_file);
    if(ch != 'P')
    {
        printf("ERROR(1): Not valid pgm/ppm file type\n");
        exit(1);
    }
    ch = getc(in_file);
    /*convert the one digit integer currently represented as a character to
    an integer(48 == '0')*/
    type = ch - 48;
    if((type != 2) && (type != 3) && (type != 5) && (type != 6))
    {
        printf("ERROR(2): Not valid pgm/ppm file type\n");
        exit(1);
    }
 
    while(getc(in_file) != '\n');             /* skip to end of line*/
 
    while (getc(in_file) == '#')              /* skip comment lines */
    {
        while (getc(in_file) != '\n');          /* skip to end of comment line */
    }
 
    /*there seems to be a difference between color and b/w.  This line is needed
    by b/w but doesn't effect color reading...*/
    fseek(in_file, -1, SEEK_CUR);             /* backup one character*/
 
    fscanf(in_file,"%d", &((*img).width));
    fscanf(in_file,"%d", &((*img).height));
    fscanf(in_file,"%d", &((*img).maxVal));
 
    printf("\n width  = %d",(*img).width);
    printf("\n height = %d",(*img).height);
    printf("\n maxVal = %d",(*img).maxVal);
    printf("\n");
 
    if (((*img).width  > MAX) || ((*img).height  > MAX))
    {
        printf("\n\n***ERROR - image too big for current image structure***\n\n");
        exit(1);
    }
 
    if(type == 2) /*uncompressed ascii file (B/W)*/
    {
        for (row=(*img).height-1; row >=0; row--)
            for (col=0; col< (*img).width; col++)
            {
                fscanf(in_file,"%d", &ch_int);
                (*img).data[row][col].red = ch_int;
                (*img).data[row][col].green = ch_int;
                (*img).data[row][col].blue = ch_int;
            }
    }
    else if(type == 3) /*uncompressed ascii file (color)*/
    {
        for (row=(*img).height-1; row >=0; row--)
            for (col=0; col< (*img).width; col++)
            {
 
                fscanf(in_file,"%d", &ch_int);
                ((*img).data[row][col].red) = (unsigned char)ch_int;
 
                fscanf(in_file,"%d", &ch_int);
                ((*img).data[row][col].green) = (unsigned char)ch_int;
 
                fscanf(in_file,"%d", &ch_int);
                ((*img).data[row][col].blue) = (unsigned char)ch_int;
            }
    }
    else if(type == 5) /*compressed file (B/W)*/
        /*note: this type remains untested at this time...*/
    {
        while(getc(in_file) != '\n'); /*skip to end of line*/
 
        for (row=(*img).height-1; row >=0; row--)
            for (col=0; col< (*img).width; col++)
            {
                ch = getc(in_file);
                (*img).data[row][col].red = ch;
                (*img).data[row][col].green = ch;
                (*img).data[row][col].blue = ch;
            }
    }
 
    else if(type == 6) /*compressed file (color)*/
    {
        while(getc(in_file) != '\n'); /*skip to end of line*/
 
        for (row=(*img).height-1; row >=0; row--)
            for (col=0; col< (*img).width; col++)
            {
                (*img).data[row][col].red = getc(in_file);
                (*img).data[row][col].green = getc(in_file);
                (*img).data[row][col].blue = getc(in_file);
            }
    }
 
    fclose(in_file);
    printf("\nDone reading file.\n");
}
 
 
void save(PGMImage *img)
{
    int i, j, nr, nc, k;
    int red, green, blue;
    FILE *iop;
 
    nr = img->height;
    nc = img->width;
 
    iop = fopen("image1.pgm", "w");
    fprintf(iop, "P6\n");
    fprintf(iop, "%d %d\n", nc, nr);
    fprintf(iop, "255\n");
 
    k = 1;
    for(i = nr - 1; i  >= 0; i--)
    {
        for(j = 0; j <  nc; j++)
        {
            red = img->data[i][j].red;
            green = img->data[i][j].green;
            blue = img->data[i][j].blue;
            if(red <  0)
            {
                printf("IMG_WRITE: Found value %d at row %d col %d\n", red, i, j);
                printf("           Setting red to zero\n");
                red = 0;
            }
            if(green <  0)   
            {
                printf("IMG_WRITE: Found value %d at row %d col %d\n", green,i, j);
                printf("           Setting green to zero\n");
                green = 0;
            }
            if(blue <  0)   
            {
                printf("IMG_WRITE: Found value %d at row %d col %d\n", blue, i, j);
                printf("           Setting green to zero\n");
                blue = 0;
            }
            if(red  > 255) 
            {   
                printf("IMG_WRITE: Found value %d at row %d col %d\n", red, i, j);
                printf("           Setting red to 255\n");
                red = 255;
            }
            if(green  > 255)
            {
                printf("IMG_WRITE: Found value %d at row %d col %d\n", green,i, j);
                printf("           Setting green to 255\n");
                green = 255;
            }
            if(blue  > 255)
            {
                printf("IMG_WRITE: Found value %d at row %d col %d\n", blue, i, j);
                printf("           Setting blue to 255\n");
                blue = 255;
            }
 
            putc(red, iop);
            putc(green, iop);
            putc(blue, iop);
        }
    }
    fprintf(iop, "\n");
    fclose(iop);
}
 
void read_grid_from_file( int** grid, const size_t row, const size_t column, FILE* inf ) {
    size_t x, y;
    for( x = 0; x < column; ++x ) {
        for( y = 0; y < row; ++y ) {
            fscanf( inf, "%d", &grid[x][y] );
            printf( "%d ", grid[x][y] );
        }
        printf( "\n" ); 
    }
}
 
int main(int argc, char* argv[])
{
    PGMImage img;
    getPGMfile("progalap.pgm", &img);
    
    int x, y;
    for(x = 0; x < img.width; x++)
    {
        for(y = 0; y < img.height; x++)
        {
            RGB_INT temp = {0};
            memcpy(&temp, &img.data[x][y], sizeof(RGB_INT));
            int index = img.height - y;
            img.data[x][y] = img.data[index][y];
            img.data[index][y] = temp;
        }
    }
    
    save(&img);
    return 0;
 
}

Comments