Advertisement
Guest User

Untitled

a guest
Nov 28th, 2014
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.72 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5. struct obr_pgm{
  6.     unsigned short int h, w, maxval;
  7.     unsigned short int **dane;
  8. };
  9. void free_img(struct obr_pgm **img){
  10.     int i;
  11.     if(*img==NULL) return;
  12.     if((*img)->dane!=NULL){
  13.         for(i=0;i<(*img)->h;i++){
  14.             free((*img)->dane[i]);
  15.         }
  16.         free((*img)->dane);
  17.         free(*img);
  18.         *img=NULL;
  19.     }
  20. }
  21. struct obr_pgm *createImg(unsigned short int w, unsigned short int h, unsigned short int maxval){
  22.     struct obr_pgm *retImg;
  23.     int i;
  24.     retImg=(struct obr_pgm*)calloc(1,sizeof(struct obr_pgm));
  25.     if(retImg=NULL) return NULL;
  26.     printf("%d \n%d \n%d \n",w,h,maxval);
  27.     retImg->w=w;
  28.     retImg->h=h;
  29.     retImg->maxval=maxval;
  30.     retImg->dane=(unsigned short int**)calloc(h,sizeof(unsigned short int*));
  31.     if(retImg->dane==NULL){
  32.         free_img(&retImg);
  33.         return NULL;
  34.     }
  35.     for(i=0;i<h;i++){
  36.         retImg->dane[i]=(unsigned short int*)malloc(w*sizeof(unsigned short int));
  37.         if(retImg->dane[i]==NULL){
  38.             free_img(&retImg);
  39.             return NULL;
  40.         }
  41.     }
  42.     return retImg;
  43. }
  44. void SkipCom(FILE *f){
  45.     char zn, buff[255];
  46.     zn=fgetc(f);
  47.     do{
  48.         if(zn=='#') fgets(buff,sizeof(buff),f);
  49.         zn=getc(f);
  50.     }while(!isdigit(zn));
  51.     ungetc(zn,f);
  52. }
  53. struct obr_pgm *LoadImg(char *path){
  54.     FILE *f;
  55.     char buff[255];
  56.     int w,h,maxval,x,y;
  57.     struct obr_pgm *ptr;
  58.     f=fopen(path,"rt");
  59.     if(f==NULL) return NULL;
  60.     if(fscanf(f,"%2s",buff)!=1){
  61.         fclose(f);
  62.         return NULL;
  63.     }
  64.     if(buff[0]!='P' || (buff[1]!='2' && buff[2]!='5')){
  65.         fclose(f);
  66.         return NULL;
  67.     }
  68.     SkipCom(f);
  69.     if(fscanf(f,"%d %d", &w, &h)!=2){
  70.         fclose(f);
  71.         return NULL;
  72.     }
  73.     SkipCom(f);
  74.     if(fscanf(f,"%d",&maxval)!=1){
  75.         fclose(f);
  76.         return NULL;
  77.     }
  78.     ptr=createImg(w,h,maxval);
  79.     if(ptr==NULL){
  80.         fclose(f);
  81.         return NULL;
  82.     }
  83.     for(y=0;y<h;y++){
  84.         SkipCom(f);
  85.         for(x=0;x<w;x++){
  86.             if(fscanf(f,"%d",&(ptr->dane[y][x]))!=1){
  87.                 free(&ptr);
  88.                 fclose(f);
  89.                 return NULL;
  90.             }
  91.         }
  92.     }
  93.     fclose(f);
  94.     return ptr;
  95. }
  96. struct obr_pgm *zapis(struct obr_pgm *ptr, char *path){
  97.     FILE *f;
  98.     int x,y;
  99.     f=fopen(path,"wt");
  100.     if(f==NULL) return NULL;
  101.     fprintf(f, "P2\n");
  102.     fprintf(f, "%d %d\n%d\n", ptr->w, ptr->h, ptr->maxval);
  103.     for(y=0;y<ptr->h;y++){
  104.         for(x=0;x<ptr->w;x++){
  105.             fprintf(f,"%d ",&(ptr->dane[y][x]));
  106.         }
  107.         fprintf(f,"\n");
  108.     }
  109.     fclose(f);
  110.  
  111. }
  112. struct obr_pgm *inwersja(struct obr_pgm *img){
  113.     struct obr_pgm *ptr;
  114.     int x,y;
  115.     if(img==NULL) return NULL;
  116.     ptr=createImg(img->w, img->h,img->maxval);
  117.     if(ptr==NULL) return NULL;
  118.     for(y=0;y<img->h;y++){
  119.         for(x=0;x<img->w;x++){
  120.             ptr->dane[y][x]=img->maxval-(img->dane[y][x]);
  121.         }
  122.     }
  123.     return ptr;
  124. }
  125. int main(){
  126.     struct obr_pgm *ptr;
  127.     ptr=LoadImg("bird.pgm");
  128.     inwersja(ptr);
  129.     zapis(ptr,"obrazek.pgm");
  130.     free_img(&ptr);
  131.     return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement