Ф а р м а т м а л ю н к а B M PАрыгінал даступны на сайце Paul Bourke
Загаловак
Загаловак складаецца з наступных палёў. Звярніце ўвагу, што мы мяркуем, што кароткі int складае 2 байта, int 4 байта, і доўгі int 8 байт. Далей мы мяркуем, што парадак байтаў як для тыповых (Intel) машын. Даўжыня загалоўка складае 14 байт. typedef struct { unsigned short int type; /* Magic identifier */ unsigned int size; /* File size in bytes */ unsigned short int reserved1, reserved2; unsigned int offset; /* Offset to image data, bytes */ } HEADER;
Карыснымі палямі ў гэтай структуры з’яўляюцца тып поля (павінна быць “BM”), якое з’яўляецца простай праверкай таго, што гэта, верагодна, будзе законным BMP-файлам, , і поле зрушэння, якое дае колькасць байт да атрымання
Даныя інфармацыі пра выявы, якія вынікаюць далей, складаюць 40 байт у даўжыню, гэта апісана ў структуры, прыведзенай ніжэй.Поля, якія прадстаўляюць найбольшую цікавасць, прадстаўленыя шырынёй і вышынёй малюнка, колькасцю біт на піксель (павінна быць 1, 4, 8 ці 24), лікам плоскасцяў (тут мяркуецца 1) і тыпам сціску (мяркуецца, што тут 0). typedef struct { unsigned int size; /* Header size in bytes */ int width,height; /* Width and height of image */ unsigned short int planes; /* Number of colour planes */ unsigned short int bits; /* Bits per pixel */ unsigned int compression; /* Compression type */ unsigned int imagesize; /* Image size in bytes */ int xresolution,yresolution; /* Pixels per meter */ unsigned int ncolours; /* Number of colours */ unsigned int importantcolours; /* Important colours */ } INFOHEADER;
Ніжэй прыведзены тыпы сціску, якія падтрымліваюцца BMP:
24-бітныя даныя выявы Самыя простыя дадзеныя для чытання – гэта 24-бітныя сапраўдныя каляровыя выявы. У гэтым выпадку даныя выявы вынікаюць адразу пасля загалоўка інфармацыі, гэта значыць няма каляровай палітры. Ён складаецца з трох байт на піксель у парадку b, g, r. Кожны байт дае насычанасць для гэтага каляровага кампанента, 0 для чорнага і 1 для белага (цалкам насычанага). Індэксаваныя даныя пра колерКалі малюнак індэксуецца колерам, то адразу пасля загалоўка інфармацыі з’явіцца табліца з колерамі infoheader.ncolours, кожны па 4 байта. Першыя тры байта адпавядаюць кампанентам b, g, r, апошні байт зарэзерваваны / нявыкарыстаны, але, відавочна, можа прадстаўляць альфа-канал. Для 8-бітных малюнкаў шэрага колеру гэты каляровы індэкс, як правіла, будзе проста рампам шэрага адцення. Калі вы робіце сумы …. тады даўжыня загалоўка плюс даўжыня інфармацыйнага блока плюс 4 разы колькасці колераў палітры, якое павінна адпавядаць зрушэнню дадзеных малюнка. Іншымі словамі Зыходны код
Вось крыніца, прадстаўленая Michael Sweet, BITMAP.H, BITMAP.C, і BMPVIEW.C. І некаторыя прыклады майго кода, parse.c і на прыклад 24-бітны rgb BMP файл для тэставання. Звярніце ўвагу, што ні адзін з гэтых сегментаў кода не будзе апрацоўваць усе тыпы файлаў BMP, у прыватнасці, яны не апрацоўваюць сціснутыя файлы BMP. Яны павінны стаць добрай адпраўной кропкай для сустрэтых варыянтаў і для тых, хто хоча пісаць файлы, сумяшчальныя з BMP. З іншага боку, калі ў вас ёсць ці напісаны лепшы апрацоўшчык BMP, то вы можаце падаць тут заяўку для яго дадання.
Уклад Адама Маеўскага, які запісвае па адным біце ў піксельным файле BMP:
pf1bit_bmp.c.
|