/* 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 typedef struct { char magic[6]; // "PPM" int width; int height; unsigned char color_depth; // 1, 2, 4, 8 } PPMHeader; int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } FILE *fp = fopen(argv[1], "rb"); // Binärmodus öffnen if (fp == NULL) { perror("Error opening file"); return 1; } PPMHeader header; // Header einlesen if (fread(header.magic, sizeof(header.magic), 1, fp) != 1) { fprintf(stderr, "Error reading magic number\n"); fclose(fp); return 1; } if (strncmp(header.magic, "PPM", 3) != 0) { fprintf(stderr, "Not a PPM file\n"); fclose(fp); return 1; } if (fread(&header.width, sizeof(header.width), 1, fp) != 1) { fprintf(stderr, "Error reading width\n"); fclose(fp); return 1; } if (fread(&header.height, sizeof(header.height), 1, fp) != 1) { fprintf(stderr, "Error reading height\n"); fclose(fp); return 1; } if (fread(&header.color_depth, sizeof(header.color_depth), 1, fp) != 1) { fprintf(stderr, "Error reading color depth\n"); fclose(fp); return 1; } // Header ausgeben printf("Magic Number: %s\n", header.magic); printf("Width: %d\n", header.width); printf("Height: %d\n", header.height); printf("Color Depth: %u\n", header.color_depth); fclose(fp); return 0; }