首页 文章

阅读更改和打印PPM图像

提问于
浏览
-1

我发现堆栈溢出代码执行此操作但我使用它时遇到一些错误 . 我不确定我做错了什么因为我对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 回答

  • -1

    以下代码干净地编译 .

    它是硬编码的文件乌克兰.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
    

相关问题