Grafica si canoanele binare

Ce frumos arată imaginile pe monitorul calculatorului ! Totusi, pentru afisarea lor este necesar să stim modul în care este stocată informatia.

Ioan Iacob

În ultimii ani suntem martorii unei răspândiri tot mai mari a interfetelor utilizator grafice. Dacă vom lua în considerare doar platformele OS/2 si Windows 3.1 există suficiente motive să considerăm întemeiată aparitia unui grupaj de articole privind posibilitătile de manipulare a informatiilor de natură grafică. Este oare necesar să mai continuăm argumentarea? Dacă da, să mai spunem că există un adevărat folclor în ceea ce priveste structura formatelor grafice folosite în prezent. Iată încă un motiv pentru a pune ordine (relativ vorbind) în acest adevărat Turn Babel al formatelor grafice. În absenta unor standarde unanim acceptate, fiecare aplicatie a încercat să lanseze pe piată un format propriu rezultând astfel, după cum am spus mai înainte, un adevărat haos. În cadrul acestui grupaj vom încerca să punem la dispozitia celor interesati o serie de specificatii tehnice privind cele mai utilizate formate la ora actuală. Pentru formatele mai complexe, vom încerca să descriem regulile de bază în ceea ce priveste codificarea si astfel veti putea recunoaste formatul si veti întelege cum se poate decodifica. Pentru a putea trece la prezentarea efectivă a diferitelor tipuri de structuri, am considerat necesară si utilă trecerea în revistă a teoriei referitoare la reprezentarea grafică.

Bitmap sau vectorial

Sunt două metode de bază (foarte diferite) pentru stocarea informatiilor de natură grafică în fisiere: reprezentare bitmap ("hartă de biti" sau rastru) si reprezentare vectorială. Fiserele pot face uz de una dintre cele două metode sau de amândouă.

Reprezentarea bitmap este folosită în special datorită faptului că este usor de implementat si poate fi folosită pentru orice imagine, între anumite limite. Practic o reprezentare bitmap se obtine prin aplicarea unei grile pe cadrul imaginii. Fiecare pătrătel al grilei va cuprinde o anumită zonă a imaginii si va fi reprezentat pe un anumit număr de biti. Trebuie să spunem că de fapt, pe undeva, principiul descris este asemănător cu cel folosit la monitoare (fiecare pătrătel îl vom considera ca fiind de aceeasi mărime cu un pixel de pe ecran). Valoarea stocată poate să se refere la culoarea pixelului, crominantă sau orice altă mărime relevantă. Deci fiecare valoare asociată unui pixel este reprezentată separat.

Reprezentarea vectorială se referă la descrierea imaginii printr-o serie de linii, forme, regiuni umplute cu o anumită culoare sau hasurate. În mod normal, dacă ne referim la sensul restrâns al cuvântului vector vom întelege practic că este vorba de o linie. Dacă ne raportăm la expresia „reprezentare vectorială" atunci prin vector trebuie să întelgem si forme ca: pătrate, cercuri, elipse si alte astfel de figuri geometrice simple. Studiind fiseirele în care se face uz de metoda reprezentării vectoriale vom observa că arată aproape ca un program. Ele pot contine o serie de comenzi cu parametri, într-un format ASCII. De exemplu un cerc cu rază de 100 milimetri al cărui centru se află în punctul de coordonate x=22,5 mm si y=50 mm, poate fi codificat prin expresia circle (225,500,100). Această comandă poate fi scrisă în fisier folosind un simplu editor de texte. În mod ocazional, cele două metode sunt folosite într-un limbaj de descriere cum este PostScript, dar chiar si aici cele două reprezentări sunt distincte. Fiecare metodă are setul ei de aplicatii cu care este mai bine utilizată.

Avantaje si dezavantaje

Formatul bitmap este eficient în cazul folosirii sale pentru stocarea imaginilor cu variatii complexe de culoare, umbriri, etc., cum este cazul fotografiilor sau a picturilor. Formatul vectorial este folosit în mod special în cadrul aplicatiilor CAD sau a imaginilor continând forme simple sau o paletă de culori mai mică. Graficele, histogramele sau unele desene făcute cu mâna liberă sunt stocate de obicei în format vectorial. Uneori aceleasi imagini sunt stocate în format bitmap cel putin pentru faptul că este mai usor.

În programele DTP (desktop publishing), fonturile sunt convertite în mod frecvent din format vectorial în format bitmap si invers, acest lucru depinzând de faza de lucru: conceperea fonturilor sau listarea la imprimantă. Desi la un moment dat această conversie dintr-un format în altul poate să apară ca o afacere nu prea elegantă, totusi avem astfel posibilitatea să beneficiem de pe urma avantajelor ambelor tehnici. Fonturile sunt usor de scalat în format vectorial dar la tipărire (tinând cont de faptul că imprimanta foloseste metoda raster-scan, ca si în cazul televizorului) este mai eficient să folosim formatul bitmap. Prin contrast, un periferic de genul plotter-ului, care este conceput pentru trasarea de linii, necesită date înregistrate în format vectorial.

Reprezentarea bitmap suferă din cauza câtorva probleme de natură practică si teoretică. O problemă de ordin practic este cea referitoare la mărimea imaginii. Adică, odată cu mărirea rezolutiei va fi nevoie de un spatiu de stocare mai mare si corespunzător o zonă de memorie mai mare pentru procesare si afisare. Din acest motiv, abilitatea stocării fisierelor bitmap într-o formă comprimată este o problemă foarte importantă. Referitor la volumul mare de date ce trebuiesc manipulate în cazul unei rezolutii fine, avem nevoie, în acest scop, de un procesor puternic si un bus de date cât mai mare. În acest mod apare evidentă diferenta dramatică între performanta unui procesor cu bus intern pe 32 biti si un procesor pe 16 biti.

Altă problemă legată de reprezentarea bitmap este cea privind flexibilitatea. Practic totul derivă din faptul că imaginile bitmap au o rezolutie fixă, adică atunci când este înregistrată informatia se stie sigur că avem X pixeli pe orizontală si Y pixeli pe verticală. Dacă se încearcă mărirea imaginii atunci pixelii vor deveni destul de mari pentru ca să se poată observa forma lor rectangulară - apare astfel un efect numit "efect de scară". Programele de grafică mai evoluate pot evita această problemă folosind interpolarea dar în acest caz ne lovim din nou de timpul de procesare necesar în acest scop. Acum, în cazul în care vom micsora o imagine vom pierde din rezolutie (sau claritate). Dacă vom dori restaurarea imaginii la mărimea initială vom ajunge să vedem ceva relativ confuz si de proastă calitate.

Reprezentarea vectorială are mai multe limitări decât reprezentarea bitmap în ceea ce priveste continutul imaginilor care se doresc a fi stocate în acest format. Avantajul major este totusi flexibilitatea si eficienta în cazul folosirii lor în diferite aplicatii. De exemplu o linie dreaptă poate fi reprezentată doar prin coordonatele punctelor ce simbolizează capetele si nu prin fiecare punct al liniei ca în cazul tehnicii bitmap. O curbă poate fi aproximată printr-o serie de linii drepte legate între ele. Scalarea (mărirea sau micsorarea) poate fi făcută fără ca acest lucru să influenteze în vreun fel rezolutia.

Limbaje de descriere a paginii

Aceste limbaje orientate spre descrierea informatiilor de natură grafică se mai cheamă (în original) page description languages (PDLs), display lists sau metafiles. Putem să le privim aproximativ ca pe niste limbaje de nivel înalt orientate spre satisfacerea cerintelor unui anumit domeniu. Dacă tinem cont de prezentarea făcută formatului bitmap si respectiv formatului vectorial, ne putem da seama că aceste limbaje de descriere a paginii sunt eficiente în cel de-al doilea caz. De fapt totul depinde de un interpretor sofisticat precum si de mediul în care se crează desenul.

Ca exemplu putem să ne referim la limbajul PostScript, care la ora actuală este cel mai popular. Este un limbaj de descriere a paginii complex, cu un vocabular de comenzi destul de vast (chiar extensibil). Ideea initială era să fie folosit la reprezentarea vectorială pentru periferice cum sunt ecranul si imprimanta. Totul, chiar si corpul literelor, este descris folosind o reprezentare vectorială. Problema intervine în cazul descrierii fotografiilor dar PostScript a fost conceput astfel încât fisierele (vectoriale) să poată include si bitmap-uri. PostScript este suficient de complex astfel încât o discutie exhaustivă referitoare la acest subiect depăseste cadrul acestei prezentări.

Monocrom si color

Imaginile stocate pot fi, după cum putem intui foarte usor, colorate sau alb-negru. Acest mod de a privi lucrurile este suportat atât de tehnica bitmap cât si de tehnica vectorială. Tehnologiile privind modul optim de stocare, codificare-decodificare a imaginilor alb-negru sau color sunt multe, variate si complexe astfel că ne-ar trebui probabil câteva volume (bine legate) pentru a reusi o trecere a lor în revistă si respectiv o descriere mai detaliată. Aici vom discuta doar câteva concepte fundamentale în scopul întelegerii cât mai clare a aspectelor care privesc formatele grafice (înregistrarea în fisier a informatiilor despre culoare).

Imaginile alb-negru se mai numesc si monocrome ca urmare a faptului că este vorba de o singură culoare care trebuie să substituie negrul. Acest tip de imagine este alcătuit din regiuni (pure) albe si negre. Fisierele asociate acestor imagini nu fac referire la culoare deloc si pentru reprezentare se aplică conventia prin care un bit poate reprezenta un pixel: 1 pentru negru si 0 pentru alb sau invers. În cadrul unor imagini monocrome (ca de exemplu fotografiile alb-negru) este necesară folosirea nuantelor de gri. În acest caz spunem că avem de-a face cu imagini greyscale.

Ochiul uman poate interpreta un anumit model, format din puncte albe si negre, ca fiind o nuantă de gri. Tehnica folosită în acest scop poartă denumirea de halftoning sau dithering. În cazul folosirii tehnicii de dithering, imaginea rămâne practic tot alb-negru.

Acum trebuie să spunem că pot apare o serie de dezavantaje în ceea ce priveste utilizarea tehnicii halftone ca metodă de obtinere a nuantelor de gri. În primul rând, editarea imaginilor va fi dificilă deoarece majoritatea programelor de grafică nu pot distinge între punctele folosite pentru nuantare si punctele folosite pentru trasarea liniilor. Tehnica poate introduce un asa zis „efect de moar" (practic efectul unei tesături de mătase) la afisarea imaginii. Mai mult, dându-se un număr de pixeli, prin dithering se reduce rezolutia efectivă a imaginii. Mai multi pixeli trebuie folositi, câtiva albi si câtiva negri, pentru a reprezenta nuanta de gri asociată unui singur punct (si pentru reprezentarea unui punct color se foloseste un pattern format din trei puncte de culori diferite, rosu, verde si albastru, puncte ce nu sunt sesizate de ochi). De exemplu, pentru a putea reprezenta patru nuante de gri trebuie să folosim cel putin trei pixeli. Acest lucru se întâmplă în momentul în care o imprimantă laser obisnuită nu poate utiliza decât două valori: alb si negru. Totusi înaintea listării imaginii la imprimantă există o alternativă mai bună: folosirea adevăratelor nuante de gri.

Nuante reale de gri

Deci imaginile care necesită tonuri de gri pot fi stocate si altfel decât utilizând tehnicile prezentate mai înainte. Când utilizăm nuante de gri reale spunem că imaginea presupune un anumit număr de biti pentru adâncime. În acest caz, o imagine bitmap monocromă este descrisă prin intermediul a trei mărimi: numărul de pixeli pe orizontală (lătime), numărul de pixeli pe verticală (înăltime) si numărul de pixeli folositi pentru reprezentarea luminozitătii pixelului - adâncimea imaginii. O poză având 256 de pixeli pe directia orizontală, 256 de pixeli pe directia verticală si 16 nuante de gri este descrisă prin notatia 256 x 256 x 4. Aceste dimensiuni sunt utile deoarece ele ne dau o idee asupra mărimii fisierului în care este înregistrată imaginea (necomprimată). Referindu-ne la exemplul precedent putem face un scurt calcul astfel că fisierul are nevoie de 256 x 256 x (1/2 octet) sau 32768 octeti. Dacă luăm în considerare faptul că ochiul uman poate discerne cam 64 de nuante de gri atunci pentru imaginile reale sunt necesari 6 biti.

Asigurarea acuratetei nuantelor de gri este o problemă care poate apare în momentul conversiei imaginii între forma fizică si forma electronică (practic este vorba de scanarea unei fotografii - transformare din forma fizică în forma electronică sau de listarea la imprimantă). Scanner-ul răspunde aproximativ liniar la variatiile intensitătii luminoase: la dublarea intensitătii luminoase se va ajunge la o scală de nuante de gri de două ori mai largă. În cazul ochiului uman problema se schimbă astfel încât acesta răspunde la un stimul cu o valoare egală cu cubul variatiei intensitătii luminoase. Dacă un punct este de două ori mai luminos decât altul atunci cel de-al doilea va fi perceput de către ochi ca având luminozitatea sau reflectivitatea de 8 ori mai mare (aspect folosit la formatul grafic JPEG).

Aproape toate perifericele utilizate pentru achizitionarea sau redarea datelor de natură grafică sunt caracterizate de o dependentă neliniară între variatiile de intensitate si răspunsul lor. În cazul materialelor listate la imprimantă limitele sunt impuse de cerneală, hârtie, tehnica de halftoning folosită. Problema neliniaritătii apare si în cazul tuburilor catodice ale monitoarelor.

Rezolvarea acestor probleme depinde în mare măsură de cunoasterea limitărilor si respectiv a comportării diferitelor medii. Ca urmare se va proceda la ajustarea în mod corespunzător a datelor. Unele formate de fisiere contin informatii care permit ajustarea scalei nuantelor de gri. În orice caz, la ora actuală există aplicatii care pot face astfel de corectii. Considerând, de exemplu, o imagine scanată de un scanner neliniar, stim că nonlinearitătile se vor însuma (să notăm valoarea totală cu g) ajungându-se în final la ecuatia output=(input)g

Culoare

Până de curând, problema redării informatiei de culoare (este vorba despre listare) era într-un stadiu nesigur. La ora actuală putem spune că asistăm la o revolutie a culorii prin proliferarea tehnologiilor de tipărire, răspândirea unor aplicatii DTP care fac posibilă folosirea întregii puteri a unui PC (repectiv MacIntosh) în ceea ce priveste culoarea.

Cea mai simplă reprezentare a informatiei de culoare este cea numită spot color prin care alegem o valoare dintr-o multime specifică perifericului de iesire. Luând în considerare exemplul unui ploter echipat cu mai multe stilouri colorate, va trebui să specificăm care dintre ele să fie folosit pentru desenarea unui anumit cerc. Deoarece această tehnologie se aplică mai mult pentru desenarea liniilor, cercurilor si a altor forme geometrice putem afirma că de fapt eficienta iese în evidentă atunci când datele sunt stocate în format vectorial sau folosind limbaje de descriere a paginii. Acum referindu-ne la numărul tot mai mare de imprimante color apărute pe piată, tehnologia spot color se poate referi si la generarea unei culori prin combinarea culorilor primare (mixarea culorilor).

Atunci când avem nevoie de un număr mare de culori, le putem obtine prin mixarea culorilor asa-zis primare (existente în număr limitat). În principiu există două scheme de culori primare utilizate în mod curent, RGB si CMYK, folosirea lor depinzând de perifericul de iesire.

Sunt putini acei care probabil nu cunosc, la ora actuală, că de fapt RGB este notatia prin care ne gândim la red, green, blue (mai pe româneste rosu, verde, albastru). Practic această tehnică de mixare este folosită în special de către aparatele care emit lumină - asa cum sunt monitoarele calculatoarelor. Ecranele monitoarelor sunt alcătuite din triade de spoturi cu fosfor, fiecare spot emitând lumină rosie, verde sau albastră. Fiecare triadă formează un pixel. Prin ajustarea cantitătii de rosu, verde si albastru se poate genera o paletă largă de culori. Deoarece culoarea rezultată provine din adunarea luminii de diferite culori (pure) vom folosi sintagma de culori aditive.

Notatia CMYK este folosită pentru desemnarea culorilor cyan, magenta, yellow si black (sau albastru deschis, violet, galben si negru). Acestă tehnică este utilizată mai ales la listare. Fiecare dintre aceste cerneluri primare absorb culoarea respectivă din totalitatea culorilor cuprinse în alb. Din cauza specificului acestei tehnici spunem că avem de-a face cu culori substractive. Problema apare în momentul în care dorim să facem conversia unui fisier care păstrează informatia de culoare apelând la tehnica RGB (în vederea afisării pe ecran), într-un fisier posibil de a fi listat la imprimantă (prin folosirea tehnicii CMYK). La conversie, ne lovim de faptul că nu toate culorile se pot converti cu o calitate destul de bună.

În prezent există o metodă mai bună de specificare a paletei de culori, notată prin HSI, care poate fi utilizată indiferent de metoda de mixare (RGB sau CMYK). Prin HSI întelegem Hue, Saturation si Intensity adică: culoare, saturatie (acest termen se referă la continutul de alb - culoarea ciocolatei cu rom este foarte saturată pe când culoarea ciocolatei cu lapte este aceeasi cu cea anterioară dar este mai putin saturată), intensitate (sau luminozitate - în acest mod distingem portocaliul privit în lumina soarelui sau la umbră). Această metodă, HSI, este intuitivă si se poate regăsi în multe aplicatii soft. Există chiar si adaptoare video care acceptă această tehnică. Referitor la tehnicile moderne de listare, există în prezent imprimante ce folosesc tehnologia inkjet si permit evitarea folosirea tehnicii de dithering prin mixarea efectivă a culorilor în acelasi punct. Pentru imprimarea unui punct de culoare portocalie se procedează astfel: se imprimă în punctul de coordonate (x,y) culoarea rosie iar apoi în acelasi punct de coordonate (x,y) - cerneala rosie nu s-a uscat încă - se imprimă culoarea galbenă astfel că cernelurile se amestecă „la locul faptei" si rezultă culoarea dorită.

Planele de culoare ale imaginii. Fiecare pixel dintr-o imagine bitmap (sau fiecare element grafic în cazul formatului vectorial) necesită specificarea unui set de trei sau patru valori: câte o valoare pentru fiecare culoare primară (RGB, CMYK) sau variabilă independentă (HSI), totul depinzând de schema de reprezentare folosită. Aceste seturi de valori se pot organizata în două moduri.

Modalitatea aflată mai la îndemână, în cazul imaginilor bitmap, este cea prin care organizăm datele în planuri de culoare. Această formulare se referă la faptul că vom stoca practic trei sau patru imagini monocrome, câte una pentru fiecare culoare primară (este un proces analog celui de separare a culorilor în industria tipografică). În schema RGB, toate datele pentru culoarea rosie, privind fiecare pixel al imaginii, sunt grupate împreună; apoi toate datele privind culoarea verde si respectiv culoarea albastră. Alternativ vorbind, datele imaginii pot fi organizate într-un singur plan ceea ce înseamnă practic că valorile rosu, verde si albastru pentru fiecare pixel sunt gupate la un loc.

Numărul de culori suportate de un periferic este cuantificat prin numărul de biti utilizati în acest sens. De exemplu, o rezolutie exprimată pe 24 de biti se referă la un periferic cu o rezolutie de 8 biti pentru fiecare culoare primară si un total de trei culori primare. În acest mod vom avea la dispozitie un număr de 2 la puterea 24 adică 16 milioane de culori. Singurul dezavantaj major în cazul folosirii unei astfel de rezolutii este mărimea relativ mare a fisierului asociat imaginii. Făcând un calcul simplu vom vedea că o imagine bitmap de dimensiuni 1024 x 1024 x 24-biti ocupă în jur de 3 Mocteti, în formă necomprimată.

Unele adaptoare grafice pentru monitoare rezolvă problema mărimii fisierului prin adoptarea unei palete de culori din multimea de 16 milioane posibilă. Această informatie de aproximare trebuie înscrisă în fisierul de format grafic. O situatie des întâlnită este concretizată prin folosirea unei palete care foloseste 16 biti (2 octeti) pentru o culoare si permite afisarea a 65.536 culori. Astfel, imaginea de dimensiuni 1024 x 1024 x 16-biti va avea nevoie de numai 2 megaocteti. Modul în care sunt înregistrate datele privitoare la culoarea pixelilor este concretizat prin folosirea unui cod care indică spre unul din tripletele RGB stocate într-o tabelă de paletă. Fisierul va trebui să includă nu doar informatiile despre culorile pixelilor ci si tabela care cuprinde culorile paletei adoptate.

Ca si în cazul imaginilor monocrome, apare problema acuratetei culorilor în cazul preluării informatiei de pe suportul fizic si transpunerea ei într-o formă electronică (sau invers). Referindu-ne la metodele prezentate în cazul scalei de nuante de gri, o modalitate de rezolvare ar fi organizarea datelor sub forma planelor de culoare si tratarea fiecărui plan ca o imagine monocromă. Această metodă compensează erorile ce pot apare în cadrul fiecărei culori primare.

Erorile care apar la mentinerea relatiei dintre planele de culoare se evidentiază prin deplasarea întregii imagini spre una din culorile primare. Practic spunem că specificăm „punctul de alb" al imaginii, în raport cu un anumit standard. În forma electronică, culoarea albă se obtine atunci când valorile celor trei componente primare sunt egale. În momentul în care aceste valori sunt folosite la redarea informatiei, pe ecran de exemplu, poate să fie sau poate să nu fie ceea ce ne-am închipuit noi că este culoarea albă. În orice caz, scannerul color poate să interpreteze un pixel de culoare albă (la interpretarea informatiei culese de pe hârtie) cu totul altfel decât întelege să-l interpreteze adaptorul grafic al monitorului. Pentru a rezolva aceste neconcordante de interpretare, trebuie precizat punctul de alb în acord cu unul din standardele acceptate.

La ora actuală există un număr de standarde colorimetrice utilizate. Printre institutiile care au creat aceste standarde se pot număra CIE (Committee Internationale de l'Eclairage), NTSC (National Television System Committee), SMPTE (Society of Motion Picture and Television Engineers) si ISO (International Standards Organization). În cadrul fiecărui standard, există un set de numere care pot fi utilizate pentru a defini în mod obiectiv o culoare (valori măsurate în prealabil). Apoi, culoarea pe care un periferic de intrare sau de iesire o înregistrează ca fiind albă, poate fi măsurată de către vânzător si definită ca un set de numere. Aceste numere sunt denumite sau altfel spus reprezintă punctul de alb al aparatului.Deci pentru a stoca informatiile despre o imagine cât mai curat cu putintă, fisierul grafic trebuie să aibă înregistrate valorile ce reprezintă punctul de alb al perifericului de intrare, în acord cu un anumit standard. O imagine creată prin folosirea monitorului va utiliza punctul de alb al monitorului. O imagine scanată va folosi punctul de alb al scanner-ului.

Pentru a ilustra aspectele teoretice prezentate mai înainte am încercat să prezentăm în continuare câteva aspecte despre formatele grafice pe care le-am considerat reprezentative în acest sens. În primul rând am considerat că nu ar fi lipsită de importantă prezentarea formatului BMP dată fiind răspândirea sa la ora actuală, ca urmare a succesului produselor firmei Microsoft. Prezentarea mai apoi a formatului JPEG (si legat de acesta MPEG) am făcut-o ca urmare a folosirii sale în domeniul multimedia si a faptului că este relativ greu de înteles. Nu în ultimul rând, limbajele Postscript si PCL au făcut obiectul preocupării noastre ca urmare a faptului că oferă o posibilitate mult diferită de obisnuit, pentru păstrarea informatiei.

Caseta Metode de compresie


(C) Copyright Computer Press Agora