bmp formátum leírása

formátum szerkezete

bmp formátumban (a szó bitmap - bitmap, vagy beszél oroszul, bitmap) egy nem tömörített (főleg) egy kép, ami nagyon könnyen olvasható, és megjelenik a Microsoft Windows, amely egy speciális API függvény, ami ebben az segíteni.







Először is adunk grafikus ábrázolása adatok bmp (kép vett MSDN).


Az elején áll a fájl fejlécében (BITMAPFILEHEADER). Ez a következőképpen jellemezhető:

typedef struct tagBITMAPFILEHEADER
# 123;
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
# 125; BITMAPFILEHEADER * PBITMAPFILEHEADER;

SetFilePointer # 40; hFile, BFH. bfOffBits. NULL. FILE_BEGIN # 41; ;

Itt és az alábbiakban azt fogjuk feltételezni, hogy a változó nyilvánították BFH BITMAPFILEHEADER BFH;

És akkor jön BITMAPINFOHEADER szerkezet, amely nyilvánították az alábbiak szerint:

typedef struct tagBITMAPINFOHEADER
# 123;
DWORD biSize;
HOSSZÚ biWidth;
HOSSZÚ biHeight;
WORD Biplanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
HOSSZÚ biXPelsPerMeter;
HOSSZÚ biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
# 125; BITMAPINFOHEADER * PBITMAPINFOHEADER;

biSize - a mérete a szerkezet. Meg kell inicializálni a következőképpen: bih.biSize = sizeof (BITMAPINFOHEADER);
Itt újra, és továbbra is azt feltételezik, hogy BIH nyilvánították az alábbiak szerint: BITMAPINFOHEADER bih;
biWidth biHeight és a kép szélességét és magasságát pixelben.
Biplanes meghatározza a repülőgépek száma. Bár mindig be van állítva 1.
biBitCount - bitek száma pixelenként. További részletek az alábbiakban tárgyaljuk.
biCompression típusát jelzi a tömörítés. Ne lepődj meg, és ne félj, hogy a hirtelen tömörítés és BMP. Én személy szerint még nem láttam nem egy tömörített bmp (de nem mondom, hogy ezek nem léteznek). Ha nincs tömörítés, ezt a zászlót kell telepíteni BI_RGB. Ebben a cikkben beszélünk tömörítetlen formában, így más zászlók én nem is fog felsorolni. Úgy tűnik, hogy ez ugyanaz a struktúra használják a JPEG és PNG, mert kezdve Windows 98, voltak lehetőségek BI_JPEG, ami azt mutatja, hogy ez a kép - JPEG és BI_PNG ez PNG (a JPEG formátumú, nem tudom, én csak tettem ezeket a megállapításokat alapján mi van írva MSDN).
biSizeImage jelöli a kép méretét byte-ban. Ha a kép tömörítetlen (azaz az előző mező beállítása BI_RGB), akkor ki kell írni a nullához. biXPelsPerMeter és biYPelsPerMeter rendre vízszintes és függőleges felbontás (pixel méterenként) a végén eszköz megjelenik egy bittérkép (raszter). Az alkalmazás használhatja ezt az értéket kell kiválasztani a legmegfelelőbb erőforrás csoport bittérképet a kívánt eszközt. Az a tény, hogy a BMP formátumú - lényegében egy eszköz-független bitmap, hogy van, amikor a megjelenése, amit termelt nem attól függ, mi a tervezett raszteres (hogy úgy mondjam). Például, a kép ugyanúgy néz ki, függetlenül attól, hogy felhívjuk a képernyőn, vagy nyomtatott a nyomtató. De itt van a felbontás a különböző eszközök és pontosan azért, hogy válassza ki a legmegfelelőbb képet a jelenlegi és használja ezeket a beállításokat.
biClrUsed meghatározza a használt színek számát a táblázatban. Ha ez az érték nulla, akkor a raszter a lehető legnagyobb számú színek, amelyek megengedett érték biBitCount. Ez igaz csak a tömörített képek. Ha biClrUsed nem nulla és biBitCount kevesebb, mint 16, akkor biClrUsed határozza meg az aktuális színek számát a grafikus motor, vagy eszközmeghajtó elérhető. Ha biBitCount nagyobb vagy egyenlő, mint 16, akkor biClrUsed méretét határozza színtáblázatból használják, hogy optimalizálja a jelenlegi rendszer palettán.
biClrImportant - a számos fontos színeket. Meghatározza a színek számát, amelyek szükségesek ahhoz, hogy ábrázolja a kép. Ha ez az érték 0 (mint ahogy általában ez a helyzet), akkor az összes szín tartják fontosnak.







Típusok BMP formátumban

Mindenféle BMP formátumú lehet osztani két típusa van: a raklap és bespalitrovye. Hogy használják ezt a palettát formázni, vagy sem. Megjegyezzük, hogy a paletta is lehet bespalitrovyh formátumokat, de azt nem használják. A bespalitrovyh bmp szín számítjuk közvetlenül a bitek, amelyek a fájlban, egy bizonyos ponton. És minden byte palettán leírja egy vagy több pixel, az értékek bájt (vagy bit) - színpalettaindexet. Először is van egy táblázat, amely összehasonlítja a lehetséges opciókat. Típusú kép (vagy paletta bespalitrovaya) attól függ, hogy hány bit per pixel kap, vagyis az értéke biBitCount BITMAPINFOHEADER szerkezetét.

Palette vagy bespalitrovy méret

példák programok

Szia 1. Képek létrehozása BMP formátumban.
Ez létrehoz egy fekete-fehér kép. A példákban a három funkciót: létrehozása BMP 8, 16 és 24 bit. Adok csak 16 bites.

// Létrehozunk egy képet bmp 16 bites formátumban, mint a 5-5-5, ami egy egyszerű egyszínű
void CreateBmp555 # 40; char * fname WORD szín # 41;
# 123;
FOGANTYÚ hFile;
DWORD RW;
int i, j;

// állapítsa a kívánt szerkezetet
BITMAPFILEHEADER BFH;
BITMAPINFOHEADER bih;
BYTE paletta # 91; 1024 # 93; ; // paletta

// Engedje meg, hogy egy kép mérete 35 x 50 képpont
int szélesség = 35;
int magasság = 50;

memset # 40; Paletta, 0. 1024 # 41; ; // paletta töltjük őket nullákkal
memset # 40; BFH, 0. sizeof # 40; BFH # 41; # 41; ;

BFH. bfType = 0x4D42; // jelezve, hogy ez a BMP „BM”
BFH. bfOffBits = sizeof # 40; BFH # 41; + sizeof # 40; bih # 41; + 1,024; // Palette vesz 1 kB, de nem fogjuk használni
BFH. bfSize = BFH. bfOffBits +
sizeof # 40; szín # 41; * Szélesség * magasság +
Magasság * # 40; # 40; sizeof # 40; szín # 41; * szélesség # 41; % 4 # 41; ; // Számítsuk ki a méret a végső fájl
memset # 40; BiH, 0. sizeof # 40; bih # 41; # 41; ;
bih. biSize = sizeof # 40; bih # 41; ; // Így tesz
bih. biBitCount = 16; // 16 bpp
bih. biClrUsed = 32768; // Használjuk a 5-5-5
bih. biCompression = BI_RGB; // Nincs tömörítés
bih. biHeight = Magasság;
bih. biWidth = szélesség;
bih. Biplanes = 1; // Kell 1
// A többi területen továbbra is 0

hFile = CreateFile # 40; fname, GENERIC_WRITE, 0. NULL. CREATE_ALWAYS, 0. NULL # 41; ;
ha # 40; hFile == INVALID_HANDLE_VALUE # 41;
return;

// Írja címoldalára
WriteFile # 40; hFile, BFH, sizeof # 40; BFH # 41;. RW, NULL # 41; ;
WriteFile # 40; hFile, bih, sizeof # 40; bih # 41;. RW, NULL # 41; ;

// írása paletta
WriteFile # 40; hFile, Palette, 1024. RW, NULL # 41; ;
mert # 40; i = 0; én # 123;
mert # 40; J = 0; j # 123;
WriteFile # 40; hFile, szín, sizeof # 40; szín # 41;. RW, NULL # 41; ;
# 125;

// igazítása határ
WriteFile # 40; hFile, paletta, # 40; sizeof # 40; szín # 41; * szélesség # 41; 4%. RW, NULL # 41; ;
# 125;
CloseHandle # 40; hFile # 41; ;
# 125;

2. példa átalakítása képek a méret a 8 bit (256 szín) a 24 bit.

BOOL Convert256To24 # 40; char * fin, char * fki # 41;
# 123;
BITMAPFILEHEADER BFH;
BITMAPINFOHEADER bih;
int szélesség, magasság;
RGBQUAD paletta # 91; 256 # 93; ;
BYTE * inBuf;
RGBTRIPLE * outBuf;
HANDLE hin, hout;
DWORD RW;
DWORD OffBits;
int i, j;

hin = CreateFile # 40; fin, GENERIC_READ, FILE_SHARE_READ, NULL. OPEN_EXISTING, 0. NULL # 41; ;
ha # 40; Hin == INVALID_HANDLE_VALUE # 41;
return false;

Hout = CreateFile # 40; fki, GENERIC_WRITE, 0. NULL. CREATE_ALWAYS, 0. NULL # 41; ;
ha # 40; Hout == INVALID_HANDLE_VALUE # 41;
# 123;
CloseHandle # 40; Hin # 41; ;
return false;
# 125;

// olvassa ezeket
readfile # 40; Hin BFH, sizeof # 40; BFH # 41;. RW, NULL # 41; ;
readfile # 40; Hin bih, sizeof # 40; bih # 41;. RW, NULL # 41; ;
readfile # 40; Hin Palette, 256 * sizeof # 40; RGBQUAD # 41;. RW, NULL # 41; ;

// állítsa a mutatót az elején a raszteres
SetFilePointer # 40; Hin BFH. bfOffBits. NULL. FILE_BEGIN # 41; ;
Width = bih. biWidth;
Magasság = bih. biHeight;
OffBits = BFH. bfOffBits;

// a memóriát
inBuf = new BYTE # 91; szélesség # 93; ;
outBuf = new RGBTRIPLE # 91; szélesség # 93; ;

// Töltsük meg a szalagcímek
BFH. bfOffBits = sizeof # 40; BFH # 41; + sizeof # 40; bih # 41; ; // nem fogjuk írni a paletta
bih. biBitCount = 24;
BFH. bfSize = BFH. bfOffBits + 4 * szélesség * magasság + Magasság * # 40; Szélesség% 4 # 41; ; // File Size

// A többi változatlan
// Írja címoldalára
WriteFile # 40; Hout BFH, sizeof # 40; BFH # 41;. RW, NULL # 41; ;
WriteFile # 40; Hout bih, sizeof # 40; bih # 41;. RW, NULL # 41; ;

// Kezdjük átalakítani
mert # 40; i = 0; én # 123;
readfile # 40; Hin inBuf, szélesség, RW, NULL # 41; ;
mert # 40; J = 0; j # 123;
outBuf # 91; j # 93;. rgbtRed = paletta # 91; inBuf # 91; j # 93; # 93;. rgbRed;
outBuf # 91; j # 93;. rgbtGreen = paletta # 91; inBuf # 91; j # 93; # 93;. rgbGreen;
outBuf # 91; j # 93;. rgbtBlue = paletta # 91; inBuf # 91; j # 93; # 93;. rgbBlue;
# 125;
WriteFile # 40; Hout outBuf, sizeof # 40; RGBTRIPLE # 41; * Szélesség, RW, NULL # 41; ;

// Írja be a szemetet, hogy összehangolják
WriteFile # 40; HOUT, Palette, Szélesség% 4. RW, NULL # 41; ;
SetFilePointer # 40; Hin # 40; 3 * szélesség # 41; % 4. NULL. FILE_CURRENT # 41; ;
# 125;

törölni inBuf;
törölni outBuf;
CloseHandle # 40; Hin # 41; ;
CloseHandle # 40; Hout # 41; ;
return true;
# 125;

A funkció kell átadni a nevét a forrás és a cél fájlok.




Kapcsolódó cikkek