Moje pytanie brzmi jak go zmienić, aby można było wczytać kilka obrazów (po wczytaniu kolejnego w tym programie poprzedni zostaje usunięty) naraz i wykonywać na nich operacje, np użytkownik wybiera plik nad którym chce pracować spośród wczytanych.
Z góry dziękuję za odpowiedź.
Kod: Zaznacz cały
#include <stdio.h>
#include <string.h>
#define MAXNAMELENGTH 40
typedef struct {
char* pointer;
int x, y, scale;
char name[MAXNAMELENGTH];
short int modified;
struct image *next;
} image;
image * lista=NULL;
void clearscreen() {
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}
void sleep_(int ms) {
#ifdef _WIN32
sleep(ms);
#else
usleep(ms * 1000);
#endif
}
#define DL_LINII 80
/* funckja zostala zmodyfikowana tak, aby "tablica" zostala tworzona na wielkosc obrazu,
poprawiona zastala kontrola odczytywanych wartosci */
int img_load(FILE* p, image* img) {
char s[DL_LINII];
int znak,koniec=0,i,j;
unsigned int element;
/*sprawdzenie czy podano prawidłowy uchwyt pliku */
if (p==NULL) {
fprintf(stderr,"Blad: Nie podano uchwytu do pliku\n");
return(0);
}
if (fgets(s,DL_LINII,p)==NULL) koniec=1;
/* Sprawdzenie "numeru magicznego - powinien być P2 */
if ( (s[0]!='P') || (s[1]!='2') || koniec) {
fprintf(stderr,"Blad: To nie jest plik PGM\n");
return(0);
}
/* Pominiecie komentarzy */
do {
if ((znak=fgetc(p))=='#') {
if (fgets(s,DL_LINII,p)==NULL) koniec=1;
} else {
ungetc(znak,p);
}
} while (! koniec && znak=='#');
/* Pobranie wymiarow obrazu i liczby odcieni szarosci */
if (fscanf(p,"%d %d %d",&img->x, &img->y, &img->scale)!=3) {
fprintf(stderr,"Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
return(0);
}
if (img->pointer != NULL) { /* jezeli orbaz istnieje juz w pamieci, zwolnij *
dodaj(img->pointer);
}
img->pointer = malloc(img->x * img->y); /* przyznacz miejsce dla obrazu */
if (img->pointer == NULL) {
fprintf(stderr,"Blad: malloc\n");
return 0;
}
/* Pobranie obrazu i zapisanie w tablicy*/
for (j=0; j < img->y; j++) {
for (i=0; i < img->x; i++) {
/* wypelnij obszar w pamieci na wzor tablicy dwuwymiarowej */
if (fscanf(p,"%u", &element)!=1) {
fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
return(0);
}
if (element > img->scale) element = img->scale;
*(unsigned char*)(img->pointer + i + j*img->x) = element;
/*printf("%u ", *(unsigned char*)(img->pointer));*/
}
}
return img->x*img->y;
}
void img_init(image* img) {
memset(img, 0, sizeof(image)); /* inicjuje obiekt image */
}
void img_open(image* img) {
char name[MAXNAMELENGTH];
FILE* file;
clearscreen();
printf("(Wczytaj)\nNazwa pliku: ");
scanf("%s", &name);
printf("\n");
file = fopen(name, "r");
if (file == NULL) {
printf("Blad: Nie mozna otworzyc pliku ""%s""\n", name);
sleep_(1500);
} else {
if (img->pointer != NULL) { jezeli jakis obraz jest juz wczytany, usun go z pamieci, zeruj zmienne
free(img->pointer);
img_init(img);
}
if (img_load(file, img)) {
memcpy(img->name, name, MAXNAMELENGTH); /* zapisz nazwe pliku */
img->modified = 0;
fclose(file);
} else {
img_init(img);
printf("Blad: Nie mozna zaladowac obrazu\n");
sleep_(1500);
}
}
}
//tu jakis przykład operacji na pliku
void img_invert(image *img) { /* negatyw */
int i, j;
char* pixel;
if (img->pointer != NULL) {
clearscreen();
printf("Negatyw...\n");
for (i=0; i < img->x; i++) {
for (j=0; j < img->y; j++) {
pixel = img->pointer + i + j*img->x;
*pixel = img->scale - *pixel; /* odwraca kolor kazdego elementu "tablicy" */
}
}
img->modified = 1;
printf("Gotowe\n");
sleep_(500);
}
}
int main() {
int input;
image img;
img_init(&img);
do {
clearscreen();
if (img.pointer != NULL) { /* jezeli obraz jest wczytany */
printf("Otwarty plik: %s%c [%dx%d]\n\n", img.name, img.modified? '*' : ' ', img.x, img.y);
printf("Menu:\n");
printf(" 1. Wczytaj\n");
printf(" 2. Negatyw\n");
} else {
printf("Menu:\n");
printf(" 1. Wczytaj\n");
}
printf(" 0. Wyjdz\n\n");
printf(" Wybor: ");
scanf("%d", &input);
if (img.pointer == NULL) { /* jezeli obraz nie jest jeszcze wczytany */
if (input > 1 || input < 0) { /* jezeli wprowadzona niepoprawna opcja */
printf("Niepoprawna opcja\n");
sleep_(600);
continue;
}
}
switch(input) {
case 1: /* wczytwyanie */
if (img.pointer == NULL) { /* jezeli plik nie jest jeszcze otwarty */
img_open(&img);
} else {
if (img.modified) {
printf("Plik nie zostal zapisany od ostatniej zmiany\n");
printf("Zapisac?\n 1. tak\n 0. nie\n");
scanf("%d", &input);
if (input == 1) {
img_save(&img);
} else
input = -1; /* aby program nie zostal zamkniety */
}
img_open(&img);
}
break;
case 2: img_invert(&img); break; /* negatyw */
case 0: /* wyjscie */
if (img.modified){
printf("Zapisac plik przed wyjsciem?\n 1. tak\n 0. nie\n");
scanf("%d", &input);
if (input == 1) {
img_save(&img);
input = 0; /* wymus wyjscie z petli */
clearscreen();
}
}
break;
default:
printf("Niepoprawna opcja\n");
sleep_(600);
}
} while (input != 0);
if (img.pointer != NULL) {
free(img.pointer);
}
clearscreen();
}