Fișier de vizualizare grafic

Privind prin hard disk-ul unui PC tipic, aproape sigur veți găsi multe fișiere cu extensiile BMP și PCX. Probabil, aceste fișiere conțin grafică bitmap. Acestea sunt doar doi reprezentanți ai unei familii mari de formate de fișiere grafice utilizate pe computerele personale. Fiecare dintre aceste formate stochează în mod diferit informații grafice și fiecare dintre acestea a fost dezvoltată în scopuri specifice.







Extensia în numele fișierului indică formatul în care sunt stocate informațiile. De exemplu, extensia BMP se referă la un fișier BMP acceptat pe sisteme Windows și OS / 2 (BMP este scurt pentru bitmap, adică bitmap, bitmap). Formatul de fișier BMP este format bitmap nativ pentru Windows, deoarece se potrivește cel mai bine formatului intern Windows în care acest sistem stochează matricele raster.

Formatul PCX a fost primul format standard pentru fișierele grafice pentru stocarea fișierelor grafice raster pe computerele IBM PC. Formatul PCX a fost creat inițial pentru a stoca fișiere grafice alb-negru create de versiunea timpurie a programului de colorat PC Paintbrush. În acest format, la începutul anilor '80. Microsoft a achiziționat o licență și apoi a fost distribuită cu produse Microsoft. Mai târziu, formatul a fost transformat în WindowsPaintbrush și a început să se răspândească cu Windows. Deși domeniul de aplicare al acestui format de popular este redus, PCX fișiere în format care sunt ușor de a învăța să se extindă PCX, sunt încă utilizate pe scară largă în prezent.

În fișierele raster, este de obicei folosit una dintre cele două metode de stocare a datelor despre pixeli. În imaginile full-color, un pixel poate lua oricare din cele 16 milioane de valori, astfel încât culoarea pixelului este de obicei stocată ca o valoare de 24 de biți de 8 biți pe componente roșii, verzi și albastre. Dacă imaginea conține 1 milion de pixeli, atunci dimensiunea fișierului va fi de 3 milioane de octeți plus lungimea datelor non-grafice. Dacă imaginea este limitată la 256 sau mai puține culori, informațiile de culoare sunt de obicei codate folosind o paletă. În loc să stocheze valoarea de culoare a pixelului, informațiile pixelilor indică linia din paletă și, la rândul său, conține culoarea. Odată cu scăderea numărului de biți necesari pentru a reprezenta culoarea pixelului, dimensiunea fișierului este redusă (ceea ce reprezintă o achiziție valoroasă în orice moment, deoarece spațiul de memorie nu este gratuit).

Ca exemplu, luați o imagine de un milion de pixeli, care conține 256 de culori diferite. Codarea culorii fiecărui pixel cu o valoare pe 24 de biți duce la o redundanță risipitoare, deoarece unele (și eventual toate) 256 culori sunt repetate de mai multe ori. Pentru a stoca culorile folosite, cel mai bine este să alocați 768 octeți pentru paleta de culori din fișier: 256 de câmpuri de 24 de biți, fiecare câmp conținând una dintre culorile întâlnite în imagine. Apoi, sub valoarea de culoare a pixelului, pot fi alocate 8 biți, adică un întreg în intervalul de la 0 la 255, indicând numărul de culoare din paletă. acum pentru partea grafică a fișierului sunt suficiente 1.000.768 octeți, față de cei 3.000.000 de octeți anteriori, care sunt necesari pentru a stoca această imagine fără a utiliza paleta. Și chiar și cu octeți suplimentari din partea non-grafică a fișierului, avem încă o reducere a dimensiunii fișierului de aproape două treimi.

În cele mai multe formate de fișiere grafice pixeli sunt aranjate linie cu linie. În cazul în care dimensiunea imaginii este de 1000 cu 1000 de pixeli, iar fiecare pixel este reprezentat de 8 biți, primele 1000 de octeți din partea grafică a fișierului care conține pixelii imaginii de culoare de pe rândul de sus (de la stânga la dreapta), în următorii 1000 octeți conțin pixelii de culoare de-al doilea rând și așa mai departe. Cu toate acestea, unele formate utilizează o ordine de șir diferită. De exemplu, BMP-fișiere începe cu rândul de jos și linia de capăt superioară a imaginii. Fiecare date grafice de format și non-grafic este structurat pe.

Fișierele PCX sunt împărțite în următoarele trei părți: antetul PCX, datele matricei raster și tabelul de culori opțional. Antetul PCB cu 128 de octeți conține mai multe câmpuri, inclusiv câmpurile de dimensiune a imaginii și numerele de biți pentru a codifica informațiile de culoare ale fiecărui pixel. Informația despre matricea raster este comprimată folosind o metodă de compresie simplă RLE; Tabelul de culori opțional de la sfârșitul fișierului conține 256 valori ale culorii RGB care definesc culorile imaginii. Formatul PCX a fost inițial dezvoltat pentru adaptoarele de afișare CGA și EGA și a fost ulterior modificat pentru a fi utilizat în adaptoare VGA și adaptoare de culoare adevărate. Codarea culorii fiecărui pixel în imaginile moderne PCX se poate face cu o adâncime de 1, 4, 8 sau 24 de biți.

Antetul fișierului PCX (128 octeți)

  1. Semnarea fișierului PCX (1 octet) - Steagul permanent 10 - ZSoft .PCX
  2. Versiunea. (1 octet) - (0 - Versiunea 2.5, 2 - Versiunea 2.8 cu informații despre paletă, 3 - Versiunea 2.8 fără informații despre paletă, 5 - Versiunea 3.0).
  3. Codificare. (1 octet) - (1 - codificare în serii lungi).
  4. Bit / pixel (1 octet) - Numărul de biți pe pixel din strat.
  5. Xmin (2 octeți) - coordonatele unghiulare ale imaginii.
  6. Ymin (2 octeți) - coordonatele unghiulare ale imaginii.
  7. Xmax (2 octeți) - coordonatele unghiulare ale imaginii.
  8. Ymax (2 octeți) - coordonatele unghiulare ale imaginii.
  9. Rezoluția orizontală a dispozitivului originar (2 octeți).
  10. Rezoluția verticală a dispozitivului originar (2 octeți).
  11. Set de palete de culori (48 octeți).
  12. Nu este folosit (1 octet). Rezervat.
  13. Numărul de straturi de culoare (1 octet).
  14. Numărul de octeți per linie în stratul de culoare (2 octeți).
  15. Informații despre paletă (2 octeți) - (1 = culoare / alb-negru, 2 = gri).
  16. Nefolosit (58 octeți). Completat cu zerouri până la capătul antetului.

Setați paleta de culori.

Informațiile paletei sunt stocate în unul din cele patru formate. Pentru modurile CGA, se folosesc numai primii și patru octeți ai paletei de titlu. Primul octet indică culoarea de fundal - divizându-l cu 16, obținem valoarea de la 0 la 15. Al patrulea octet indică culoarea prim planului. Numărul de palete CGA este de 8, deci divizați cu 32 pentru a obține o valoare între 0 și 7.

Pentru modurile EGA, datele sunt stocate în 16 "triple". Un triplu este un set de 3 octeți de culori roșu, verde și albastru. Deoarece fiecare valoare poate fi în intervalul de la 0 la 255, trebuie să afișați aceste valori într-unul din cele patru niveluri posibile pentru fiecare culoare. Prin urmare, 256 împărțit la 4 va fi de 64, deci de la 0 la 63 = nivelul 0, de la 64 la 127 = nivelul 1 și așa mai departe. Sistemul BIOS al adaptorului EGA așteaptă un octet format din 00RGBrgb pentru fiecare registru al paletei. Cele patru valori posibile pentru Bb sunt 00, 01, 10 și 11. După ce ați definit nivelul pentru fiecare culoare, combinați-le într-un octet compatibil cu sistemul BIOS (Basic I / O).







Pentru modurile VGA cu 16 culori, paleta este din nou stocată în "triple". Pentru a converti la un format BIOS compatibil, mutați fiecare octet spre dreapta cu doi biți. Această conversie este efectuată automat de către funcția pcxGetFilePalette sau funcția pcxDecodePalette.

Pentru a accesa paleta de 256 de culori, ar trebui: Citiți câmpul Versiune în antet. Dacă este de 5, paleta ar trebui să fie. Sau citiți în câmpul de antet numărul de biți per pixel. Dacă este 8, ar trebui să fie paleta de 256 de culori. Citiți sfârșitul fișierului și numărați înapoi 769 de octeți. Valoarea pe care ați găsit-o ar trebui să fie 12, ceea ce indică prezența unei palete de 256 de culori.

Restul fișierului imagine constă din date grafice codificate. La codificare se folosește algoritmul simplu bazat pe o metodă de serie lungă. Dacă sunt stocate mai multe straturi de culoare într-un fișier, fiecare linie a imaginii este stocată în straturi de culoare (în general, roșu-R, verde-G, albastru-B și strat-I)

Metoda de codare este după cum urmează:

Dacă cei doi biți cei mai semnificativi ai lui X sunt 1, atunci

<повторитель> = 6 biți cei mai puțin semnificativi ai lui X

<данные> = următorul octet pentru X

Deoarece saturația acestui algoritm necesită, în medie, 25% din datele care nu se repetă și cel puțin prezența unui decalaj între datele repetate, mărimea fișierului rezultat este de obicei acceptabilă.

Formatul fișierelor grafice - BMP este utilizat pe scară largă în sistemele Windows și OS / 2. În special, vom examina un fișier BMP care descrie o imagine de 256 de culori cu o dimensiune de 1000 până la 1000 de pixeli. (Formatul de fișier BMP diferă ușor în funcție de numărul de culori pe care imaginea conține-2, 16, 256 sau 16,7 milioane. Formatele BMP în Windows și OS / 2 sunt, de asemenea, ușor diferite.) Descrierea acestui fișier va corespunde opțiunii BMP pentru Windows. În fișierele BMP, informațiile despre culoarea fiecărui pixel sunt codificate 1, 4, 8, 16 sau 24 de biți (bit / pixel). Numărul de biți / pixeli, numit și adâncimea reprezentării culorilor, determină numărul maxim de culori din imagine. Imaginea la o adâncime de 1 bit / pixel poate avea doar două culori și la o adâncime de 24 de biți / pixel - peste 16 milioane de culori diferite.

Fișierul este alcătuit din patru părți principale: un antet de fișiere de 14 octeți, un antet de 40 de octeți, o tabelă de culoare de 1024 de octeți și un milion de octeți pentru valorile pixelilor. (Tabelul de culori este de 1024 octeți, nu 768, deoarece un alt octet neutilizat este adăugat la fiecare câmp de 24 de biți din tabel.)

Structura unui fișier grafic format BMP.

1. Titlul fișierului grafic raster (14 octeți)

1.1. Semnarea fișierului BMP (2 octeți)

1.2. Dimensiunea fișierului (4 octeți)

1.3. Nefolosit (2 octeți)

1.4. Nefolosit (2 octeți)

1.5. Localizarea datelor matricei raster (4 octeți)

2. Antetul de informații al matricei raster (40 octeți)

2.1. Lungimea acestui antet (4 octeți)

2.2. Lățimea imaginii (4 octeți)

2.3. Înălțime imagine (4 octeți)

2.4. Numărul de planuri de culoare (2 octeți)

2.5. Bit / pixel (2 octeți)

2.6. Metoda de comprimare (4 octeți)

2.7. Lungimea matricei raster (4 octeți)

2.8. Rezoluție orizontală (4 octeți)

2.9. Rezoluție verticală (4 octeți)

2.10. Numărul de culori ale imaginii (4 octeți)

2.11. Numărul de culori primare (4 octeți)

3. Masă de culoare (lungimea variază de la 8 la 1024 octeți)

4. Datele reale ale matricei raster (variabila lungime)

1. Primii 14 octeți ai fișierului BMP constituie antetul său. Antetul fișierului conține trei valori: literele BM, care indică faptul că fișierul grafic are un format BMP, un număr care indică dimensiunea fișierului și un număr care indică locul unde sunt situate datele raster. Ultimul număr este egal cu numărul de octeți de la începutul fișierului. Alte două câmpuri din antetul fișierului sunt rezervate pentru nevoile viitoare și conțin, de obicei, zerouri.

2. Datele negrafice necesare sunt ascunse în antetul informațiilor. Câmpurile din antetul de informații includ, printre altele, mărimea acesteia (40 de octeți în fișierele BMP pentru Windows), înălțimea și lățimea imaginii în pixeli și numărul de biți per pixel. În funcție de metoda de codare a câmpului bit-per-pixel, acesta poate lua valorile:

Imaginea monocromă pe 1 biți și tabela de culori trebuie să conțină două elemente. Fiecare bit din matricea de date codifică un pixel. Dacă valoarea biților este 0, atunci pixelul devine prima culoare a tabelului; Dacă - 1, pixelul devine a doua culoare a tabelului.

Imaginea pe 4 biți are maximum 16 culori, iar tabelul de culoare are până la 16 elemente. Culoarea fiecărui pixel este determinată de tabelul de culori utilizând un index pe patru biți. De exemplu, dacă primul octet al datelor este de 3Ah, atunci când bitmap este afișat, culoarea primului pixel este determinată de al patrulea element al tabelului de culori, iar culoarea celui de-al doilea este al unsprezecelea.

Imaginea pe 8 biți are maximum 256 de culori, iar tabela de culori are până la 256 de elemente. Fiecare octet al matricei de date determină culoarea unui pixel.

Imaginea pe 24 de biți are un maxim de 2 în a 24-a putere a culorilor. Tabela de culori este goală, iar culoarea pixelilor este determinată de pachete de trei octeți care descriu intensitățile culorilor roșu, verde și albastru.

3. Tabela de culori conține 256 câmpuri de 4 octeți. Primul octet din fiecare câmp este responsabil pentru componenta albastră a culorii, a doua pentru verde și a treia pentru cea roșie. Cel de-al patrulea octet nu este utilizat și este de obicei setat la 0. Dacă primele trei valori din tabelul de culoare sunt 0, 192 și 192, înseamnă că numărul zero corespunde culorii galbene a intensității medii (amestec de verde și roșu). Tabelul de culori definește toate culorile folosite în imagine.

4. Restul fișierului conține valorile pixelilor. Secvența de octeți corespunde ordinii pixelilor din imagine: de la stânga la dreapta, pornind de la linia de jos a imaginii. Valoarea fiecărui octet este numărul culorii din tabelul de culori. Formatul datelor efective de matrice raster în fișierul BMP depinde de numărul de biți utilizați pentru a codifica datele de culoare ale fiecărui pixel. Cu o imagine de 256 de culori, fiecare pixel din acea parte a fișierului care conține datele efective ale matricei raster este descris de un octet (8 biți). Această descriere a pixelilor nu reprezintă valori ale culorilor RGB, dar servește ca un indicator pentru a intra în tabela de culori a fișierelor. Astfel, dacă R / G / B = 255/0/0 este stocată ca prima valoare de culoare RGB în tabela de culori a fișierului BMP, atunci valoarea pixelului 0 din matricea raster va fi pusă într-o culoare roșie aprinsă. Valorile pixelilor sunt stocate în ordinea localizării lor de la stânga la dreapta, începând (de obicei) de la linia de jos a imaginii. Astfel, în fișierul BMP de 256 de culori, primul octet al datelor matricei raster este indicele pentru culoarea pixelului din colțul din stânga jos al imaginii; cel de-al doilea octet reprezintă indicele pentru culoarea pixelului drept din vecinătate etc. Dacă numărul de octeți din fiecare linie este ciudat, se adaugă câte un octet suplimentar la fiecare linie pentru alinierea datelor matricei raster la limitele de 16 biți.

Nu toate fișierele BMP au o structură similară cu cea prezentată în diagramă. De exemplu, fișierele BMP cu o adâncime de 16 și 24 de biți / pixel nu au tabele de culori; în aceste fișiere, valorile pixelilor matricei raster caracterizează în mod direct valorile de culoare RGB. De asemenea, formatele interne de fișiere pentru stocarea secțiunilor individuale ale unui fișier pot varia. De exemplu, informațiile despre matricea raster în unele fișiere BMP de 16 și 256 de culori pot fi comprimate printr-un algoritm RLE care înlocuiește secvențele pixelilor de imagine identice cu tokenuri care definesc numărul de pixeli din secvență și culoarea lor. În Windows, puteți lucra cu fișierele BMP din stilul OS / 2, care utilizează diferite formate ale antetului de informații al matricei raster și tabelului de culori.

După pornirea programului PCX_BMP.EXE <имя графического файла> Funcția standard Fnsplit împarte numele complet al fișierului în 4 părți. Acest lucru face posibilă transferarea fișierelor cu extensii PCX și BMP la funcțiile de procesare a afișării fișierelor grafice pe ecran (show_pcx și show_bmp).

Afișarea imaginii stocate în fișierul PCX începe cu citirea antetului fișierului. Cu ajutorul acestui lucru se determină dacă acest fișier este format PCX (producătorul trebuie să fie egal cu 10), dimensiunile imaginii, informații despre paletă, numărul straturilor de culoare. După aceasta, există o tranziție la 768 octeți de la sfârșitul fișierului pentru a citi setul paletei de culori și cu ajutorul funcției Set_palette care umple paleta de culori cu valori.

Afișarea unei imagini stocate într-un fișier BMP începe cu citirea antetului fișierului și a antetului de informații. Programul verifică astfel dacă acest fișier este formatat grafic ca BMP (semnătura trebuie să fie "BM") și recunoaște, de asemenea, dimensiunile imaginii și numărul de culori.

Apoi, programul citește tabelul de culori. Apoi, programul folosește funcția Set_palette pentru a umple paleta de culori cu valori din tabelul de culori. În acest fel, culorile imaginii sunt transmise corect. Dacă computerul este capabil să afișeze simultan mii sau milioane de culori, nu este nevoie să umpleți paleta de culori.

char far * video = (char departe *) 0xA0000000L







Articole similare

Trimiteți-le prietenilor: