Чтение Изменение и печать изображения PPM

Я нашел код в переполнении стека, чтобы сделать это, но у меня возникли некоторые ошибки при его использовании. Я не уверен, что я делаю неправильно, потому что у меня нет большого опыта работы с файлами ppm. Спасибо всем за любую помощь.

    typedef struct {
     int x, y;
     PPMPixel *data;
} PPMImage;

#define CREATOR "RPFELGUEIRAS"
#define RGB_COMPONENT_COLOR 255

static PPMImage *readPPM(const char *filename = "ukraine.ppm")
{
         char buff[16];
         PPMImage *img;
         FILE *fp;
         int c, rgb_comp_color;
         //open PPM file for reading
         fp = fopen("ukraine.ppm", "rb");
         if (!fp) {
              fprintf(stderr, "Unable to open file '%s'\n", filename);
              exit(1);
         }

         //read image format
         if (!fgets(buff, sizeof(buff), fp)) {
              perror(ukraine.ppm);
              exit(1);
         }

    //check the image format
    if (buff[0] != 'P' || buff[1] != '6') {
         fprintf(stderr, "Invalid image format (must be 'P6')\n");
         exit(1);
    }

    //alloc memory form image
    img = (PPMImage *)malloc(sizeof(PPMImage));
    if (!img) {
         fprintf(stderr, "Unable to allocate memory\n");
         exit(1);
    }

    //check for comments
    c = getc(fp);
    while (c == '#') {
    while (getc(fp) != '\n') ;
         c = getc(fp);
    }

    ungetc(c, fp);
    //read image size information
    if (fscanf(fp, "%d %d", &img->x, &img->y) != 2) {
         fprintf(stderr, "Invalid image size (error loading '%s')\n",       ukraine.ppm);
         exit(1);
    }

    //read rgb component
    if (fscanf(fp, "%d", &rgb_comp_color) != 1) {
         fprintf(stderr, "Invalid rgb component (error loading '%s')\n",      filename);
         exit(1);
    }

    //check rgb component depth
    if (rgb_comp_color!= RGB_COMPONENT_COLOR) {
         fprintf(stderr, "'%s' does not have 8-bits components\n",       filename);
         exit(1);
    }

    while (fgetc(fp) != '\n') ;
    //memory allocation for pixel data
    img->data = (PPMPixel*)malloc(img->x * img->y * sizeof(PPMPixel));

    if (!img) {
         fprintf(stderr, "Unable to allocate memory\n");
         exit(1);
    }

    //read pixel data from file
    if (fread(img->data, 3 * img->x, img->y, fp) != img->y) {
         fprintf(stderr, "Error loading image '%s'\n", filename);
         exit(1);
    }

    fclose(fp);
    return img;
}
void writePPM(const char *filename = "ukraine.ppm", PPMImage *img)
{
    FILE *fp;
    //open file for output
    fp = fopen(ukraine.ppm, "wb");
    if (!fp) {
         fprintf(stderr, "Unable to open file '%s'\n",filename);
         exit(1);
    }

    //write the header file
    //image format
    fprintf(fp, "P6\n");

    //comments
    fprintf(fp, "# Created by %s\n",CREATOR);

    //image size
    fprintf(fp, "%d %d\n",img->x,img->y);

    // rgb component depth
    fprintf(fp, "%d\n",RGB_COMPONENT_COLOR);

    // pixel data
    fwrite(img->data, 3 * img->x, img->y, fp);
    fclose(fp);
}

void changeColorPPM(PPMImage *img)
{
    int i;
    if(img){

         for(i=0;i<img->x*img->y;i++){
              img->data[i].red=RGB_COMPONENT_COLOR-img->data[i].red;
              img->data[i].green=RGB_COMPONENT_COLOR-img->data[i].green;
              img->data[i].blue=RGB_COMPONENT_COLOR-img->data[i].blue;
         }
    }
}

int main(){
    PPMImage *image;
    image = readPPM("can_bottom.ppm");
    changeColorPPM(image);
    writePPM("can_bottom2.ppm",image);
    printf("Press any key...");
    getchar();

    return(0);
}

Сообщение об ошибке

[21:47:34] cehutto@hornet6:~/101/lab12 [8] gcc imageChange.c imageChange.c:18:47: error: expected â;â, â,â or â)â before â=â token
imageChange.c:94:36: error: expected â;â, â,â or â)â before â=â token
imageChange.c: In function âmainâ: imageChange.c:137:11: warning: assignment makes pointer from integer without a cast [enabled by default] 
[21:47:34] cehutto@hornet6:~/101/lab12 [9] Last login: Tue Apr 14 21:28:19 2015 from 48.253.21.198.tigernet.wifi.dyn.clemson.edu
[23:42:52] cehutto@hornet6:~ [1]`

1 ответ

Следующий код чисто компилируется.

это жестко запрограммировано для файла ukraine.ppm

Вы можете легко изменить файл, чтобы использовать глобальный массив символов

что основные наборы для входного файла

Вы можете легко изменить файл, чтобы использовать глобальный массив символов

что основные наборы для выходного файла

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

struct PPMPixel
{
    char red;
    char blue;
    char green;
};

struct PPMImage
{
     unsigned x, y;
     struct PPMPixel *data;
};

#define CREATOR "RPFELGUEIRAS"
#define RGB_COMPONENT_COLOR (255)

static struct PPMImage *readPPM()
{
     char buff[16];
     struct PPMImage *img;

     FILE *fp;

     int c;
     int rgb_comp_color;

     //open PPM file for reading
     fp = fopen("ukraine.ppm", "rb");
     if (!fp)
     {
         perror( "fopen for ukraine.ppm failed" );
         // fprintf(stderr, "Unable to open file '%s'\n", filename);
          exit(1);
     }

     // implied els,e fopen successful

     //read image format // get first 15 bytes of image file
     if (!fgets(buff, sizeof(buff), fp))
     {
          perror("ukraine.ppm");
          exit(1);
     }

     // implied else, fgets successful

    //check the image format
    if (buff[0] != 'P' || buff[1] != '6') {
         fprintf(stderr, "Invalid image format (must be 'P6')\n");
         exit(1);
    }

    // implied else, image file file has correct format indicators

    //alloc memory for image
    img = malloc(sizeof(struct PPMImage));
    if (!img)
    {
        perror( "malloc for PPMImage failed" );
        //fprintf(stderr, "Unable to allocate memory\n");
         exit(1);
    }

    // implied else, malloc successful

    //check for comments
    c = getc(fp);
    while (c == '#')
    {
        while( (c = getc(fp)) != '\n') ;
    }

    //read image size information
    if (fscanf(fp, "%u %u", &img->x, &img->y) != 2)
    {
        perror( "fscanf for ukraine.ppm image size parameters failed" );
         exit(1);
    }

    // implied else, fscanf successful

    //read rgb component
    if (fscanf(fp, "%d", &rgb_comp_color) != 1)
    {
        perror( "fscanf for rgb_comp_color in ukraine.ppm failed" );
         //fprintf(stderr, "Invalid rgb component (error loading '%s')\n",      filename);
         exit(1);
    }

    // implied else, fscanf successful

    //check rgb component depth
    if (rgb_comp_color!= RGB_COMPONENT_COLOR)
    {
         fprintf(stderr, "'ukraine.ppm' does not have 8-bits components\n");
         exit(1);
    }

    // implied else, rgb component depth correct

    // consume rest of line
    while (fgetc(fp) != '\n') ;

    //memory allocation for pixel data
    img->data = malloc(img->x * img->y * sizeof( struct PPMPixel));

    if ( !img->data ) //< corrected element being checked
    {
        perror( "malloc for pixel data failed" );
        //fprintf(stderr, "Unable to allocate memory\n");
         exit(1);
    }

    // implied else, malloc successful

    //read pixel data from file
    if (fread(img->data, 3 * img->x, img->y, fp) != img->y)
    {
        perror( "fread for pixel data failed" );
        // fprintf(stderr, "Error loading image '%s'\n", filename);
         exit(1);
    }

    // implied else, fread successful

    fclose(fp);
    return img;
} // end function: readPPM


void writePPM(struct PPMImage *img)
{
    FILE *fp;
    //open file for output
    fp = fopen("ukraine.ppm", "wb");
    if (!fp)
    {
        perror( "fopen for ukraine.ppm for write failed" );
        // fprintf(stderr, "Unable to open file '%s'\n",filename);
         exit(1);
    }

    // implied else, fopen successful

    //write the header file
    //image format
    fprintf(fp, "P6\n");

    //comments
    fprintf(fp, "# Created by %s\n",CREATOR);

    //image size
    fprintf(fp, "%d %d\n",img->x,img->y);

    // rgb component depth
    fprintf(fp, "%d\n",RGB_COMPONENT_COLOR);

    // pixel data
    fwrite(img->data, 3 * img->x, img->y, fp);
    fclose(fp);
} // end function: writePPM


void changeColorPPM(struct PPMImage *img)
{
    unsigned i;
    if(img)
    {

         for(i=0;i<img->x*img->y;i++)
         {
              img->data[i].red=RGB_COMPONENT_COLOR-img->data[i].red;
              img->data[i].green=RGB_COMPONENT_COLOR-img->data[i].green;
              img->data[i].blue=RGB_COMPONENT_COLOR-img->data[i].blue;
         }
    }
} // end function: changeColorPPM


int main()
{
    struct PPMImage *image;
    image = readPPM();
    changeColorPPM(image);
    writePPM(image);
    printf("Press any key...");
    getchar();

    return(0);
} // end function: main
Другие вопросы по тегам