You are on page 1of 10

Gii thch m ngun file bitmap.cpp M ngun file bitmap.

cpp B qua cc ch th tin bin dch nh #include, #pragma pack cc dng u ca chng trnh, ta bt u vi: typedef struct _MYBMHEAD { unsigned char MN1; unsigned char MN2; unsigned long SizeBM; unsigned short AppS1; unsigned short AppS2; unsigned long OffsetData; unsigned long DBIHeader; unsigned long width; unsigned long height; unsigned short planes; unsigned short sizeofpixel; unsigned long compression; unsigned long rawdata; unsigned long Horizontal; unsigned long Vertical; unsigned long palette; unsigned long important; } MYBMHEAD, *PMYBMHEAD; Lnh ny nh ngha mt cu trc cha thng tin v mt file bitmap tn l _MYBMHEAD v c gi vi mt tn khc l MYBMHEAD v con tr ti kiu cu trc mi c nh ngha ny c gi vi mt ci tn khc l PMYBMHEAD MYBMHEAD tng ng vi _MYBMHEAD PMYBMHEAD tng ng vi _MYBMHEAD* Cc trng trong cu trc _MYBMHEAD bao gm: MN1(magic number-con s k diu) c kiu unsigned char (kiu k t khng du dng 8bit lu tr tng ng vi kiu BYTE trong windows) cha k t nhn din file. Nu cc bn dng cu trc ny c d liu ca mt file bimap (.bmp) th sau khi c nhng byte u tin ca file bitmap th gi tr ca trng ny s l mt s nguyn khng du = 66 tng ng vi m k t B trong bng m ASCII. MN2(magic number-con s k diu) tng t cha k t M m l 77 SizeBM (Size of the BMP file-kch thc ca file bimap) c kiu unsigned long (kiu s nguyn khng du dng 32 bit lu tr) trng ny cha kch thc tht ca file bitmap tnh bng byte (bao gm c phn tiu trn) gi tr ln nht c th lu tr l 2 32 = 4294967296 byte = 4194304 kb = 4096 Mb = 4Gb. AppS1(Application specific-ng dng ch nh) c kiu unsigned short (kiu s nguyn khng du dng 16 bit lu tr) do ng dng to file bitmap tu s dng (trng ny thng thng c gi tr=0) AppS2 tng t nh AppS1 OffsetData (Offset Data- lch ca phn d liu ni cha mng cc pixel) phn ny mnh s gii thch sau. Ngi vit: Langthang1012 cng ng c Vit Trang1

Gii thch m ngun file bitmap.cpp DBIHeader vit nhm ng l phi l DIBHeader (^_^)! (device-independent bitmap nh c lp vi thit b) phn ny cha kch thc ca phn DIBheader. Width- chiu rng ca nh tnh bng pixel Height- chiu cao ca nh tnh bng pixel Planes- s khng gian mu c s dng trong file bitmap (thng thng l 1 v a s nh bitmap ch s dng mt khng gian mu l Red Green Blue ngoi ra cn c rt nhiu khng gian mu khc nh YUV-s dng trong k thut nn d liu video) Sizeofpixel - kch thc tht ca mt pixel tnh bng bit Compression ch nn (thng thng gi tr ny bng 0 hoc 3 ngha l liu khng b nn. Ch nn thng c dng trong cc file nh .jpg gim kch thc lu tr ca file nh cn file bitmap th khng b nn) Rawdata kch thc tht s ca mng cc pixel bao gm c phn m (padding) mnh s ni r sau Horizontal phn gii theo chiu ngang tnh bng pixel/ meter Vertical phn gii theo chiu dc tnh bng pixel/ meter Palette s mu sc trong bng mu Important mu quan trng, 0 c ngha l tt c cc mu u quan trng nh nhau Ok tm li l ni dung ca 1 file bitmap bao gm c 4 phn. Phn u l bitmap header bao gm unsigned char MN1; //1byte unsigned char MN2; //1byte unsigned long SizeBM; //4byte unsigned short AppS1; //2byte unsigned short AppS2; //2byte unsigned long OffsetData; //4byte //Tng cng 14 byte Phn th hai l DIB header gm unsigned long DBIHeader; //4byte unsigned long width; //4byte unsigned long height; //4byte unsigned short planes; //2byte unsigned short sizeofpixel; //2byte unsigned long compression; //4byte unsigned long rawdata; //4byte unsigned long Horizontal; //4byte unsigned long Vertical; //4byte unsigned long palette; //4byte unsigned long important; //4byte //tng cng 40 byte Phn th ba l ni dung ca bng mu (c th c hoc khng) chiu di bin ng tu theo bn lu nh bitmap vi ch no (nh n sc, nh 16 mu, nh 256 mu ,nh 16 triu mu). S byte ca phn th 3 c th tnh c bng cch ly SizeBM-DBIHeader- rawdata-14(byte ca bitmap header) hoc ly OffsetData-DBIHeader-14. Phn th t l ni dung ca d liu bitmap chiu di bin ng. Kch thc ca trng ny c ch ra trong trng rawdata ca phn DIB header. Ngi vit: Langthang1012 cng ng c Vit Trang2

Gii thch m ngun file bitmap.cpp V d: vi mt bc nh kch thc 300pixel chiu rng v 500pixel chiu cao, s dng 3byte lu tr mt pixel (1byte cho mu Red, mt byte cho mu xanh Green, 1byte cho mu xanh bin Blue c th th hin c 16 triu mu). Width=300 Height=500 Sizeofpixel=24 Vy kch thc ca phn th t ny s l 24/8*300*500=450000byte tuy nhin gi tr ca trng rawdata s c th khng bng con s ny l v cn c phn m thm trn mi hng. Phn m l phn d liu c thm vo trn mi hng sao cho s byte trn mi hng phi l bi s ca 4 (l do cho phn m thm ny l v khi nh c ti ln b nh mi dng cn bt u vi mt a ch chia ht cho 4 l yu cu ca cc nh sn xut). ok vy chng ta cn tnh li phn padding ny nh sau: Mi dng c 300pixel vy tng cng c 300*3=900 byte vy phn m s l 900%4=0 vy l chng ta khng cn thm phn m bi v s byte trn mi dng l bi s ca 4 ri vy gi tr ca trng rawdata s l 450000 Vy vi file nh ca chng ta th sao clockmask.bmp

Width=600 Height=423 Sizeofpixel=1 Sizeofpixel=1 vy y l mt bc nh monochrome bitmap (ch s dng mt 1bit lu tr 1pixel v s mu c th th hin c l 2 mu trng-en tng ng vi gi tr 1-0). Vy s byte trn mi dng s l:600/8=75byte => s byte m trn mi hng s l 4-75%4=1 vy mi dng s c thm 1byte vy tng s byte mi dng s l 76byte => tng s byte ca trng dataraw s l 76*423=32148 byte. (l do ti sao mnh li dng monochrome bitmap l v ti u v mt lu tr trn b nh vt l v x l v to hnh bng cho form th cng khng cn g nhiu) OK vy l xong phn l thuyt v file nh Bitmap, cch truy xut thng tin trn file nh bimap. Ch : quan trng ! File nh bitmap c qut t gc di bn tri qua bn phi v t di ln trn (iu ny c ngha l pixel u tin trong mng cha cc pixel l pixel ca gc di tri ca bc Ngi vit: Langthang1012 cng ng c Vit Trang3

Gii thch m ngun file bitmap.cpp nh cn pixel cui cng trong mng cha cc pixel l pixel ca gc trn cng bn phi) hi ngc (@_@)! Ngoi l mt cht: phn bitmap header lun chim 14byte u ca file .bmp tuy nhin phn DIB header khng phi lc no cng l 40byte. Kch thc ca phn ny c th l 1 trong cc gi tr sau: 12 byte 64 byte 40 byte 52 byte 56 byte 108 byte 124 byte Tu vo phin bn cng nh h iu hnh h tr, tuy nhin cc phin bn c kch thc ln hn th u l s m rng t cc phin bn c kch thc nh hn bng cch thm vo cc trng vo pha cui ca cc phin bn trc . Chi tit cc bn c th tra wiki vi t kho l BMP file format (wiki ting anh) hu ht cc kin thc c mnh cp pha trn u c ly ra t trang wiki ny. Tip theo chng ta s tr li vi m ngun ca chng trnh. typedef struct _MYRECT { long left; long top; long right; long bottom; _MYRECT* nextRect; } MYRECT, *PMYRECT; typedef struct _RGNDATAHEADER { unsigned long Size; unsigned long iType; unsigned long nCount; unsigned long nRgnSize; long left; long top; long right; long bottom; } RGNDATAHEADER, *PRGNDATAHEADER; nh ngha hai kiu cu trc l _MYRECT v _RGNDATAHEADER cc kiu ny l mnh nh ngha li theo nh s dng ca mnh ch tht ra hai kiu ny c nh ngha tng t trong file windows.h v vy ng #include< windows.h> vo m ngun n s pht sinh li. Gi chng ta s tm hiu l thuyt v region. Region l g ? Region l mt trong nhng b cng c ho ca window dng trang tr cho giao din ho nh mn hnh, form, my in region cho php gii hn hnh dng hin th cho device context-DC ( tm hiu v cc cng ho khc trn window vui lng tra trn internet y mnh ch i su vo cch s dng region gii hn hnh dng hin th cng nh cu trc ca kiu d liu region). Vy region bao gm nhng g, v cch s dng n ra sao ? Ngi vit: Langthang1012 cng ng c Vit Trang4

Gii thch m ngun file bitmap.cpp D liu ca region bao gm 2 phn: Phn u l region data header (miu t s lc v region) phn ny gm: Size- kch thc tnh bng byte ca phn tiu (l chnh phn ny thng l 32) iType- kiu ca region trng ny nn t gi tr l 0 tng ng vi hng RDH_RECTANGLES nCount- s hnh ch nht cn to hnh region. nRgnSize- kch thc ca b m cn cha nhng hnh ch nht trn, nu khng bit bn c th gi tr l 0. Left- to gc tri ca hnh ch nht bao quanh ton b ci region ny Top- to gc trn ca hnh ch nht bao quanh ton b ci region ny Right- to gc phi ca hnh ch nht bao quanh ton b ci region ny Bottom- to gc di ca hnh ch nht bao quanh ton b ci region ny Phn th hai l region data (mng cc hnh ch nht to nn region) phn ny c kch thc bin ng tu theo s phc tp ca region. V d vi region kch thc 10x10 vi phn mu trng l l phn s b gii hn (phn nm ngoi vng v) phn mu en l phn nm trong vng v theo hnh sau

Nhng hnh ch nht cu to nn region s l nhng hnh ch nht mnh ng khung bng nhng hnh ch nht vi cc mu khc nhau nh hnh di y

Ngi vit: Langthang1012 cng ng c Vit

Trang5

Gii thch m ngun file bitmap.cpp

Vy cu trc ca region trn s nh sau: Size=32 iType=0 nCount=11 nRgnSize=0 left=0 top=0 right=9 bottom=9 3 1 6 3 2 3 6 4 1 4 6 5 1 5 2 6 3 5 6 6 7 5 9 6 1 6 3 7 6 6 7 7 8 6 9 7 2 7 5 8 6 7 9 8 Mi trong bng tng ng vi 4 byte v cc hnh ch nht s c lu tr theo th t t trn xung v t tri qua phi Cu trc _MYRECT dng miu t cc hnh ch nht ny trong windows.h cng c mt cu trc _RECT dng miu t cc hnh ch nht ny. Mnh ch miu t li cu trc ny v thm vo mt thnh phn l con tr tr n mt ci _MYRECT khc s dng cho mc ch ring chi tit mnh s gii thch sau. Ok chi tit v cch lu tr ca file bitmap v cu trc ca region r rng by gi chng ta s i vo chng trnh chnh-hm main(). y mnh c tnh vit hm main() sau cc hm ph khng phi khai bo nguyn mu hm (hi li ) v vy hi kh nhn mt cht cc bn thng cm. int count=0; PMYRECT* rgArr; unsigned char pad[1024]; unsigned char* dataline; MYBMHEAD h; Ngi vit: Langthang1012 cng ng c Vit Trang6

Gii thch m ngun file bitmap.cpp Khai bo trn ln lt l. Mt bin m tn l count Mt con tr tr n mt con tr kiu MYRECT (con tr hai cp) Mt b m 1024 byte Mt con tr kiu unsigned char(tng ng vi kiu BYTE trong windows.h) tn dataline Mt bin h kiu MYBMHEAD FILE * pFile=fopen("clockmask.bmp","rb"); M mt file tn l clockmask.bmp vi ch c file nh phn (rb-readbinary) if(sizeof(MYBMHEAD)!=fread(&h,1,sizeof(MYBMHEAD),pFile)) return 1; c thng tin t file lu vo bin h, c 1 byte s byte cn c bng vi kch thc ca kiu MYBMHEAD. Nu c thnh cng hm fread s tr v s byte c c con s ny bng vi s m byte m chng ta yu cu c trong i s th 3 ca hm, nu s tr v ny khc chng t qu trnh c pht sinh ra li (c th l file rng, cng c th l c ht file). Nu c li th tr v 1 v kt thc chng trnh if(h.sizeofpixel!=1) return 1; nu khng phi l nh n sc th kt thc chng trnh BitmapInfomation(&h); Gi hm BitmapInfomation in ra cc thng tin v bitmap (hm ny n gin cc bn t nghin cu) dataline=new unsigned char[h.rawdata/h.height]; unsigned long temp=h.OffsetData-sizeof(MYBMHEAD); if(temp>0) fread(pad,1,temp,pFile); rgArr=new PMYRECT[h.height]; m lnh trn ln lt l: to mt b m c kch thc bng kch thc ca mt hng d liu trong bng cc pixel trong file nh. Tnh s byte t lc kt thc kt thc phn bitmap header v DIB header cho n phn d liu thc t ca mng cc pixel c lu tr. Nu ln hn 0 chng t c bng mu (phn th 3 trong file bimap c ni n trn) hoc phn DIB header phin bn mi hn (c s trng nhiu hn). Chng ta bit l file nh n sc ch s dng 1 bit lu tr 1 pixel (1-mu trng 0 mu en) v vy chng ta khng cn n bng mu, cn nu phn DIB header c phin bn mi hn (s trng nhiu hn, s byte lu tr ln hn) nhng do phin bn mi hn k tha t phin bn c hn nn d liu c vo bin h ca chng ta vn ng nn cng vic ca chng ta l ch c nhng phn d tha ny v qung n i cho ln c tip theo l c d liu ca bng lu tr cc pixcel (phn th 4 nh c cp trn). To mt mng cc con tr kiu MYRECT c s phn t ng bng chiu cao (tnh bng pixel) ca nh for(unsigned long i=0;i<h.height;i++) { rgArr[i]=NULL; temp=fread(dataline,1,h.rawdata/h.height,pFile); Ngi vit: Langthang1012 cng ng c Vit Trang7

Gii thch m ngun file bitmap.cpp if(temp!=h.rawdata/h.height) return 1; count+=scanLine(dataline,temp,rgArr[i]); } Vng lp ny thc hin c tng dng pixel trong file nh v truyn cho hm scanLine x l. Ok gi chng ta s tm hiu hm scanLine hm chnh trong ng dng ny.

Hm scanLine
tng l nh sau bn qut trn tng dng pixel trong file nh v gp cc nhm cc bit 1 li tnh ta ca tng nhm (mi nhm tng ng vi hnh ch nht trong region). cho d hiu mnh s ly v d vi bc nh 10*10 nh trn (vi file nh clockmask.bmp cng tng t nh v clockmask.bmp c kch thc qu ln 600x423 nn nu ly v d bng cch m t cch chy ca chng trnh th chng ta s khng mt ).

Vi hnh trn th ma trn cc pixcel s nh sau (bao gm c phn m trn mi hng) 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 (mi tng ng vi 1 bit ch l phn m) Do file nh bitmap lu ngc t di ln trn nn mnh nh s li t di ln trn. Vng lp for s chy t 0-9 qut tng hng ca nh. Hai dng u dng 0 v dng khng c pixel mu trng (bit 1) nn mnh s b qua Ngi vit: Langthang1012 cng ng c Vit

0 0 0 0 0 0 0 0 0 0 6

0 0 0 0 0 0 0 0 0 0 7

s 1

Trang8

Gii thch m ngun file bitmap.cpp vng lp th 3 (dng th 2) dataline s cha mt mng sau 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Mng ny c truyn vo hm scanLine trong i s th nht, i s th hai l kch thc ca mng tnh bng byte ( v d ny i s th 2 c gi tr l 4 v mng ch c kch thc 4 byte), i s th 3 l mt con tr kiu MYRECT dng lu tr cc hnh ch nht trong mt hng theo kiu mt danh sch lin kt n c s phn t bin ng v s hnh ch nht (nhm cc bit 1) trong hng khng bit trc c. Vng lp th nht trong hm scanLine c tng byte trong mng, vng lp lng trong vng lp th nht c tng bit trong byte bng cch AND byte va c c t mng vi 0x80 (128 trong h thp phn) nu kt qu qu php AND ny khc 0 chng t c bit 1 u byte v ngc li. Kt thc mi ln lp trong vng lp con byte s c dch tri 1 bit. Tip tc nh vy cho n ht 8 bit ca 1 byte V d vi 8 bit u ca mng trn Ln lp th nht 0 0 1 1 1 0 1 1 And (temp&scaner) 1 0 0 0 0 0 0 0 = 0 0 0 0 0 0 0 0 Kt qu bng 0 => bit u tin ca byte =0 Kt thc ln lp th nht ta dch tri 1 bit (temp=temp<<1) => gi tr ca temp s l: 0 1 1 1 0 1 1 0 Lm tng t cho ln lp th 2 Ch : Nu tm thy mt bit 1 m trc cha c bit 1 no c th to mt bin MYRECT mi v ly con tr rgArr[i] tr ti bin MYRECT mi to ny gn gi tr cho trng left ca bin mi to l s th t ca phn t ni cha bit1 ny, right= left+1 (khng gn gi tr g cho top v bottom s gn sau). Nu tm thy mt bit 1 m trc c bit 1 tc l 2 bit 1 ny ln tip nhau vy ch cn cng gi tr right thm 1 n v. Nu tm thy mt bit 0 m trc c bit 1 tc l nhm cc bit1 kt thc ta ch cn cht bin MYRECT li. Sau khi kt thc hm scanLine ta s c c danh sch lin kt sau (i vi d liu l mng trn): rgArr[2] => 2 0 5 0 => 6 0 9 0 => NULL Khi kt thc hm scanLine n s tr v s hnh ch nht m n tm thy v d ny kt qu tr v l 2 V sau khi kt thc vng lp th nht trong hm main() mng rgArr s cha cc gi tr sau rgArr[0] => NULL rgArr[1] => NULL rgArr[2] => 2 0 5 0 => 6 0 9 0 => NULL rgArr[3] => 1 0 3 0 => 6 0 7 0 => 8 0 9 0 => NULL rgArr[4] => 1 0 2 0 => 3 0 6 0 => 7 0 9 0 => NULL rgArr[5] => 1 0 6 0 => NULL rgArr[6] => 2 0 6 0 => NULL rgArr[7] => 3 0 6 0 => NULL rgArr[8] => 3 0 6 0 => NULL Ngi vit: Langthang1012 cng ng c Vit Trang9

Gii thch m ngun file bitmap.cpp rgArr[9] => NULL Ok gi chng ta c c tt c cc hnh ch nht cu to nn Region (ch c iu thiu ta top v bottom m thi :P ). Cng vic in vo ta top v bottom s do vng lp th 2 trong hm main() thc hin. vng lp th 2 tng i n gin, n ch thc hin cng vic l in vo gi tr top v bottom cho mi phn t trong danh sch lin kt v lu vo file kt qu nn cc bn t nghin cu tuy nhin cc bn nn ch hai vn sau: Vn th nht: chng ta qut nh t di ln trn nn kt qu l mng rgArr cng c chiu nh vy. Trong khi region li yu cu lu cc hnh ch nht theo chiu t trn xung vn ny c gii quyt trong vng lp th 2 trong hm main(). Vn th hai l: chng ta qut theo kiu tng dng v vy kt qu lu trong file resuit.rgn (xin li vit sai chnh t ng l phi l result-kt qu h h) s l Size=32 iType=0 nCount=11 nRgnSize=0 left=0 top=0 right=9 bottom=9 3 1 6 2 3 2 6 3 2 3 6 4 1 4 6 5 1 5 2 6 3 5 6 6 7 5 9 6 1 6 3 7 6 6 7 7 8 6 9 7 2 7 5 8 6 7 9 8 (mi trong bng l 1 gi tr 4 byte) i ln 1 hnh ch nht so vi kt qu ti u (bng trang 6) cc bn hy tm ra thut gii ti u./

Ngi vit: Langthang1012 cng ng c Vit

Trang10

You might also like