- Editor de imagini -
(structura se afla in 'function.h')
Am considerat ca folosirea unei structuri va duce la o rezolvare
a temei mult mai organizata. Astfel, declaram structura 'v', in care
avem posibilitatea de a stoca:
-- **a -> matricea imaginii;
-- **r, **g, **b -> 3 matrici ale imaginii color, fiecare
reprezentand cate o culoare: red, green, blue;
-- latimea matricii
-- inaltimea matricii
-- magic-word-ul
-- x1, y1, x2, y2 -> coordonatele din selectie
-- *v_frecventa -> frecventa pixelilor -> ne va ajuta la
histograma si egalizare
-- variabila 'selectat' ne arata daca este selectata o parte
a pozei. daca da este 1, daca nu este 0;
-- analog si pentru variabila 'imagine_incarcata'
-- 'valoare_maxima' reprezinta valoarea maxima din matrice;
In functia main declaram variabilele:
-- 'v' -> structura in care stocam toate aspectele pozei cum
am spus mai spus
-- '*p' -> aceasta va stoca intreaga comanda pe care o primim,
inpreuna cu parametrii (exp: *p = 'SELECT 10 20 30 40')
-- '*comanda' -> in care o sa stocam cu ajutorul
lui strtok primul cuvant
Vom incepe cu un while(1), care nu se va opri pana nu primim
comanda EXIT, in care exista un 'break;'.
Inlantuirea de if-uri ne permite sa tratam fiecare comanda
in parte. Verificam cu strcmp variabila 'comanda' si pentru
fiecare comanda este alocat cate un if, in care se afla cate o
functie.
Un caz mai special le reprezinta comenzile SELECT si SELECT ALL,
in care verific daca al doilea cuvant din stringul "p" este egal
cu "ALL"... daca da, inseamna ca avem comanda SELECT ALL...
daca nu, inseamna ca avem comanda SELECT.
Am creat cate o functie si un fisier (.c) pentru fiecare comanda.
Conform pdf-ului cu Tema3, comenzile (LOAD, CROP, APPLY etc...) sunt
intr-o anumita ordine, asa ca am numerotat fiecare fisier.c.
Fisierul 0.function.c contine functii care sunt comune aproape
tuturor celorlaltor comenzi. Am decis ca inloc sa le scriu de mai
multe ori, sa le pun intr-un fisier separat.
- 'alocare_rgb_ALL' aloca red, green, blue pe
dimensiunile totale ale matricii;
- 'alocare_rgb_portiune' aloca red, green, blue pe
o dimensiune partiala a matricii;
- 'eliberare_matrice' elibereaza poza
- 'verificare_existenta_imagine' verifica daca este incarcata
vreo poza;
- 'swap' schimba doua valori intre ele, a doua variabile;
- 'limitare_rezultate' este clamp;
Fisierul 1.load.c contine functii pentru comanda 'LOAD':
- 'verificare_comentariu' verifica daca avem comentarii in
fisierul pozei
- 'citire_info_poza' citeste informatiile pozei, adica magic-word,
latimea, inaltimea si valoarea maxima
- 'LOAD' este functia principala:
a) deschide fisierul
b) aloca matricea in care urmeaza sa stocam informatia
din fisier
c) in functie de magic-word stim cum sa citim informatia
din fisier: text/binar, PGM/PPM
d) inchidem fisierul
Fisierul 2.select.c contine functii pentru comenzile 'SELECT' si 'SELECT ALL':
- 'verif_comanda_select' verifica daca comanda este invalida
- 'verif_coordonate' verifica daca coordonatele sunt valide
- 'SELECT' este prima functie principala:
a) cele 3 if-uri verifica comanda introdusa
b) stocam coordonatele noi
- 'SELECT_ALL' este a doua functie principala:
a) atribuim coordonatelor x1, y1, x2, y2 dimensiunile
care cuprind intreaga imagine
Fisierul 3.histogram.c contine functii pentru comanda 'HISTOGRAM':
- 'verif_comanda_histograma' verifica parametrii din comanda
- 'HISTOGRAM' este functia principana:
a) cele 3 if-uri verifica comanda introdusa
b) reinitializam vectorul de frecventa cu 0
c) calculam vectorul de frecventa
d) calculam numarul maxim de stelute
e) cu ajutorul formulei calculam histograma si o afisam
Fisierul 4.equalize.c contine functii pentru comanda 'EQUALIZE':
- 'EQUALIZE':
a) verificam existenta imaginii
b) verificam daca e imagine PGM
c) reinitializam vectorul de frecventa cu 0
d) calculam vectorul de frecventa
e) conform formulei date, calculam valoarea noua a pixelului
Fisierul 5.rotate.c contine functii pentru comanda 'ROTATE':
- 'verif_comanda_rotate' verifica unghiul de rotire
- 'rotire_90_grade_ALL' roteste intreaga poza la 90 de grade
- 'rotire_180_grade_ALL' roteste intreaga poza la 180 de grade.
Aceasta functie nu este tocmai necesara, dar am facut o pentru
a optimiza programul. O rotire la 270 de grade ar consta in
3 rotiri succesive la 90 de grade, ceea ce inseamna 3 realocari.
O rotire la 270 de grade mai poate insemna si o rotire la 180
si una la 90. Pentru rotirea la 180 nu mai este nevoie de realocare,
asa ca pentru a face o rotire la 270 acum este nevoie numai de o
realocare. Cred ca se salveaza timp cu acest aspect.
- 'rotire_90_grade_portiune' roteste la 90 de grade o portiune a pozei
- 'ROTATE' este functia principala:
a) cele doua if-uri verifica toate conditiile care trebuie sa le
le respecte comanda
b) verificam daca este selectata toata imaginea sau nu. pentru
rotirea la 90 de grade a intregii imagini am facut 'swap' la
latime si inaltime, se schimba dimensiunile intre ele
Fisierul 6.crop.c contine functii pentru comanda 'CROP':
- 'alocare_rgb_crop' aloca 3 matrici (red, green, blue) conform
dimensiunilor portiunii care trebuie cropata;
- 'CROP' este functia principala:
a) alocam matrici auxiliare. pentru imagine PGM alocam doar una
pentru imagine PPM mai alocam inca 3. cate una pt fiecare culoare
b) copiem in matricile auxiliare valorile de care avem nevoie
c) eliberam imaginea principala deoarece avem stocata informatia
de care avem nevoie
d) alocam cu noile dimensiuni
e) resetam coordonatele pentru ca acum cuprind toata imaginea
f) copiem in 'v' noua poza
g) nu mai avem nevoie de matricile auxiliare si le dealocam
Fisierul 7.apply.c contine functii pentru comanda 'APPLY':
- 'apply_edge' calculeaza noua valoare a pixelului cu ajutorul formulei date
- 'apply_sharpen' analog
- 'apply_blur' analog
- 'apply_gaussian_blur' analog
- 'APPLY' este functia principala:
a) cele 4 if uri verifica daca comanda este buna
b) alocam matrici auxiliare si vom copia poza noastra in ele,
deoarece atunci cand calculam noua valoare a pixelului,
valoarea vecinilor va fi influentata
c) cu cele doua for uri parcurgem pixelii selectati
Fisierul 8.save.c contine functii pentru comanda 'SAVE':
- 'SAVE':
a) descidem fisierul
b) verificam cum trebuie sa scriem fisierul
c) in functie de tipul de imagine text/binar PGM/PPM vom
stoca poza corespunzator
d) inchidem fisierul
De a lungul intregului cod am facut programare defensiva;
-
Notifications
You must be signed in to change notification settings - Fork 0
Nastyst16/Image-Editor
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
About
PCLP 1 Homework 3 -> Image Editor
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published