Am initializat structura Image pentru a retine informatiile despre imaginea incarcata. Dimensiunile (w și h) și formatul sunt setate la 0, iar matricele de pixeli pentru PGM și PPM sunt stocate la aceeași adresă de memorie, doar una fiind utilizata la un moment dat,în funcție de formatul imaginii(2 pentru PGM si 3 pentru PPM).
Am implementat functia process_command pentru a interpreta comenzile date. Fiecare comanda este verificata cu strncmp sau strcmp, iar pentru comenzi ce necesita parametri suplimentari, am folositsscanf pentru a-i extrage. In funcție de comandă, se apeleaza functiile corespunzatoare.
Functia load() deschide fisierul specificat de file_name in mod binar, verificand formatul imaginii(PGM sau PPM) pe baza antetului. Daca fisierul este valid, se elibereaza memoria alocata anterior. In funcție de formatul imaginii, aloca memoria corespunzatoare pentru matricea de pixeli, fie pentru un singur canal (PGM), fie pentru trei canale (PPM). Conversiile la unsigned char sunt necesare pentru că datele de pixeli sunt citite ca octeti (1 byte fiecare), ci nu ca int(care ar ocupa mai mult spațiu),asa cum am initializat datele in structura Pixel. Asadar, citirea din fisiere se va face la nivel de octeti, insa pe parcursul programului voi lucra cu date de tip int.
Funcția save() scrie imaginea intr-un fisier specificat de file_name. Incepe prin a verifica daca imaginea este valida. Apoi deschide fisierul pentru scriere in mod text sau binar, in funcție de parametrul ascii.Scrie antetul fișierului (formatul și dimensiunile), urmat de pixeli. In funcție de formatul imaginii (PGM sau PPM) și de modul de salvare (text sau binar), scrie fiecare pixel corespunzător. Conversiile valorilor pixelilor la unsigned char are acelasi scop ca la functia load(). La final, inchide fisierul.
Functia select_image() preia o comanda pentru selectarea unei regiuni intr-o imagine. Verifica daca imaginea este incarcata si valida. Daca comanda este "SELECT ALL", selecteaza intreaga imagine. Coordonatele date in comanda sunt extrase si validate, iar daca sunt corecte, se ajusteaza pentru a asigura o selectie corecta (x1 < x2, y1 < y2). In final, coordonatele regiunii selectate sunt actualizate.
Functia histogram() genereaza un histogram pentru o imagine PGM pe baza unei regiuni selectate. Verifica daca imaginea este incarcata si in format PGM, initializeaza vectorul frecv pentru frecvente, imparte gama de valori 0-255 in y bin-uri, parcurge pixelii din regiune si incrementeaza frecventele corespunzatoare. Determina frecventa maxima folosind find_max(), calculeaza stelute proportionale cu frecventele si afiseaza histograma.
Functia pentru rotatie verifica erorile, calculeaza numărul rotatiilor efective necesare (num_rotations) reducand unghiul la intervalul [0, 360]. Daca intreaga imagine este selectata, apeleaza rotate_entire_image() pentru fiecare rotatie necesara. Daca e doar o regiune selectata, apelează rotate_right_once() pentru fiecare rotatie.
Functia crop() decupeaza regiunea selectata a imaginii, actualizand dimensiunile si datele de pixel. Creeaza o matrice noua, copiaza datele din selectia imaginii originale in aceasta, elibereaza memoria vechii imagini, actualizeaza pointerul si dimensiunile imaginii. Selectia devine noua dimensiune a imaginii, iar vechea memorie este eliberata pentru a preveni scurgerile de memorie.
Comenzile de apply aplică un filtru pe imagine pentru a-i modifica caracteristicile, cum ar fi claritatea sau marginea. Acestea folosesc o matrice de numere (kernel) pentru a calcula un nou pixel pentru fiecare pixel din imagine. Fiecare pixel nou este obținut prin multiplicarea valorilor pixelilor vecini cu valorile corespunzătoare din kernel și adunarea rezultatelor
Functia equalize() calculeaza mai intai histograma intensitatii pixelilor, adica numarul de aparitii al fiecarei valori de intensitate. Apoi, calculeaza functia de distributie cumulativa (CDF), care reprezinta proportia pixelilor cu o intensitate mai mica sau egala cu fiecare valoare. In final, aplica aceasta distributie pe imagine, ajustand valorile pixelilor pentru a distribui mai uniform intensitatea luminii, crescand astfel contrastul.
Programul se incheie la citirea comenzii EXIT. Functia exit_program elibereaza memoria imaginii si opreste programul.