Ce înseamnă bmp? Care este extensia de fișier BMP? Ce program să deschidă extensia bmp

BMP(din engleză Imagine bitmap) este un format de stocare a imaginilor raster dezvoltat de Microsoft.

Un număr mare de programe funcționează cu formatul BMP, deoarece suportul acestuia este integrat în sistemele de operare Windows și OS/2. Fișierele BMP pot avea extensii .bmp, .dib și .rle. În plus, datele în acest format sunt incluse în fișierele de resurse binare RES și fișierele PE.

Microsoft a dezvoltat, de asemenea, formatele ICO și CUR pentru nevoile sale, care au o structură similară cu BMP. În plus, structurile din acest format sunt folosite de unele funcții WinAPI ale subsistemului GDI.

Adâncimile de culoare în acest format pot fi 1, 2, 4, 8, 16, 24, 32, 48 biți pe pixel, dar 2 biți pe pixel nu sunt acceptați oficial. În acest caz, pentru adâncimi de culoare mai mici de 16 biți, se utilizează o paletă cu componente full-color cu o adâncime de 24 de biți.

În formatul BMP, imaginile pot fi stocate ca atare sau folosind niște algoritmi de compresie obișnuiți. În special, formatul BMP acceptă compresia RLE fără pierderi de calitate, iar sistemele de operare și software-ul modern permit utilizarea JPEG și PNG (aceste formate sunt încorporate în BMP ca container).

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:

  1. Antetul fișierului (BITMAPFILEHEADER)
  2. Denumirea imaginii (BITMAPINFOHEADER, poate lipsi). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
  3. Paleta (poate lipsi)
  4. 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, lungime 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 se presupune că ordinea octeților este 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.

  • 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, câte un octet pentru intensitatea canalelor albastru, verde și respectiv roșu. Cel mai semnificativ octet al fiecărui quad nu este de obicei folosit, 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.
biCompression Tip de compresie pentru imagini comprimate:
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
biSizeImage Dimensiunea imaginii în octeți. Poate conține zero pentru imaginile BI_RGB. Win98/Me/2000/XP: Dacă biCompression conține BI_JPEG sau BI_PNG, biSizeImage specifică dimensiunea memoriei tampon de imagine BI_JPEG sau BI_PNG.
biXPelsPerMeter Rezoluție orizontală în pixeli pe metru pentru dispozitivul țintă. O aplicație poate folosi această valoare pentru a selecta dintr-un grup de resurse de imagine cea mai potrivită imagine pentru dispozitivul curent. Pentru DPI 96, care este acceptat de Microsoft pentru monitoare, acesta va fi egal cu 3780 (dacă este calculat folosind formula (96 / 25,4) * 1000).
Î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 nu într-o formă 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.
  • 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:
LCS_CALIBRATED_RGB LCS_sRGB LCS_WINDOWS_COLOR_SPACE PROFILE_LINKED PROFILE_EMBEDDED
  • bV5Intent - poate lua următoarele valori:
LCS_GM_ABS_COLORIMETRIC LCS_GM_BUSINESS LCS_GM_GRAPHICS LCS_GM_IMAGES
  • 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 completată 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 potrivesc bine la puteri de doi (mai ales când se stochează date în memorie, unde alinierea datelor la granița unui cuvânt contează), se folosește adesea 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 #include #include #include #include #include #include #include #include #include #include #include "bitmap.h" /* Iată definițiile antetului BMP descrise mai sus în acest articol */ static XImage * CreateImageFromBuffer(Display*, unsigned char *, int, int) ; main(int argc, char * argv ) ( Display * dis; Window win; /* Fereastra noastră */ XEvent event; /* Evenimente */ GC gc;/* Context grafic */< 2 ) { perror ("use: xtest file.bmpXImage * imagine; int n, lățime, înălțime, fd, dimensiune; XImage * imagine; unsigned char * date; BITMAFILEHEADER bmp; BITMAPINFOHEADER inf; char * buf; dacă (argc \n"); ieșire(1);) if ((fd = open(argv[ 1 ] , O_RDONLY) ) == - 1 ) ( printf ("Eroare de deschidere bitmap) ); ieșire(1); /* Citiți în buffer */ n = read(fd, buf, size) ; printf(„dimensiune = %d octeți citiți\n” , n); imagine = CreateImageFromBuffer(dis, buf, lățime, înălțime) ; /* Ștergeți tamponul - nu mai avem nevoie de el */ gratuit(buf); XMapWindow(dis, câștig); XSelectInput(dis, win, ExposureMask | KeyPressMask) ; while (1) ( XNextEvent(dis, & event) ; if (event.xany .window == win) ( switch (event.type ) (case Expose: XPutImage(dis, win, gc, image, 0 , 0 , 0) , 0 , imagine-> lățime, imagine-> înălțime) ; break ; ieșire (EXIT_SUCCESS) ;/* Creează o imagine X dintr-un fișier BMP, deoarece imaginea BMP este stocată cu susul în jos * și oglindită - aceasta este corectată în buclă */ XImage * CreateImageFromBuffer(Display * dis, unsigned char * buf, int width, int height) ( int adâncime, ecran; XImage * img = NULL; int i, j; int numBmpBytes; size_t numImgBytes; int32_t * imgBuf; int ind = 0 ; int linie;/* Numerele rândurilor și coloanelor pentru a reflecta */< numBmpBytes; i++ ) { unsigned int r, g, b; int new_ind;/* Index nou */ ecran = DefaultScreen(dis) ; depth = DefaultDepth(dis, ecran) ; temp = latime * 3 ;<< 8 | b << 16 ) << 8 ; ind++; } img = XCreateImage(dis, CopyFromParent, depth, ZPixmap, 0 , (char * ) imgBuf, width, height, 32 , 0 ) ; XInitImage(img) ; linie = temp + lățime % 4 ;/* Lungimea șirului ținând cont de aliniere */

Formatul de fișier BMP (prescurtarea de la BitMaP) este formatul nativ de grafică raster pentru Windows, deoarece se potrivește cel mai mult cu formatul Windows nativ în care sistemul respectiv își stochează matricele raster. Extensia de nume de fișier folosită cel mai des în formatul BMP este BMP, deși unele fișiere au extensia RLE, care înseamnă codificarea lungimii de rulare. Extensia RLE a unui nume de fișier indică de obicei că informațiile raster ale fișierului au fost comprimate folosind una dintre cele două metode de compresie RLE care sunt valabile pentru fișierele în format BMP.

În fișierele BMP, informațiile de culoare ale fiecărui pixel sunt codificate la 1, 4, 8, 16 sau 24 de biți (biți/pixel). Numărul de biți pe pixel, numit și adâncimea culorii, determină numărul maxim de culori dintr-o imagine. O imagine cu o adâncime de 1 bit/pixel poate avea doar două culori, iar cu o adâncime de 24 bit/pixel - mai mult de 16 milioane de culori diferite.

Diagrama de mai jos arată structura unui fișier BMP tipic care conține o imagine de 256 de culori (8 biți/pixel adâncime). Fișierul este împărțit în patru secțiuni principale: antetul fișierului cu grafică raster, antetul informațiilor matricei raster, tabelul de culori și datele matricei raster în sine. Antetul unui fișier grafic raster conține informații despre fișier, inclusiv adresa de la care începe zona de date matrice raster. Antetul de informații al matricei raster conține informații despre imaginea stocată în fișier, cum ar fi înălțimea și lățimea acesteia în pixeli. Tabelul de culori oferă valorile culorii primare RGB (roșu, verde, albastru) pentru culorile utilizate în imagine. Programele care citesc și afișează fișiere BMP, atunci când folosesc adaptoare video care nu permit afișarea a mai mult de 256 de culori, pot seta în mod programatic astfel de valori RGB în paletele de culori ale adaptoarelor pentru reproducerea corectă a culorilor.

Formatul datelor reale ale matricei raster dintr-un fișier BMP depinde de numărul de biți utilizați pentru a codifica datele de culoare pentru fiecare pixel. Cu o imagine de 256 de culori, fiecare pixel din partea fișierului care conține datele reale ale matricei raster este descris de un octet (8 biți). Această descriere a pixelilor nu reprezintă valorile de culoare RGB, dar servește ca indicator pentru a intra în tabelul de culori al fișierului. Astfel, dacă R/G/B=255/0/0 este stocată ca prima valoare a culorii RGB în tabelul de culori al unui fișier BMP, atunci valorii pixelului 0 din matricea raster i se va atribui culoarea roșu aprins. Valorile pixelilor sunt stocate în ordine de la stânga la dreapta, începând (de obicei) din rândul de jos al imaginii. Astfel, într-un fișier BMP de 256 de culori, primul octet al datelor matrice raster este indexul pentru culoarea pixelului situat în colțul din stânga jos al imaginii; al doilea octet reprezintă indexul pentru culoarea pixelului adiacent la dreapta, etc. Dacă numărul de octeți din fiecare rând este impar, atunci se adaugă un octet suplimentar la fiecare rând pentru a alinia datele matricei raster pe granițele de 16 biți .


Nu toate fișierele BMP au o structură ca cea prezentată în diagramă. De exemplu, fișierele BMP de 16 și 24 de biți/pixel nu au tabele de culori; în aceste fișiere, valorile pixelilor matricei raster caracterizează direct valorile culorii RGB. Formatele de stocare internă ale secțiunilor individuale ale fișierului pot, de asemenea, să difere. De exemplu, informațiile de matrice raster din unele fișiere BMP de 16 și 256 de culori pot fi comprimate folosind algoritmul RLE, care înlocuiește secvențele de pixeli de imagine identici cu simboluri care specifică numărul de pixeli din secvență și culoarea acestora. Pe Windows, puteți lucra cu fișiere BMP în stil OS/2 care utilizează diverse formate de antet de matrice raster și tabel de culori.

Acest articol este despre cum arată formatul grafic bmp. Deși acesta este unul dintre formatele mai simple, datorită faptului că există multe variante ale acestui format, nu toate punctele sunt evidente. Deci, nu mai turnați apă, să începem.

Structuri de format

Formatul bmp (din cuvintele BitMaP - bit map, sau, în rusă, bit array) este o imagine necomprimată (în mare parte) care este destul de ușor de citit și afișat în sistemul de operare Windows, care are funcții speciale API care ajută.

Mai întâi, să oferim o reprezentare grafică a datelor în bmp (imagine luată de pe MSDN).

La început există un antet de fișier (BITMAPFILEHEADER). Este descris după cum urmează:

bfType determină tipul fișierului. Aici ar trebui să fie BM. Dacă deschideți orice fișier BMP într-un editor de text (sau mai bine zis, într-un editor hexazecimal), veți vedea că primele două caractere sunt BM (din cuvântul BitMap, așa cum probabil ați ghicit deja).
bfSize este dimensiunea fișierului în sine în octeți. Strict vorbind, ar trebui să îl calculați (ceea ce este recomandat), dar am setat greșit dimensiunea fișierului (deși nu intenționat :)) și nu au fost probleme (ACDSee a citit fără probleme, programul meu a funcționat), dar nu vă recomand scrieți-o intenționat incorect, dintr-o dată va apărea un program conștiincios care va compara această dimensiune cu cea reală și va decide că nu este bmp, ci altceva. În mod ideal, toate programele, pentru a se asigura că acesta este un bmp real și nu un fals, ar trebui, în primul rând, să verifice dacă bfType conține „BM” (fără ghilimele) și, în al doilea rând, că bfSize este egal cu dimensiunea fișierului .
bfReserved1 și bfReserved2 sunt rezervate și trebuie să fie zero.
bfOffBits. Acesta este unul dintre cele mai importante domenii din această structură. Arată unde începe bitmap-ul în sine în raport cu începutul fișierului (sau, așa cum este scris în MSDN, „de la începutul structurii BITMAPFILEHEADER”), care descrie imaginea. Adică, pentru a fi garantat că ajungeți la începutul matricei, trebuie să scrieți:

typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LUNG biÎnălțime;
biplanuri WORD;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
) BITMAPINFOHEADER, * PBITMAPINFOHEADER;

biSize este dimensiunea structurii în sine. Acesta trebuie inițializat după cum urmează: bih.biSize = sizeof(BITMAPINFOHEADER);
Aici vom presupune din nou că bih este declarat după cum urmează: BITMAPINFOHEADER bih;
biWidth și biHeight setați lățimea și, respectiv, înălțimea imaginii în pixeli.
biAvioane specifică numărul de avioane. Deocamdată este întotdeauna setat la 1.
biBitCount- Numărul de biți pe pixel. Vom vorbi mai multe despre asta mai jos.
bicompresie indică tipul de compresie. Nu fi surprins sau speriat că bmp experimentează brusc compresie. Eu personal nu am văzut mai mult de un bmp comprimat (dar nu spun că nu există). Dacă nu există compresie, atunci acest flag trebuie setat la BI_RGB. În acest articol vorbim despre formatul necomprimat, așa că nici măcar nu voi enumera alte steaguri. Se pare ca aceeasi structura este folosita in fisierele JPEG si PNG, deoarece incepand de la Windows 98 au aparut optiunile BI_JPEG, care arata ca aceasta poza este JPEG si BI_PNG, ca este PNG (nu stiu nimic despre formatul Jpeg, Tocmai am făcut aceste concluzii pe baza a ceea ce este scris în MSDN).
biSizeImage indică dimensiunea imaginii în octeți. Dacă imaginea este necomprimată (adică câmpul anterior este setat la BI_RGB), atunci ar trebui scris un zero aici. biXPelsPerMeterŞi biYPelsPerMeter denotă, respectiv, rezoluția orizontală și verticală (în pixeli pe metru) a dispozitivului final pe care va fi scos bitmap-ul (raster). O aplicație poate folosi această valoare pentru a selecta dintr-un grup de resurse cel mai potrivit bitmap pentru dispozitivul dorit. Faptul este că formatul bmp este în esență un raster independent de hardware, adică atunci când aspectul a ceea ce se obține nu depinde de ceea ce este proiectat acest raster (ca să spunem așa). De exemplu, o imagine va arăta la fel, indiferent dacă este desenată pe un ecran de monitor sau imprimată pe o imprimantă. Dar rezoluția dispozitivelor este diferită și tocmai pentru a selecta cea mai potrivită imagine dintre cele disponibile sunt utilizați acești parametri.
biClrUsed determină numărul de culori utilizate din tabel. Dacă această valoare este zero, atunci rasterul utilizează numărul maxim de culori permis de valoarea biBitCount. Acest lucru este relevant doar pentru imaginile comprimate. Dacă biClrUsed este diferit de zero și biBitCount este mai mic de 16, atunci biClrUsed determină numărul curent de culori disponibile pentru motorul grafic sau driverul de dispozitiv. Dacă biBitCount este mai mare sau egal cu 16, atunci biClrUsed determină dimensiunea tabelului de culori utilizat pentru a optimiza paleta curentă a sistemului.
biClrImportant- acesta este numărul de culori importante. Determină numărul de culori necesare pentru a reprezenta desenul. Dacă această valoare este 0 (cum este de obicei), atunci toate culorile sunt considerate importante.

Tipuri de format BMP

Toate tipurile de format bmp conditionat poate fi împărțit în două tipuri: paletă și non-paletă. Adică dacă paleta este folosită într-un format dat sau nu. Vă rugăm să rețineți că paleta poate fi chiar și în formate fără paletă, dar nu este folosită acolo. În bmp-uri fără paletă, culoarea este calculată direct din biții care intră în fișier, pornind de la un anumit loc. Și în palete, fiecare octet descrie unul sau mai mulți pixeli, iar valorile octetului (sau biților) sunt indicele de culoare din paletă. Pentru început, voi oferi un tabel care compară opțiunile posibile. Tipul de imagine (paletă sau fără paletă) depinde de câți biți sunt dați pe pixel, adică de valoarea biBitCount a structurii BITMAPINFOHEADER.

biBitCountFormat paletă sau fără paletăNumăr maxim posibil de culoriNote 1 Paletă2 O imagine de paletă în două culori, nu neapărat alb-negru. Dacă bitul raster (care este chiar mai jos) este resetat (egal cu 0), atunci aceasta înseamnă că prima culoare din paletă ar trebui să fie în acest loc, iar dacă este setată (egal cu 1), atunci a doua. 4 Paletă16 Fiecare octet descrie 2 pixeli. Iată un exemplu din MSDN Dacă primul octet din imagine este 0x1F, atunci acesta corespunde la doi pixeli, culoarea primului este a doua culoare din paletă (deoarece numărătoarea inversă începe de la zero), iar al doilea pixel este. a 16-a culoare a paletei. 8 Paletă256 Una dintre cele mai comune opțiuni. Dar, în același timp, cele mai simple. Paleta ocupă un kilobyte (dar este mai bine să nu contați pe ea). Un octet este o culoare. Mai mult, valoarea sa este numărul culorii din paletă. 16 Fără paletă2^16 sau 2^15Aceasta este cea mai confuză opțiune. Să începem cu faptul că nu are paletă, adică fiecare doi octeți (un cuvânt WORD) în raster definește în mod unic un pixel. Dar iată ce se întâmplă: există 16 biți și există 3 componente de culoare (roșu, verde, albastru). Dar 16 nu vrea să fie împărțit la 3. Prin urmare, aici există două opțiuni. Primul este să folosiți nu 16, ci 15 biți, apoi există 5 biți pentru fiecare componentă de culoare. Astfel putem folosi maxim 2^15 = 32768 culori și obținem un triplu R-G-B = 5-5-5. Dar apoi o bucată întreagă din 16 se pierde în zadar. Dar se întâmplă că ochii noștri, printre toate culorile, percep mai bine verdele, așa că am decis să dăm un pic componenta verde, adică atunci obținem. triplu R-G-B = 5-6-5, iar acum putem folosi 2^16 = 65536 culori. Dar cel mai neplăcut lucru este că sunt folosite ambele opțiuni. MSDN sugerează că, pentru a distinge câte culori sunt utilizate, completați câmpul biClrUsed din structura BITMAPINFOHEADER cu această valoare. Pentru a selecta fiecare componentă, trebuie să utilizați următoarele măști. Pentru formatul 5-5-5: 0x001F pentru componenta albastră, 0x03E0 pentru verde și 0x7C00 pentru roșu. Pentru formatul 5-6-5: 0x001F - albastru, 0x07E0 - verde și respectiv 0xF800 roșu componente. 24 Fără paletă2^24 Și acesta este cel mai simplu format. Aici 3 octeți definesc 3 componente de culoare. Adică o componentă pe octet. Citim pur și simplu structura RGBTRIPLE și folosim câmpurile sale rgbtBlue, rgbtGreen, rgbtRed. Ei merg în ordinea aceea. 32 Fără paletă2^32 Aici 4 octeți definesc 3 componente. Dar, totuși, un octet nu este utilizat. Poate fi folosit, de exemplu, pentru canalul alfa (transparență). În acest caz, este convenabil să citiți rasterul folosind structuri RGBQUAD, care sunt descrise după cum urmează:

Stocarea datelor în format bmp

Ei bine, acum ajungem la partea cea mai interesantă. După structurile BITMAPFILEHEADER și BITMAPINFOHEADER vine paleta. În plus, dacă formatul nu are paletă, atunci s-ar putea să nu existe, totuși, nu ar trebui să te bazezi pe el. Cert este că, atunci când tocmai începeam să înțeleg formatul bmp, am citit într-o carte că, se presupune că, dacă formatul nu are paletă, atunci nu are deloc paletă. Au fost chiar și două imagini - diagrame de format: una cu o paletă, cealaltă fără. Și la vremea aceea scriam un program care funcționează cu sârguință cu fișiere bmp. Și a trebuit să convertesc imaginile primite de la 256 de culori la 24 de biți (dacă există) în fișiere temporare. Și pur și simplu nu am creat o paletă pe 24 de biți (bfOffBits din structura BITMAPFILEHEADER a fost egală cu suma sizeof(BITMAPINFOHEADER) + sizeof (BITMAPINFOHEADER) și le-am lăsat neschimbate pe cele primite pe 24 de biți. Cu rasterele de 256 de culori totul a funcționat așa cum ar trebui, până când nu am dat peste o imagine de 24 de biți care avea gunoi afișat în partea de jos în loc de partea necesară, nu am înțeles imediat ce era în neregulă până când am comparat dimensiunea fișierului original cu una teoretică care ar fi trebuit să existe dacă nu ar fi existat o paletă. Diferența sa dovedit a fi de exact 1024 de octeți pe dimensiunea sa (deși toate imaginile pe care le-am întâlnit aveau o dimensiune a paletei de 256 de culori, sau 1Kb), treceți întotdeauna prin fișier la începutul rasterului, folosind bfOffBits Paleta este o matrice de structuri RGBQUAD una după alta Chiar dacă nu toate culorile sunt utilizate în paletă (dar numai, de exemplu, 16), atunci adesea sunt alocate 256 de câmpuri pentru paleta A 256 * 4 = 1024, unde 4 este dimensiunea structurii RGBQUAD , se obține același kilobyte.

Imediat după paletă vine rasterul în sine. Aici lucrurile devin mai confuze. În primul rând, pixelii sunt descriși aici așa cum sunt scrise în tabelul de mai sus, în funcție de format. Și ele însele pot conține valoarea componentelor de culoare (pentru cele fără paletă), sau pot fi indecși ai unei matrice de palete. Imaginea în sine este înregistrată rând cu rând. În al doilea rând, imaginea pare să fie cu susul în jos. Adică linia de jos este scrisă mai întâi, apoi penultima linie și așa mai departe până în partea de sus. Și, în al treilea rând, așa cum este scris, dacă dimensiunea liniei raster nu este un multiplu de 4, atunci aceasta este umplută cu 1 până la 3 octeți goli (zero), astfel încât lungimea liniei să fie un multiplu al paragrafului. Acesta este cel mai neplăcut lucru. Faptul este că pentru fiecare format trebuie să ajustați acest număr de octeți goli (deși îmi place să scriu o parte din paletă acolo, pur și simplu nu vreau să creez variabile suplimentare „zero” dacă acești octeți sunt oricum săriți și nimeni are nevoie de ele). Ofer un tabel cu formule care arată pentru ce format câți octeți trebuie adăugați la sfârșitul liniei. Acolo, variabila Width, după cum ați putea ghici, înseamnă lățimea imaginii. Toate aceste formule au fost stabilite experimental. Voi da un exemplu doar pentru cele mai utilizate formate. În rest, îl poți scrie singur.

Exemple de programe

Puteți descărca toate sursele, nu voi scrie prea multe aici. Voi da doar funcțiile cu comentarii.

Bună ziua 1. Crearea unei imagini în format bmp.
Aici este creată o imagine monocromatică. Există trei exemple de astfel de funcții: crearea bmp 8, 16 și 24 de biți. Voi da doar pentru 16 biți.

// Să creăm o imagine în format bmp 16 biți ca 5-5-5, care va fi pur și simplu monocromatic
void CreateBmp555(char * fname, WORD culoare)
{
MÂNERUL hFile;
DWORD RW;
int i, j;

// Declară structurile necesare
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
BYTE Palette[1024];

// Paleta
// Să avem o imagine de 35 x 50 pixeli
int Latime = 35 ;

int Înălțime = 50 ; memset(Palette, 0, 1024);
// În paletă avem zerouri, umpleți-le

memset (&bfh, 0 , sizeof (bfh) ) ; Bfh.bfType = 0x4D42 ;
// Să notăm că acesta este bmp "BM" bfh.bfOffBits = dimensiunea (bfh) + dimensiunea (bih) + 1024;
// Paleta ocupă 1 Kb, dar nu o vom folosi
bfh.bfSize = bfh.bfOffBits +
sizeof(culoare) * Latime * Inaltime + Înălțime * ((dimensiunea (culoarea) * Lățime) % 4 ) ;
// Calculați dimensiunea fișierului final
memset (&bih, 0 , sizeof (bih) ) ;
bih.biSize = sizeof(bih); // Așa ar trebui să fie
bih.biBitCount = 16; // Folosim 5-5-5
bih.biCompression = BI_RGB;
// Fără compresie
bih.biHeight = Înălțime;
bih.biWidth = Latime;
bih.biPlanes = 1 ;

// Ar trebui să fie 1
// Și câmpurile rămase rămân 0
HFile = CreateFile (fname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);

dacă (hFișier == INVALID_HANDLE_VALUE)
întoarcere;
// Scrieți anteturile

WriteFile (hFile, & bfh, sizeof (bfh) , & RW, NULL ) ;
WriteFile (hFile, & bih, sizeof (bih) , & RW, NULL ) ;
// Scrieți paleta< Height; i++ )
{
WriteFile(hFile, Palette, 1024, &RW, NULL);< Width; j++ )
{
pentru (i = 0; i
}

pentru (j = 0; j
WriteFile (hFișier, & culoare, dimensiunea (culoare) , & RW, NULL ) ;
}
// Aliniați-vă la chenar
}

WriteFile (hFile, Palette, (sizeof (culoare) * Width) % 4 , & RW, NULL ) ;

CloseHandle(hFile);

culoare - culoarea imaginii. Valoarea acestei variabile trebuie completată conform primului tabel. Puteți vizualiza imaginea rezultată în ACDSee, de exemplu. Tocmai am încercat să-l deschid în Photoshop, dar s-a dovedit că nu le poate citi în acest format, dar poți :).
{
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
Exemplul 2. Conversia unei imagini din formatul de 8 biți (256 de culori) în 24 de biți.
BOOL Convert256To24 (car * fin, char * fout)
int Latime, Inaltime;
Paleta RGBQUAD[ 256 ] ;
BYTE * inBuf;
DWORD RW;
RGBTRIPLE * outBuf;
int i, j;

MÂNERE hIn, hOut;
DWORD OffBits;
HIn = CreateFile (fin, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL) ;

dacă (hIn == INVALID_HANDLE_VALUE)
returnează FALSE;
{
HOut = CreateFile(fout, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
HIn = CreateFile (fin, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL) ;
}

if (hOut == INVALID_HANDLE_VALUE)
CloseHandle(hIn);
// Citiți datele
ReadFile (hIn, & bfh, sizeof (bfh) , & RW, NULL ) ;

ReadFile (hIn, & bih, sizeof (bih) , & RW, NULL ) ;
ReadFile (hIn, Palette, 256 * sizeof (RGBQUAD) , & RW, NULL ) ;
// Setați indicatorul la începutul rasterului
SetFilePointer (hIn, bfh.bfOffBits, NULL, FILE_BEGIN) ;
Width = bih.biWidth ;

Height = bih.biHeight ;
OffBits = bfh.bfOffBits ;
// Alocați memorie

inBuf = nou BYTE [Width];
outBuf = nou RGBTRIPLE [ Width ] ; // Completați anteturile
bfh.bfOffBits = dimensiunea (bfh) + dimensiunea (bih) ;
// Să nu scriem o paletă

bih.biBitCount = 24;
dacă (hFișier == INVALID_HANDLE_VALUE)
bfh.bfSize = bfh.bfOffBits + 4 * Lățimea * Înălțimea + Înălțimea * (Width % 4 ) ;
// Dimensiunea fișierului

// Iar restul rămâne neschimbat
// Scrieți paleta< Height; i++ )
{
WriteFile (hOut, & bfh, sizeof (bfh) , & RW, NULL ) ;
WriteFile(hFile, Palette, 1024, &RW, NULL);< Width; j++ )
{
WriteFile (hOut, & bih, sizeof (bih) , & RW, NULL ) ;
outBuf[ j].rgbtGreen = Paleta[ inBuf[ j] ] .rgbGreen ;
outBuf[ j].rgbtBlue = Paleta[ inBuf[ j] ] .rgbBlue ;
}
WriteFile (hOut, outBuf, sizeof (RGBTRIPLE) * Width, & RW, NULL );

// Scrie gunoi pentru aliniere
WriteFile (hOut, Palette, Width % 4 , & RW, NULL ) ;
SetFilePointer(hIn, (3 * Width) % 4, NULL, FILE_CURRENT) ;
}

șterge inBuf;
șterge afară Buf;
HOut = CreateFile(fout, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
CloseHandle(hOut);
returnează TRUE;
}

Numele fișierelor sursă și, respectiv, destinație trebuie trecute funcției.

Dacă ați instalat pe computer program antivirus Can scanează toate fișierele de pe computer, precum și fiecare fișier individual. Puteți scana orice fișier făcând clic dreapta pe fișier și selectând opțiunea corespunzătoare pentru a scana fișierul pentru viruși.

De exemplu, în această figură este evidențiat fișierul my-file.bmp, apoi trebuie să faceți clic dreapta pe acest fișier și să selectați opțiunea din meniul fișierului „scanați cu AVG”. Când selectați această opțiune, AVG Antivirus se va deschide și va scana fișierul pentru viruși.


Ca urmare, poate apărea uneori o eroare instalare incorectă a software-ului, care se poate datora unei probleme întâlnite în timpul procesului de instalare. Acest lucru poate interfera cu sistemul dvs. de operare conectați fișierul BMP la instrumentul de aplicație corect, influențând așa-zisa „asociații de extensii de fișiere”.

Uneori simplu reinstalarea Adobe Illustrator CC vă puteți rezolva problema conectând corect BMP cu Adobe Illustrator CC. În alte cazuri, pot apărea probleme cu asocierile de fișiere programare software proastă dezvoltator și poate fi necesar să îl contactați pentru asistență suplimentară.


Sfat:Încercați să actualizați Adobe Illustrator CC la cea mai recentă versiune pentru a vă asigura că aveți cele mai recente remedieri și actualizări.


Acest lucru poate părea prea evident, dar adesea Fișierul BMP în sine poate cauza problema. Dacă ați primit un fișier printr-un atașament de e-mail sau l-ați descărcat de pe un site web și procesul de descărcare a fost întrerupt (cum ar fi o întrerupere de curent sau un alt motiv), fișierul poate fi deteriorat. Dacă este posibil, încercați să obțineți o nouă copie a fișierului BMP și încercați să o deschideți din nou.


Cu grijă: Un fișier deteriorat poate provoca daune colaterale programelor malware anterioare sau existente pe computerul dvs., așa că este important să păstrați computerul să ruleze un antivirus actualizat în orice moment.


Dacă fișierul dvs. este BMP legate de hardware-ul computerului dvs pentru a deschide fișierul de care aveți nevoie actualizați driverele dispozitivului asociat cu acest echipament.

Această problemă asociate de obicei cu tipuri de fișiere media, care depind de deschiderea cu succes a hardware-ului din interiorul computerului, de ex. placa de sunet sau placa video. De exemplu, dacă încercați să deschideți un fișier audio, dar nu îl puteți deschide, poate fi necesar actualizați driverele plăcii de sunet.


Sfat: Dacă atunci când încercați să deschideți un fișier BMP, primiți Mesajul de eroare al fișierului .SYS, problema ar putea fi probabil asociate cu drivere de dispozitiv corupte sau învechite care trebuie actualizate. Acest proces poate fi simplificat prin utilizarea unui software de actualizare a driverelor, cum ar fi DriverDoc.


Dacă pașii nu rezolvă problemași încă mai aveți probleme la deschiderea fișierelor BMP, acest lucru s-ar putea datora lipsa resurselor disponibile de sistem. Unele versiuni de fișiere BMP pot necesita o cantitate semnificativă de resurse (de exemplu, memorie/RAM, putere de procesare) pentru a se deschide corect pe computer. Această problemă este destul de comună dacă utilizați hardware de computer destul de vechi și, în același timp, un sistem de operare mult mai nou.

Această problemă poate apărea atunci când computerul are dificultăți în a ține pasul cu o sarcină, deoarece sistemul de operare (și alte servicii care rulează în fundal) pot consumă prea multe resurse pentru a deschide un fișier BMP. Încercați să închideți toate aplicațiile de pe computer înainte de a deschide Bitmap Image File. Eliberarea tuturor resurselor disponibile pe computer vă va oferi cele mai bune condiții pentru a încerca să deschideți fișierul BMP.


Dacă tu a parcurs toți pașii descriși mai susși fișierul dvs. BMP încă nu se va deschide, poate fi necesar să rulați actualizare echipament. În majoritatea cazurilor, chiar și atunci când utilizați versiuni mai vechi de hardware, puterea de procesare poate fi totuși mai mult decât suficientă pentru majoritatea aplicațiilor utilizatorilor (cu excepția cazului în care faceți o mulțime de muncă intensivă CPU, cum ar fi randarea 3D, modelarea financiară/științifică sau muncă multimedia intensivă) . Astfel, este probabil ca computerul dvs. să nu aibă suficientă memorie(numită în mod obișnuit „RAM” sau memorie cu acces aleatoriu) pentru a efectua sarcina de a deschide un fișier.




Top