/* Schreiben sie eine Klasse PPM, mit einer virtuellen Funktion readImage(String imgName)=0 und einer Funktion readHeader(String imgName), die den header einliest und einer virtuellen writeImage(String imgName) und writeHeader(String imgName) Methode. - Leiten sie davon die Klasse P3 oder P6 ab, die ein Bild einlesen und speichern können soll. - Schreiben sie ein main Programm, welches ein P3 oder P6 Bild einliest, die rot grün blau Werte mittelt und in einem neuen Bild mit gleichen (gemittelten) Werten abspeichert. */ #include #include #include class PPM{ public: char magic[6]; // "PPM" int width; int height; int color_depth; // 1, 2, 4, 8 FILE *fp, *out; public: virtual void readImage()=0; virtual void writeImage(char* imgName)=0; void readHeader(char *imgName){ fp = fopen(imgName, "rb"); // Binärmodus öffnen if (fp == NULL) { perror("Error opening file"); } fscanf(fp,"%s",magic); fscanf(fp,"%d %d",&width, &height); fscanf(fp,"%d",&color_depth); // Header ausgeben printf("Magic Number: %s\n", magic); printf("Width: %d\n", width); printf("Height: %d\n", height); printf("Color Depth: %u\n", color_depth); } void writeHeader(char* imgName){ out = fopen(imgName,"wb"); fprintf(out,"%s\n",magic); fprintf(out,"%d %d\n",width,height); fprintf(out,"%d\n",color_depth); } }; class P3 :public PPM{ public: int **red, **green, **blue; char imgName[100]; P3(char* imgName){ strcpy(this->imgName,imgName); readHeader(imgName); // Allokiere ein Array von Zeigern auf int red = new int*[height]; green = new int*[height]; blue = new int*[height]; // Allokiere für jeden Zeiger ein Array von ints for (int i = 0; i < height; ++i) { red[i] = new int[width]; green[i] = new int[width]; blue[i] = new int[width]; } } void readImage(){ for(int x=0; xreadImage(); myImage->toGray(); myImage->writeImage((char*)"lena_Kopie.ppm"); delete myImage; }