Advertisement
Guest User

Untitled

a guest
Jan 26th, 2020
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.01 KB | None | 0 0
  1. // https://stackoverflow.com/questions/2693631/read-ppm-file-and-store-it-in-an-array-coded-with-c?fbclid=IwAR3p0n1sx_IIooYmhb2aVdFww0x-FR3Zso_Uw4IHaayPpm5lWQkGTg6SYck
  2. #include "ppm.h"
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. PPMImage *readPPM(const char *filename)
  8. {
  9.     char buff[16];
  10.     PPMImage *img;
  11.     FILE *fp;
  12.     int c, rgb_comp_color;
  13.     //open PPM file for reading
  14.     fp = fopen(filename, "rb");
  15.     if (!fp) {
  16.         fprintf(stderr, "Unable to open file '%s'\n", filename);
  17.         exit(1);
  18.     }
  19.  
  20.     //read image format
  21.     if (!fgets(buff, sizeof(buff), fp)) {
  22.         perror(filename);
  23.         exit(1);
  24.     }
  25.  
  26.     //check the image format
  27.     if (buff[0] != 'P' || (buff[1] != '6' && buff[1] != '3')) {
  28.         printf("SDADASD %c%c\n", buff[0], buff[1]);
  29.         fprintf(stderr, "Invalid image format (must be 'P6' or P3)\n");
  30.         exit(1);
  31.     }
  32.  
  33.     //alloc memory form image
  34.     img = (PPMImage *)malloc(sizeof(PPMImage));
  35.     if (!img) {
  36.         fprintf(stderr, "Unable to allocate memory\n");
  37.         exit(1);
  38.     }
  39.  
  40.     if (buff[1] == '6') {
  41.         img->type = 0;    
  42.     } else {
  43.         img->type = 1;
  44.     }
  45.  
  46.     //check for comments
  47.     c = getc(fp);
  48.     while (c == '#') {
  49.         while (getc(fp) != '\n') ;
  50.         c = getc(fp);
  51.     }
  52.  
  53.     ungetc(c, fp);
  54.     //read image size information
  55.     if (fscanf(fp, "%d %d", &img->x, &img->y) != 2) {
  56.         fprintf(stderr, "Invalid image size (error loading '%s')\n", filename);
  57.         exit(1);
  58.     }
  59.  
  60.     //read rgb component
  61.     if (fscanf(fp, "%d", &rgb_comp_color) != 1) {
  62.         fprintf(stderr, "Invalid rgb component (error loading '%s')\n", filename);
  63.         exit(1);
  64.     }
  65.  
  66.     if (img->type == 1) {
  67.         img->data = (PPMPixel*)malloc(img->x * img->y * sizeof(PPMPixel));
  68.         int i;
  69.         for (i = 0; i < img->x * img->y; ++i) {
  70.             int r, g, b;
  71.             fscanf(fp, "%d%d%d", &r, &g, &b);
  72.             img->data[i].red = (unsigned char)r;
  73.             img->data[i].green = (unsigned char)g;
  74.             img->data[i].blue = (unsigned char)b;
  75.         }
  76.         fclose(fp);
  77.         return img;
  78.     }
  79.  
  80.     //check rgb component depth
  81.     if (rgb_comp_color!= RGB_COMPONENT_COLOR) {
  82.         fprintf(stderr, "'%s' does not have 8-bits components\n", filename);
  83.         exit(1);
  84.     }
  85.  
  86.     while (fgetc(fp) != '\n') ;
  87.     //memory allocation for pixel data
  88.     img->data = (PPMPixel*)malloc(img->x * img->y * sizeof(PPMPixel));
  89.  
  90.     if (!img) {
  91.         fprintf(stderr, "Unable to allocate memory\n");
  92.         exit(1);
  93.     }
  94.  
  95.     //read pixel data from file
  96.     int i;
  97.     int j;
  98.     for (i = 0; i < img->y; i++) {
  99.         for (j = 0; j < img->x; j++) {
  100.             unsigned char r, g, b;
  101.             r = fgetc(fp);
  102.             g = fgetc(fp);
  103.             b = fgetc(fp);
  104.             img->data[i * img->x + j].red = r;
  105.             img->data[i * img->x + j].green = g;
  106.             img->data[i * img->x + j].blue = b;
  107.         }
  108.     }
  109.  
  110.     fclose(fp);
  111.     return img;
  112. }
  113.  
  114. void writePPM(const char *filename, PPMImage *img)
  115. {
  116.     FILE *fp;
  117.     //open file for output
  118.     fp = fopen(filename, "wb");
  119.     if (!fp) {
  120.         fprintf(stderr, "Unable to open file '%s'\n", filename);
  121.         exit(1);
  122.     }
  123.  
  124.     if (img->type == 1) {
  125.         fprintf(fp, "P3\n");
  126.         fprintf(fp, "%d %d\n", img->x, img->y);
  127.         fprintf(fp, "%d\n", RGB_COMPONENT_COLOR);
  128.         int i;
  129.         for (i = 0; i < img->x * img->y; ++i) {
  130.             int r = (int)img->data[i].red;
  131.             int g = (int)img->data[i].green;
  132.             int b = (int)img->data[i].blue;
  133.             fprintf(fp, "%d %d %d\n", r, g, b);
  134.         }
  135.         fclose(fp);
  136.     }
  137.  
  138.     //write the header file
  139.     //image format
  140.     fprintf(fp, "P6\n");
  141.  
  142.     //comments
  143.     fprintf(fp, "# Created by %s\n",CREATOR);
  144.  
  145.     //image size
  146.     fprintf(fp, "%d %d\n",img->x,img->y);
  147.  
  148.     // rgb component depth
  149.     fprintf(fp, "%d\n",RGB_COMPONENT_COLOR);
  150.  
  151.     // pixel data
  152.     fwrite(img->data, 3 * img->x, img->y, fp);
  153.     fclose(fp);
  154. }
  155.  
  156. void changeColorPPM(PPMImage *img)
  157. {
  158.     int i;
  159.     if(img){
  160.  
  161.         for(i=0;i<img->x*img->y;i++){
  162.             img->data[i].red=RGB_COMPONENT_COLOR - img->data[i].red;
  163.             img->data[i].green=RGB_COMPONENT_COLOR - img->data[i].green;
  164.             img->data[i].blue=RGB_COMPONENT_COLOR - img->data[i].blue;
  165.         }
  166.     }
  167. }
  168.  
  169. void writePGM(const char *filename, PPMImage *img) {
  170.     FILE *fp;
  171.     //open file for output
  172.     fp = fopen(filename, "wb");
  173.     if (!fp) {
  174.         fprintf(stderr, "Unable to open file '%s'\n", filename);
  175.         exit(1);
  176.     }
  177.  
  178.     fprintf(fp, "P2\n");
  179.     fprintf(fp, "%d %d\n", img->x, img->y);
  180.     fprintf(fp, "%d\n", RGB_COMPONENT_COLOR);
  181.  
  182.     int i;
  183.     int j;
  184.     for (i = 0; i < img->y; ++i) {
  185.         for (j = 0; j < img->x; ++j) {
  186.             fprintf(fp, "%d", img->data[i * img->x + j].red);
  187.             if (j != img->x) {
  188.                 fprintf(fp, " ");
  189.             }
  190.         }
  191.         fprintf(fp, "\n");
  192.     }
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement