Ce este bmp în informatică. Format de date BMP (bitmap).
Anunţ
Format de fișier imagine BMP Raster
BMP (fișier bitmap, format de fișier bitmap independent de dispozitiv) sunt fișiere bitmap utilizate pentru a stoca imagini digitale bitmap separat de dispozitivul de afișare. Acest tip de fișier a fost folosit anterior în Microsoft Windows și OS/2. Termenul „raster” provine din ideea programatorilor de bitmap. Imaginile BMP sunt de obicei necomprimate sau comprimate fără pierderi (de exemplu, folosind ZIP sau RAR - datorită prezenței datelor redundante în fișier). Astăzi, JPG este formatul de imagine preferat - în principal datorită dimensiunii mari a fișierului BMP, care poate cauza probleme sau întârzieri la descărcarea, trimiterea sau încărcarea fișierelor.
Informații tehnice despre fișierele BMP
Fișierele BMP sunt stocate ca imagini 2D de diferite dimensiuni, culori și adâncimi de culoare fără compresie de date, profiluri de culoare sau canale alfa. Imaginile BMP sunt salvate în formate de bitmap independent de dispozitiv (DIB), ceea ce înseamnă că imaginea are culori mai degrabă decât specificațiile sistemului. Aceasta explică de ce unele imagini BMP arată diferit pe computere diferite. Imaginile BMP pot fi vizualizate pe orice dispozitiv, inclusiv pe ecrane de computer și televizor. Lipsa brevetelor a făcut din acest tip de imagine un format popular pentru o gamă largă de dispozitive.
Informații suplimentare despre formatul BMP
Extensie de fișier | .bmp | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Categoria de fișiere | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Exemplu de fișier | (2,7 MiB) (487,85 KiB) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Programe înrudite | Adobe Photoshop MS Paint Microsoft Photo Editor Pensulă |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DIB și DDB
Când utilizați formatul DIB Bitmap independent de dispozitiv, raster independent de dispozitiv), programatorul poate accesa toate elementele structurilor care descriu imaginea folosind un pointer obișnuit. Dar aceste date nu sunt folosite pentru a controla direct ecranul, deoarece sunt întotdeauna stocate în memoria sistemului și nu în memoria video dedicată. Formatul pixelilor din RAM poate diferi de formatul care trebuie stocat în memoria video pentru a afișa un punct de aceeași culoare. De exemplu, formatul DIB poate folosi 24 de biți pentru a specifica un pixel, iar în acest moment adaptorul grafic poate funcționa în modul HiColor cu o adâncime de culoare de 16 biți. În acest caz, punctul roșu strălucitor va fi specificat într-un format independent de hardware cu trei octeți 0x0000ff, iar în memoria video prin cuvântul 0xF800. Când copiați o imagine pe ecran, sistemul va petrece timp suplimentar transformând codurile de culoare din formatul de 24 de biți în formatul de tampon video.
Prezentare generală a structurii fișierelor
Fișierul BMP este format din patru părți:
- Antetul fișierului (BITMAPFILEHEADER)
- Denumirea imaginii (BITMAPINFOHEADER, poate lipsi). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
- Paleta (poate lipsi)
- Imaginea în sine
BITMAFILEHEADER
Această structură conține informații despre tipul, dimensiunea și reprezentarea datelor din fișier. Dimensiune 14 octeți.
Typedef struct tagBITMAPFILEHEADER ( WORD bfType; // offset 0 octeți de la începutul fișierului DWORD bfSize; // offset 2 octeți de la începutul fișierului, lungime 4 octeți WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; // offset 10 octeți de la începutul fișierului, lungimea de 4 octeți) BITMAPFILEHEADER, * PBITMAPFILEHEADER;
Tipul WORD trebuie să fie de 16 biți, tipurile DWORD și LONG trebuie să fie de 32 de biți, tipul LONG trebuie să fie semnat și ordinea octeților se presupune a fi little endian.
- bfType - tip de fișier, caractere „BM” (în HEX: 0x42 0x4d).
- bfSize - dimensiunea întregului fișier în octeți.
- bfReserved1 și bfReserved2 sunt rezervate și trebuie să conțină zerouri.
- bfOffBits - conține offset-ul în octeți de la începutul structurii BITMAPFILEHEADER până la biții de imagine înșiși.
După antetul fișierului
BITMAPINFHEADDER
Cea mai simplă opțiune de antet. Aplicațiile pentru Windows NT3.51 și versiuni anterioare pot utiliza numai această structură. Dimensiune 40 octeți.
Typedef struct tagBITMAPINFOHEADER( DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrBiClrUsed; ITMDWAPINF; EADER;
BiSize Mărimea acestei structuri în octeți. Formatul BMP a fost extins de-a lungul timpului, iar valoarea acestui câmp determină versiunea formatului. biWidth Lățimea imaginii în pixeli. Pentru Win98/Me și Win2000/XP: Dacă câmpul biCompression conține BI_JPEG sau BI_PNG, aceasta este lățimea imaginii decomprimate. biHeight Înălțimea imaginii în pixeli. Dacă conține o valoare pozitivă, imaginea este scrisă în ordinea de jos în sus (zero pixel în colțul din stânga jos). Dacă valoarea este negativă, imaginea este scrisă de sus în jos (zero pixel în colțul din stânga sus al imaginii). Câmpul biCompression trebuie să conţină valoarea BI_RGB sau BI_BITFIELDS. O astfel de imagine nu poate fi comprimată. biPlanes Numărul de planuri de culoare și în format BMP conține unul. biBitCount Numărul de biți pe pixel. Poate lua următoarele valori:
- 0 - are sens pentru Win98/Me/2000/XP. Numărul de biți pe pixel determină formatul JPEG sau PNG.
- 1 - imagine monocromă. Membrul bmiColors al structurii BITMAPINFO conține două elemente. Fiecare bit al unei imagini reprezintă un pixel; dacă bitul este zero, pixelul are culoarea primului element din tabelul bmiColors, în caz contrar - culoarea celui de-al doilea.
- 4 - imagine în șaisprezece culori. Pixelii sunt definiți de indici de 4 biți, fiecare octet al imaginii conține informații despre doi pixeli - cei mai semnificativi 4 biți pentru primul, cei rămași pentru al doilea.
- 8 - paleta conține până la 256 de culori, fiecare octet al imaginii stochează un index în paletă pentru un pixel.
- 16 - dacă câmpul biCompression conține valoarea BI_RGB, fișierul nu conține o paletă. La fiecare doi octeți ai imaginii se stochează intensitatea componentelor roșii, verzi și albastre ale unui pixel. În acest caz, bitul cel mai semnificativ nu este utilizat 5 biți sunt alocați pentru fiecare componentă: 0RRRRRGGGGGGBBBBB.
Dacă câmpul biCompression conține valoarea BI_BITFIELDS, paleta stochează trei valori de patru octeți care definesc o mască pentru fiecare dintre cele trei componente de culoare. Fiecare pixel dintr-o imagine este reprezentat de o valoare de doi octeți din care componentele de culoare sunt extrase folosind măști. Pentru WinNT/2000/XP, secvențele de biți ale fiecărei componente trebuie să urmeze continuu, fără să se suprapună sau să se intersecteze cu secvențele altor componente. Pentru Win95/98/Me - sunt acceptate doar următoarele măști: 5-5-5, unde masca componentei albastre este 0x001F, verde 0x03E0, roșu 0x7C00; și 5-6-5, unde masca componentei albastre este 0x001F, verde 0x07E0, roșu 0xF800. - 24 - paleta nu este folosită, fiecare trei octeți ai imaginii reprezintă un pixel, un octet pentru intensitatea canalelor albastru, verde și respectiv roșu.
- 32 - Dacă câmpul biCompression conține valoarea BI_RGB, imaginea nu conține o paletă. Fiecare patru octeți ai imaginii reprezintă un pixel, un octet pentru intensitatea canalelor albastru, verde și respectiv roșu. Cel mai semnificativ octet al fiecărui quad nu este de obicei utilizat, dar permite stocarea datelor de canal alfa.
Dacă câmpul biCompression conține valoarea BI_BITFIELDS, trei măști de culoare de patru octeți sunt stocate în paletă - pentru componentele roșu, verde și albastru. Fiecare pixel dintr-o imagine este reprezentat de patru octeți. WinNT/2000: măștile componente nu trebuie să se suprapună sau să se intersecteze. Windows 95/98/Me: sistemul acceptă un singur mod de compresie, complet similar cu modul fără compresie BI_RGB - cel mai semnificativ octet din fiecare patru este folosit ca canal alfa, următorii trei sunt rezervați pentru albastru, verde și roșu canale, respectiv: 0xAARRGGBB.
Sens | Identificator | Comprimare |
---|---|---|
0 | BI_RGB | imagine necomprimată |
1 | BI_RLE8 | Compresie RLE pentru imagini pe 8 biți |
2 | BI_RLE4 | Compresie RLE pentru imagini pe 4 biți |
3 | BI_BITFIELDS | imaginea nu este comprimată, paleta conține trei măști de 4 octeți pentru componentele de culoare roșu, verde și albastru. Folosit pentru imagini pe 16 și 32 de biți |
4 | BI_JPEG | Win98/Me/2000/XP: compresie JPEG |
5 | BI_PNG | Win98/Me/2000/XP: compresie PNG |
6 | BI_ALPHABITFIELDS | WinCE: imaginea nu este comprimată, paleta conține patru măști de 4 octeți pentru componentele de culoare roșu, verde, albastru și transparent (canal alfa). Folosit pentru imagini pe 16 și 32 de biți |
Dacă conține o valoare diferită de zero și biBitCount este mai mic de 16, biClrUsed specifică numărul de culori pe care le va accesa driverul de dispozitiv sau aplicația. Dacă biBitCount este mai mare sau egal cu 16, biClrUsed este dimensiunea paletei utilizată pentru a optimiza performanța paletelor de sistem. Dacă biBitCount este 16 sau 32, paleta optimă urmează imediat după trei măști de patru octeți.
Într-o imagine împachetată, matricea de pixeli urmează imediat structura BITMAPINFO, biClrUsed trebuie să conțină zero sau dimensiunea reală a paletei. biClrImportant Numărul de elemente de paletă necesare pentru afișarea imaginii. Dacă conține zero, toți indicii sunt la fel de importanți.
Structura BITMAPINFO combină BITMAPINFOHEADER și paleta, oferind o descriere completă a dimensiunilor și culorilor unei imagini.
Pentru a găsi paleta în structura BITMAPINFO, aplicația trebuie să folosească informațiile stocate în biSize după cum urmează:
PColor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo-> bmiHeader.biSize ) ) ;
Rasterul este de obicei stocat într-o formă oglindă verticală. Dar este, de asemenea, posibil să stocați rasterul într-o formă ne-oglindă vertical. Un semn că rasterul din BMP nu este în formă de oglindă verticală este specificat de parametrul biHeight.
BITMAPV4HEADER
O versiune extinsă a structurii descrise mai sus. Win NT 3.51 și versiunile anterioare trebuie să utilizeze structura BITMAPINFOHEADER. Win98/Me/2000/XP poate folosi structura BITMAPV5HEADER în loc de structura BITMAPV4HEADER.
Typedef struct ( DWORD bV4Size; LONG bV4Width; LONG bV4Height; WORD bV4Planes; WORD bV4BitCount; DWORD bV4V4Compression; DWORD bV4SizeImage; LONG bV4XPelsPerMeter; LONG bV4YPelsPerMeter; LONG bV4YPelsPerMeter;DWORD bV4YPelsPerMeter; DWORD bV4GreenMask; CIEXYZTRIPLE bV4Green DWORD;
Câmpurile de la începutul structurii până la și inclusiv bV4ClrImportant au același scop ca și câmpurile corespunzătoare ale structurii BITMAPINFOHEADER.
- bV4RedMask - masca de culoare a componentei roșii a fiecărui pixel, utilizată numai dacă bV4Compression conține valoarea BI_BITFIELDS.
- bV4GreenMask - masca de culoare a componentei verde a fiecărui pixel, utilizată numai dacă bV4Compression conține valoarea BI_BITFIELDS.
- bV4BlueMask - masca de culoare a componentei albastre a fiecărui pixel, utilizată numai dacă bV4Compression conține valoarea BI_BITFIELDS.
- bV4AlphaMask - masca care definește componenta canalului alfa.
- bV4CSType - definește spațiul de culoare al imaginii.
- bV4Endpoints este o structură CIEXYZTRIPLE care specifică coordonatele x, y și z a trei culori care corespund punctelor finale ale spațiului de culoare definit pentru imagine. Acest câmp este ignorat dacă bV4CSType nu conține o valoare LCS_CALIBRATED_RGB.
- bV4GammaRed - curba de ton a componentei roșii. Ignorat dacă bV4CSType nu conține o valoare LCS_CALIBRATED_RGB. Indicat în format 16×16.
- bV4GammaGreen - curba de ton a componentei verzi. Ignorat dacă bV4CSType nu conține o valoare LCS_CALIBRATED_RGB.
- bV4GammaBlue - curba de ton al componentei albastre. Ignorat dacă bV4CSType nu conține o valoare LCS_CALIBRATED_RGB.
BITMAPV5HEADER
Win95/NT 4.0: Aplicațiile pot folosi BITMAPV4HEADER. Win NT 3.51 și versiunile anterioare trebuie să utilizeze structura BITMAPINFOHEADER.
Typedef struct ( DWORD bV5Size; LONG bV5Width; LONG bV5Height; WORD bV5Planes; WORD bV5BitCount; DWORD bV5Compression; DWORD bV5SizeImage; LONG bV5XPelsPerMeter; LONG bV5YPelsPerMeter; bVORD5VlImport.bVORD5Vl; GreenMask; DWORD bV5AlphaMask; 5 HEADER;
Pentru câmpurile de la începutul structurii până la și inclusiv bV5GammaBlue, vor fi descrise numai diferențele față de versiunile anterioare - BITMAPINFOHEADER și BITMAPV4HEADER.
- bV5CSType - definește spațiul de culoare al imaginii, poate lua următoarele valori:
- bV5Intent - poate lua următoarele valori:
- bV5ProfileData - offset în octeți de la începutul structurii până la începutul datelor de profil (nume fișier de profil, un șir format exclusiv din tabelul de coduri 1252 caractere și care se termină cu un octet zero). Ignorat dacă bV5CSType conține o altă valoare decât PROFILE_LINKED și PROFILE_EMBEDDED.
- bV5ProfileSize - dimensiunea datelor de profil în octeți.
- bV5Rezervat - rezervat. Conține zero.
Paletă
Paleta poate conține o secvență de câmpuri de patru octeți în funcție de numărul de culori disponibile (256 pentru o imagine de 8 biți). Cei trei octeți inferiori ai fiecărui câmp determină intensitatea componentelor roșii, verzi și albastre ale culorii; Fiecare pixel al imaginii este descris în acest caz de un octet care conține numărul câmpului de paletă în care este stocată culoarea acestui pixel.
Dacă un pixel de imagine este descris printr-un număr de 16 biți, paleta poate stoca trei valori de doi octeți, fiecare dintre acestea definind o mască pentru a extrage componentele de culoare roșie, verde și albastră din pixelul de 16 biți.
Este posibil ca un fișier BMP să nu conțină o paletă dacă stochează o imagine color necomprimată.
Date de imagine
O secvență de pixeli înregistrate într-o formă sau alta. Pixelii sunt stocați rând cu rând, de jos în sus. Fiecare linie de imagine este umplută cu zerouri până la o lungime care este un multiplu de patru octeți.
În fișierele bmp cu o adâncime de culoare de 24 de biți, octeții de culoare ai fiecărui pixel sunt stocați în ordinea BGR (Albastru, Verde, Roșu).
În fișierele bmp cu o adâncime de culoare de 32 de biți, octeții de culoare ai fiecărui pixel sunt stocați în ordinea BGRA (albastru, verde, roșu, alfa)
Adâncimea de biți a imaginii
În funcție de numărul de culori reprezentate, fiecare punct este alocat de la 1 la 48 de biți:
- 1 bit - imagine monocromă (două culori).
- 2 biți - 4 culori posibile (moduri de operare CGA) (modul 2 biți nu este standardizat oficial, dar este utilizat).
- 4 biți - imagine în 16 culori (moduri de operare EGA).
- 8 biți (1 octet) - 256 de culori, ultimul dintre moduri care acceptă culori indexate (vezi mai jos).
- 16 biți (2 octeți) - modul HiColor, Pentru 5-6-5 = 65536 nuanțe posibile, pentru 5-5-5 = 32768 nuanțe posibile.
- 24 de biți (3 octeți) - TrueColor. Deoarece 3 octeți nu se mapează bine la puteri de doi (mai ales când se stochează date în memorie, unde contează alinierea datelor la granița unui cuvânt), este adesea folosită o imagine de 32 de biți. În modul TrueColor, fiecăruia dintre cele trei canale (în modul RGB) i se alocă 1 octet (256 de valori posibile), numărul total de culori este .
- 32 de biți (4 octeți) - acest mod este aproape similar cu TrueColor, al patrulea octet nu este de obicei utilizat sau conține canalul alfa (transparență).
- 48 de biți (6 octeți) - un format rar folosit, cu acuratețe sporită a culorii (16 biți pe canal), susținut de un număr relativ mic de programe și echipamente.
Culori indexate
Când numărul de biți este de 1 (2 culori), 2 (4 culori), 4 (16 culori) sau 8 (256 de culori) per pixel, poate fi utilizat un mod special de culoare indexat. În acest caz, numărul corespunzător fiecărui pixel nu indică culoarea, ci numărul culorii din paletă. Prin utilizarea unei palete, este posibilă adaptarea imaginii la culorile prezente în imagine. În acest caz, imaginea este limitată nu de culorile specificate, ci de numărul maxim de culori utilizate simultan.
Exemplu de program
Următorul program deschide un fișier BMP de 24 de biți într-un XWindow, adâncimea de culoare ar trebui să fie de 32 de biți, nu funcționează la redări mai mici de culoare, deoarece complică exemplul:
/* Compilat cu linia: cc -o xtest xtest.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lm */#include
S-a considerat un mic program care a mutat sprite-ul în jurul ecranului, dar, din păcate, nu a arătat așa cum ne-am dori. În acest articol vom încerca să „îngrijim” sprite-ul.
Am obținut imaginea sprite dintr-un fișier Bmp din aceleași fișiere putem lua imaginea de fundal, cursorul mouse-ului și elementele de interfață. Totuși, ceea ce vedem pe ecran nu este tocmai ceea ce ne așteptam: imaginea s-a dovedit a fi cu susul în jos și, în plus, cu culori diferite decât cele cerute. Deci, să învățăm cum să citim corect fișierele Bmp și să întoarcem imaginea „din cap până în picioare”.
Prin decizia dezvoltatorilor, formatul de fișier Bmp nu este legat de o anumită platformă hardware. Acest fișier este format din patru părți: un antet, un antet de informații, un tabel de culori (paletă) și date de imagine. Dacă fișierul stochează o imagine cu o adâncime de culoare de 24 de biți (16 milioane de culori), atunci tabelul de culori poate lipsi, dar în cazul nostru de 256 de culori este acolo. Structura fiecărei părți a unui fișier care stochează o imagine de 256 de culori este dată în , iar tipurile de înregistrare corespunzătoare sunt date în .
Antetul fișierului începe cu semnături„BM” urmat de lungimea fișierului, exprimată în octeți. Următorii 4 octeți sunt rezervați pentru extensii de format ulterioare, iar acest antet se termină deplasare de la începutul fișierului până la datele de imagine înregistrate în acesta. Cu 256 de culori, acest offset este 1078 - exact asta a trebuit să sărim în programul nostru anterior pentru a ajunge la date.
Antetul de informații începe cu propria lungime (aceasta poate varia, dar pentru un fișier de 256 de culori este de 40 de octeți) și conține dimensiunile imaginii, rezoluția, caracteristicile de prezentare a culorilor și alți parametri.
Lățimea și înălțimea imaginii sunt specificate în puncte raster și probabil nu necesită explicații.
Numărul de avioane ar putea fi folosit în fișiere cu adâncime redusă de culoare. Când numărul de culori este de 256 sau mai mult, acesta este întotdeauna egal cu 1, astfel încât acest câmp poate fi considerat acum învechit, dar pentru compatibilitate este păstrat.
Adâncimea culorii este considerată cea mai importantă caracteristică a modului în care culoarea este reprezentată într-un fișier și este măsurată în biți pe punct. În acest caz, este egal cu 8.
Comprimare. Nu este folosit de obicei în fișierele Bmp, dar este prevăzut un câmp în antet. De obicei, este 0, ceea ce înseamnă că imaginea nu este comprimată. Pe viitor vom folosi doar astfel de fișiere.
Marimea imaginii- numărul de octeți de memorie necesar pentru stocarea acestei imagini, fără a număra datele paletei.
Rezoluții orizontale și verticale măsurată în puncte raster pe metru. Ele sunt deosebit de importante pentru menținerea dimensiunii imaginilor scanate. Imaginile create folosind editori grafici au de obicei zerouri în aceste câmpuri.
Numărul de culori vă permite să reduceți dimensiunea tabelului de palete dacă imaginea conține de fapt mai puține culori decât permite adâncimea de culoare selectată. Cu toate acestea, în practică, astfel de fișiere nu sunt aproape niciodată găsite. Dacă numărul de culori este maximul permis de adâncimea culorii, de exemplu 256 de culori la 8 biți, câmpul este setat la zero.
Numărul de culori primare- vine de la începutul paletei și este indicat să o afișați fără distorsiuni. Acest câmp este important atunci când numărul maxim de culori de afișare a fost mai mic decât în paleta de fișiere Bmp. La dezvoltarea formatului, s-a presupus, în mod evident, că culorile cele mai frecvente vor fi situate la începutul tabelului. Acum această cerință practic nu este respectată, adică culorile nu sunt ordonate în funcție de frecvența cu care apar în fișier. Acest lucru este foarte important, deoarece paletele a două fișiere diferite, chiar compuse din aceleași culori, le-ar conține (culorile) într-o ordine diferită, ceea ce ar putea complica semnificativ afișarea simultană a unor astfel de imagini pe ecran.
Antetul de informații este urmat de un tabel de culori, care este o matrice de 256 (în număr de culori) câmpuri de 4 octeți. Fiecare câmp corespunde unei culori din paletă, iar trei din cei patru octeți corespund componentelor albastru, verde și roșu ale acelei culori. Ultimul, cel mai semnificativ octet al fiecărui câmp este rezervat și egal cu 0.
După tabelul de culori există date de imagine, care sunt scrise de-a lungul liniilor raster de jos în sus și în interiorul liniei - de la stânga la dreapta. Deoarece pe unele platforme este imposibil să citiți o unitate de date care este mai mică de 4 octeți, lungimea fiecărei linii este aliniată la o limită de 4 octeți, adică dacă lungimea liniei nu este multiplu de patru, este aliniată cu zerouri. Această circumstanță trebuie luată în considerare la citirea fișierului, deși poate fi mai bine să vă asigurați în prealabil că dimensiunile orizontale ale tuturor imaginilor sunt multiplu de 4.
După cum am spus deja, formatul de fișier a fost conceput pentru a fi universal pentru diverse platforme, așa că nu este surprinzător faptul că culorile paletei sunt stocate în el altfel decât este obișnuit pentru VGA. În timpul procedurii de citire se efectuează recodificarea necesară. (Vom vorbi despre ce este paleta VGA și cum să lucrați cu ea în articolele următoare.)
Modulul pentru citirea fișierelor Bmp de 256 de culori are doar două proceduri. După cum se poate vedea din listă, dimensiunile imaginii trebuie trecute la procedura de citire a fișierului ReadBMP. Acest lucru este convenabil dacă imaginea nu trebuie citită complet. Când dimensiunile sunt cunoscute dinainte, acest lucru nu pune probleme, dar ar fi bine dacă, folosind modulul nostru, s-ar putea citi orice imagini, inclusiv cele a căror dimensiune nu este cunoscută dinainte. În acest scop, este furnizată procedura ReadBMPheader, care citește doar antetul fișierului. Apelând-o, puteți verifica dacă imaginea este înregistrată în formatul selectat de 256 de culori, puteți afla dimensiunile acesteia și abia apoi alocați memorie pentru aceasta și plasați-o în bufferul alocat.
Acum să conectăm un nou modul la programul nostru. Pentru a face acest lucru, îi vom scrie numele în directiva uses și, de asemenea, vom oferi o matrice pentru stocarea datelor despre paletă, care poate fi descrisă astfel:
P: matrice de octeți;
Procedura CreateSprite, care invocă operația de citire a unui fișier dintr-un modul nou, a fost simplificată (vezi).
Structura fișierului Bmp
|
Listarea 1
unitate bmpread; (proceduri pentru lucrul cu Bmp) tip de interfață artype = arrayof byte; arptr = ^artype; bmFileHeader = înregistrare (antet fișier) Typf: cuvânt; (semnătură ) Mărime: longint; (lungimea fișierului în octeți) Res1: cuvânt; (rezervat) Res2: cuvânt; (rezervat) OfBm: longint; (offset imagine în octeți (1078)) final; bmInfoHeader = înregistrare (antet informații) Dimensiune: longint; (lungimea antetului în octeți (40)) Widt: longint; (lățimea imaginii (în pixeli)) Înălțime: lung; (înălțimea imaginii (în pixeli)) Plan: cuvânt; (număr de avioane (1)) BitC: cuvânt; (adâncimea culorii (biți pe punct) (8)) Comp: longint; (tip de compresie (0 - nu)) SizI: longint; (dimensiunea imaginii în octeți) XppM: longint; (rezoluție orizontală) ((puncte pe metru - de obicei 0)) YppM: longint; (rezoluție verticală) ((puncte pe metru - de obicei 0)) NCoL: longint; (număr de culori) ((dacă maximul permis este 0)) NCoI: longint; (număr de culori primare) end; bmHeader = înregistrare (antetul complet al fișierului) f: bmFileHeader; (antetul fișierului) i: bmInfoHeader; (antetul informației) p: arrayof byte; (tabel de palete) final; bmhptr = ^bmHeader; (citirea unei imagini dintr-un fișier Bmp) procedura ReadBMP(image:arptr; (matrice cu imagine) xim,yim:word; (dimensiuni) pal:arptr; (palette) filename:string); (nume fișier) (citește antetul fișierului Bmp) procedură ReadBMPheader(header:bmhptr;filename:string); implementare ($R-) (citirea unei imagini dintr-un fișier Bmp) procedura ReadBMP(image:arptr; xim,yim:word; pal:arptr; filename:string); var h: bmHeader; i:întreg; bmpfile: fișier; s: longint; start assign(bmpfile,filename); resetare(bmpfile,1); blockread(bmpfile,h,sizeof(h)); (citire antet) pentru i:= 0 la yim-1 do begin (citire linie cu linie) blockread(bmpfile,image^[(yim-i-1)*xim],xim); dacă (xim mod 4)<>0 apoi blockread(bmpfile,s,4 - (xim mod 4)); Sfârşit; close(bmpfile); pentru i ^= 0 to 255 do begin (transformarea paletei) pal^ := h.p shr 2; (albastru) pal^ := h.p shr 2; (verde) pal^ := h.p shr 2; (roșu) capăt; Sfârşit; (citirea antetului unui fișier Bmp) procedura ReadBMPheader(header:bmhptr;filename:string); var bmpfile:file; start assign(bmpfile,filename); resetare(bmpfile,1); blockread(bmpfile,header^,sizeof(header^)); close(bmpfile); Sfârşit; Sfârşit.Lista 2
( sprite) procedura CreateSprite(s:string; x,y,dx,dy:integer); var f: dosar; (fișier cu imaginea sprite) begin getmem(Sprt.Img,sizeof(SpriteArrayType)); (alocați memorie pentru sprite) getmem(Sprt.Back,sizeof(SpriteArrayType)); (alocați memorie pentru buffer) Readbmp(@(Sprt.Img^),Xsize,Ysize,@p,s); Sprt.x:= x; Sprt.y:=y; (setează valorile inițiale) Sprt.dx:= dx; (coordonate și incremente) Sprt.dy:= dy; Sfârşit;În lecția de astăzi ne vom uita la primul format de fișier de pe calea noastră. Diferite formate de fișiere sunt concepute pentru a stoca informații diferite. Fiecare format specifică o modalitate de organizare a datelor într-un fișier.
Vom cunoaște multe formate de fișiere diferite: imagini, modele tridimensionale, fișiere audio, fișiere video. Să începem cu unul dintre cele mai simple formate grafice - BMP.
BMP - bitmap - bitmap. Conceptul de „mapping” este preluat din matematică. În matematică, o mapare este foarte apropiată de conceptul de funcție. Pentru simplitate, considerați cuvântul bitmap ca fiind o imagine (chiar dacă nu este).
Informații despre fișierul BMP
Fiecare fișier bitmap are un antet de 14 octeți. Câmpuri pentru acest antet:
2 octeți. șir BM (pe Windows).
4 octeți. Dimensiunea fișierului în octeți.
2 octeți. Câmp rezervat. Trebuie inițializat la zero.
4 octeți. Adresa de la care începe imaginea în sine. Sau cu alte cuvinte - o compensare față de începutul imaginii.
Să creăm o imagine de 100x100 pixeli. Fiecare pixel ocupă 32 de biți. Antetul fișierului va arăta astfel:
B.M.
14+40+100*100*4
0
0
14+40
Notă importantă: aceste numere sunt de fapt stocate ca o secvență de octeți. Sper că acest lucru este clar. Aici (și în exemplul următor) le-am aranjat într-o coloană pentru a ușura percepția.
Să ne ocupăm de al doilea domeniu. 14 - dimensiunea antetului fișierului. 40 este dimensiunea titlului imaginii (mai multe despre el mai jos), 100*100 este numărul de pixeli. Și în plus, deoarece am convenit că fiecare pixel va ocupa 32 de biți (4 octeți), trebuie să înmulțim numărul de pixeli cu patru.
Ultimul câmp: imaginea în sine începe imediat după antetul fișierului (14 octeți) și antetul imaginii (40 octeți).
Informații despre imagine BMP (antet imagine)
Există mai multe versiuni de BMP. Puteți determina versiunea după dimensiunea titlului imaginii. Vom folosi versiunea Windows V3, care ocupă 40 de octeți. Alte versiuni au 12, 64, 108, 124 de octeți.
În WinAPI, structura BITMAPINFOHEADER este utilizată pentru a stoca versiunea bmp a Windows V3.
Câmpuri de antet Windows V3:
4 octeți. Dimensiunea antetului. Întotdeauna setat la 40 de octeți.
4 octeți. Lățimea imaginii în pixeli.
4 octeți. Înălțimea imaginii în pixeli.
2 octeți. Acest câmp conține întotdeauna unul.
2 octeți. Adâncimea culorii este numărul de biți dintr-un pixel.
4 octeți. Metoda de compresie.
4 octeți. Marimea imaginii. Mărimea imaginii în sine este indicată aici - fără a ține cont de dimensiunea antetelor.
4 octeți. Rezoluție orizontală în pixeli pe metru (numărul de pixeli dintr-un metru).
4 octeți. Rezoluție verticală în pixeli pe metru (numărul de pixeli dintr-un metru).
4 octeți. Numărul de culori din paletă.
4 octeți. Numărul de culori importante din paletă.
Acum să vedem cum va arăta titlul imaginii în cazul nostru:
40
100
100
1
32
0
100*100*4
2795
2795
0
0
Pentru metoda de compresie, am ales 0 - fără compresie. Alte valori sunt posibile. Printre cele interesante: BI_JPEG (valoare - 4) - compresie folosită în imaginile jpeg și BI_PNG (valoare - 5) - compresie folosită în imaginile png.
Setăm rezoluția orizontală și verticală la 2795. În majoritatea editorilor de grafică, atunci când creați o imagine, rezoluția este setată la 71 pixeli pe inch (ppi - pixel pe inch)). Deci, 71ppi este 2795 pixeli pe metru. Rezoluția este folosită pentru a da lungimea fizică a imaginii (de exemplu, pentru ieșire către o imprimantă).
După titluri există o paletă de culori. Dacă nu este acolo, atunci imaginea începe imediat după titluri. Nu vom lua în considerare imaginile cu palete deocamdată.
Date de imagine BMP
O imagine este formată din pixeli. Formatul pixelilor este determinat de adâncimea culorii (vezi mai sus). În exemplul nostru am folosit 32 de biți pe pixel. Culoarea pe 32 de biți constă de obicei din patru canale: alfa (transparență), roșu, verde, albastru: ARGB (Alpha, Red, Green, Blue). Uneori, canalul alfa nu este utilizat, caz în care imaginea poate ocupa totuși 32 de biți, doar când calculează, nu acordă atenție valorilor unui canal. În acest caz, numele canalelor sunt scrise după cum urmează: XRGB.
Fiecare canal ocupă 8 biți (1 octet) și poate lua 256 de valori: de la zero la 255 (0x00 la 0xff).
În bmp, imaginea este stocată linie cu linie de jos în sus, adică. Liniile de jos sunt scrise mai întâi, apoi cele de sus. Asigurați-vă de acest lucru: încărcați una dintre imaginile de la primul exercițiu și salvați doar jumătate din liniile acelei imagini într-un alt fișier.
La o adâncime de culoare de 32 de biți, canalele în bmp sunt scrise după cum urmează: BGRA. În această ordine: albastru, verde, roșu, alfa.
Dimensiunea liniei de date din imaginea bmp trebuie să fie un multiplu de patru (în octeți). Dacă nu este cazul, atunci șirul este umplut cu zerouri. Acest lucru se întâmplă dacă sunt utilizați 1,2,4,8,16,24 biți pe canal. De exemplu, avem o imagine cu o lățime de 3 pixeli și folosim o culoare de 16 biți. Lățimea liniei: 16*3 = 48 (6 octeți). Dar lungimea liniei trebuie să fie un multiplu de patru, deci se adaugă încă doi octeți, iar lungimea liniei din acest exemplu va fi de opt octeți. Deși ultimii doi octeți ai fiecărei linii nu vor stoca informații utile. Este necesar să se țină cont de condiția ca dimensiunea liniei să fie un multiplu de patru atunci când se lucrează cu imagini care nu sunt pe 32 de biți.
Acum să continuăm cu exemplul nostru și să folosim codul pentru a crea o imagine. Fiecare pixel va fi inițializat cu o culoare aleatorie:
Std::ofstream os("temp.bmp", std::ios::binary); semnătură caracter nesemnat = ("B", "M"); unsigned int fileSize = 14 + 40 + 100*100*4; unsigned int rezervat = 0; unsigned int offset = 14 + 40; unsigned int headerSize = 40; unsigned int dimensiuni = ( 100, 100 ); nesemnat scurt colorPlanes = 1; bpp scurt nesemnat = 32; unsigned int compresie = 0; unsigned int imgSize = 100*100*4; unsigned int rezoluție = (2795, 2795); unsigned int pltColors = 0; unsigned int impColors = 0; os.write(reinterpret_cast
Ca urmare a executării acestui cod, un fișier temp.bmp va fi creat în folderul cu proiectul dvs. (dacă ați rulat programul prin depanator (F5)) sau în folderul Debug al soluției (dacă ați rulat fișierul executabil .exe), care poate fi deschis în orice vizualizator de imagini. Imaginea este formată din puncte colorate.
Sunteți aici pentru că aveți un fișier care are o extensie de fișier care se termină în .bmp. Fișierele cu extensia de fișier .bmp pot fi lansate numai de anumite aplicații. Este posibil ca fișierele .bmp să fie fișiere de date și nu documente sau media , ceea ce înseamnă că nu sunt menite să fie deloc vizionate.
ce este un fișier .bmp ?
Formatul de fișier BMP este compus dintr-un set de specificații de codificare a imaginilor implementate pentru producerea de fișiere imagine raster necomprimate. Aceste fișiere imagine bitmap sunt atașate cu anteturi de fișiere care includ identificatori bitmap, printre alte detalii specifice conținutului imaginii fișierelor BMP corespunzătoare. Conținutul de imagine digitală stocat într-un fișier BMP este format din pixeli dintr-o grilă dreptunghiulară. Pixelii conținuți în aceste fișiere BMP pot fi integrați cu diferite adâncimi de culoare, în funcție de anteturile fișierelor BMP. Gradienții în tonuri de gri pot fi aplicați și pe pixelii unui fișier .bmp, iar aceste fișiere .bmp pot fi exportate în formate de fișiere de imagine digitale mai utilizate pe scară largă, cu dimensiuni mai mici pentru o portabilitate optimă.
cum se deschide un fișier .bmp?
Lansați un fișier .bmp sau orice alt fișier de pe computer, făcând dublu clic pe el. Dacă asociațiile dvs. de fișiere sunt configurate corect, aplicația care este menită să vă deschidă fișierul .bmp o va deschide. Este posibil să aveți nevoie să descărcați sau să cumpărați aplicația corectă. De asemenea, este posibil să aveți aplicația corectă pe computer, dar fișierele .bmp nu sunt încă asociate cu aceasta. În acest caz, când încercați să deschideți un fișier .bmp, puteți spune Windows care aplicație este cea corectă pentru acel fișier. De atunci, deschiderea unui fișier .bmp va deschide aplicația corectă.
aplicații care deschid un fișier .bmp
Adobe Photoshop CS6 pentru Microsoft Windows
Adobe Photoshop CS6 pentru Microsoft Windows este un software de editare și gestionare a imaginilor descărcabil pe computerele Windows și anume Windows 7 (fără SP și cu SP1) și Windows XP cu SP3. Acest software vine cu noi funcții și instrumente pentru editarea simplă, rapidă, distractivă și avansată a imaginilor digitale. O caracteristică care face ca acest program să fie fiabil pentru editarea imaginilor este Adobe Mercury Graphics Engine, care este o tehnologie de motor care oferă performanțe mai rapide și de înaltă calitate. Instrumentele care țin cont de conținut sunt funcții noi concepute pentru retușarea imaginilor cu ușurință, deoarece puteți decupa imaginile fără niciun efect, puteți corecta automat neclaritatea sau curbura lentilelor cu unghi larg, puteți elimina ochii roșii și puteți regla echilibrul culorilor, cum ar fi luminozitatea și contrastul. Acest editor de imagini este, de asemenea, împreună cu funcția de recuperare automată care poate face backup oricăror imagini nesalvate, opțiunea de salvare în fundal, Galeria de estompare, instrumentul de decupare, crearea de videoclipuri și multe altele. Cu toate aceste noi funcții îmbunătățite și o interfață modernă și ușor de utilizat, editarea fotografiilor digitale nu poate fi niciodată atât de distractivă și ușoară fără Photoshop CS6.
Adobe Photoshop CS6 pentru Mac
Adobe Photoshop CS6 pentru Mac
Adobe Photoshop CS6 pentru Mac este versiunea software-ului de gestionare a imaginilor „Creative Suite” concepută exclusiv pentru computerele Mac, în special pentru Mac OS X v10.6 până la 10.7 pe 64 de biți. Acest program de editare a imaginilor este împachetat cu un nou set de caracteristici și instrumente, cum ar fi Motorul grafic Mercury dezvoltat de aceeași companie pentru performanță de îmbunătățire rapidă și de înaltă calitate a imaginii, funcții care țin cont de conținut, instrumente intuitive reimaginate pentru proiectarea filmelor, fluxuri de lucru , Galeria estompare, instrumentul Decupare și multe altele. Adobe Mercury Graphics Engine funcționează într-un mod care face ca sarcina de editare să fie ușor și rapid de finalizat. Acest lucru permite, de asemenea, partajarea și migrarea imaginilor cu opțiuni de recuperare automată și Salvare în fundal. Noile instrumente Content-Aware sunt create pentru o modalitate ușoară și controlabilă de retușare sau îmbunătățire a imaginilor care au ca rezultat o rezultate mai satisfăcute. Practic, permite oricărui utilizator să corecteze automat imaginile, să le decupeze și să corecteze curbura lentilelor cu unghi larg.
ACD Systems Canvas 14
ACD Systems Canvas 14
ACD Systems International Inc. este dezvoltatorul ACD Systems Canvas 14, care este un software de soluție grafică tehnică, care permite utilizatorilor să analizeze datele, să îmbunătățească grafica și să partajeze toate informațiile cu ușurință și rapiditate. Acest program este conceput cu instrumente complete care ajută utilizatorii să realizeze grafice tehnice și ilustrații cu acuratețe. Constă în instrumente de editare care variază de la editarea imaginilor la instrumente de ilustrare a obiectelor. Orice rezultate create de acest program fac prezentări bune pentru proiecte, propuneri și alte scopuri pentru orice linie de afaceri legată de grafică și inginerie. Mai multe despre funcții, utilizatorii pot lucra cu imagini raster și grafice vectoriale folosind același fișier cu opțiunea de editare prin redimensionarea și scalarea obiectelor, desenarea formelor, precum și inserarea cernelurilor sau a lățimii de contur și umplere. Există, de asemenea, un instrument pentru adăugarea de texte sau etichete și dimensiuni de format, plus crearea de diagrame. Cu acest program, utilizatorii pot partaja proiectele finalizate prin prezentări sau publicații.Sisteme ACD ACDSvezi 15