yrbg}bv̊Tvz

rbg}búAWindows3.0ȍ~DIB(device-independent bitmap)ƂtH[}bg`g܂BiȑODDB(device-dependent bitmap)łBj
ȉł̓XN[ifoCXReLXgjƃt@C̃rbg}bv̊{̎rbg}bv֘A̍\̂ȂwKĂ܂B

y{BITMAP̎擾z

XN[ɕ\ꂽnhiHBITMAPjrbg}bv̊{IȏꍇɂBITMAP\̂gAGetObject֐̗lɎg܂B

typedef struct tagBITMAP {	//BITMAP\
	LONG bmType;		//0Ŗ΂ȂȂ
	LONG bmWidth;		//rbg}bv̕(sNZPʂ1ȏ)
	LONG bmHeight;		//rbg}bv̍(sNZPʂ1ȏ)
	LONG bmWidthBytes;	//XL̗̃oCgiWORDPʁEKj
	WORD bmPlanes;		//J[v[̐iʏ1j
	WORD bmBitsPixel;	//sNZ̐F\rbg
	LPVOID bmBits;		//rbgz̈ʒu
} BITMAP;

̒ŏdvȂ̂uJ[v[̐vƁusNZ̐F\rbgvłBƂ̂̓rbg}bv̊{I̓J[tH[}bgłÁA

	yJ[rbgzbmPlanes x bmBitsPixel

Ō܂邩łBJ[rbg1i2^1ŔjA4i2^416FjA8i2^8256FjA16i65536FjA24igD[J[̓tJ[1677FjA32i1677F{j`Ă̎ނAtJ[ɂRGBQUAD܂B

int GetObject(HGDIOBJ hgdiobj,		//OtBbNIuWFNg̃nh
		int cbBuffer,		//[郁[obt@[
		LPVOID lpvObject	//̃obt@[̃AhX
);

rbg}bv̏ꍇ͎̂悤ɏ܂Birbg}bṽnhhBitmapƂāj

	BITMAP\tbm;
	GetObject((HGDIOBJ)hBitmap, sizeof(BITMAP), &bm);

AӂĂ̂́AႦ16F̃rbg}bviJ[rbg4jłǂ݂܂Ƃ̃foCXReLXgő̌^̃rbg}bvɂȂĂ܂ƂłBiBMPViewerŊm߂ĂBj

yrbg}bvt@C̍\z

Ƀrbg}bvt@CĂ݂܂傤B
DIB`̃rbg}bv̓t@C̐擪玟̂悤ȍ\ɂȂĂ܂B

	BITMAPFILEHEADER\
	BITMAPINFO\
	rbgz

2ԖڂBITMAPINFO\̂́ABITMAPINFOHEADER\̂RGBQUAD\̂܂Ƃ߂ĊǗ̂łB

typedef struct tagBITMAPINFO {	// bmi
	BITMAPINFOHEADER	bmiHeader;
	RGBQUAD			bmiColors[1];
} BITMAPINFO;

bmiHeadeŕABITMAPINFOHEADER\̂w肵܂B
bmiColors[1]́ARGBQUAD\̂܂́ADWORD^f[^̔zw肵܂B1ɂȂĂ܂Ȁł24rbgrbg}bvLBITMAPINFOHEADER\̂biClrUsedi4oCg X biClrUsedjL܂B

̂Ƃrbg}bvt@C\́A

	BITMAPFILEHEADER\
	BITMAPINFOHEADER\
	RGBQUARD\
	rbgz

ɂȂĂƌ܂B

yBITMAPFILEHEADEȐڍׁz

t@C̐擪ɗBITMAPFILEHEADER\͎̂̂悤ɒ`Ă܂B

typedef struct tagBITMAPFILEHEADER { // bmfh
	WORD	bfType;
	DWORD	bfSize;
	WORD	bfReserved1;
	WORD	bfReserved2;
	DWORD	bfOffBits;
} BITMAPFILEHEADER;

bfTypeɂ́A'BM'̂QoCg߂Ă܂Bt@Cǂ݂񂾎𒲂ׂ'BM'mFKv܂B
bfSize̓t@C̃TCYłB
bfOffBits̓t@C̐擪rbgz܂ł̃ItZbgl܂B

yBITMAPINFOHEADEȐڍׁz

BITMAPINFOHEADER\͎̂̂悤ɒ`Ă܂B

typedef struct tagBITMAPINFOHEADER{ // bmih
	DWORD  biSize;
	LONG   biWidth;
	LONG   biHeight;
	WORD   biPlanes;
	WORD   biBitCount;
	DWORD  biCompression;
	DWORD  biSizeImage;
	LONG   biXPelsPerMeter;
	LONG   biYPelsPerMeter;
	DWORD  biClrUsed;
	DWORD  biClrImportant;
} BITMAPINFOHEADER;

biSizeɂ́A\̂̑傫܂B
biWidth́Arbg}bv̕B
biHeight́Arbg}bv̍B
biPlaneśAv[̐ł1łȂĂ͂܂B
biBitCount́AsNZ̐F܂B1, 4, 8, 16A24A32̂ꂩłB
biCompressiońAk܂BBI_RGBi0jňkȂBA16A32rbgibiBitCountjrbg}bvłBI_BITFIELDSi3jłKv܂B
biSizeImagéArbg}bvrbg̃TCYBk̎̂ݕKvB
biXPelsPerMeteŕA𑜓x܂B1[g̃sNZB
biYPelsPerMeteŕA𑜓x܂B
biClrUsed́Arbg}bvC[WŎgĂF܂BiLQƁj0biPlanesbiBitCountɂőFӖ܂B
biClrImportant́AC[WŎgĂdvȐF̐܂B0͑SďdvӖ܂B

ALŏqׂBITMAP\̂bmPlanesAbmBitsPixelBITMAPINFOHEADER\̂biPlanesAbiBitCountƕvXłB\̃o[łbiClrUsed2~(biPlanes x biBitCount) = FƂȂ܂B
AWindows95łBITMAPV4HEADERAWindows98łBITMAPV5HEADER`Ă܂B

yRGBQUAD̏ڍׁz

RGBQUAD\̂܂B
biClrUsed0łȂAbiBitCount1Ȃ2A4Ȃ16A8Ȃ256RGBQUAD\̂KvłBtJ[̎RGBQUAD\̂͂܂B܂AbiClrUsed0ȊO̎͂̐RGBQUAD\̂KvłBJ[e[uȂǂƌĂт܂B̓Iɂ́A

BitCount1̏ꍇAmNtH[}bgłA2 RGBQUAD \̂KvłBC[W̓rbg ON/OFF ŕ\Arbg0̏ꍇ͍ŏɒ`Ă RGBQUAD ̒lŁA1̏ꍇ2Ԗڂ̒lŕ\܂B]Ă RGBQUAD lςΗlXȐFɂ2l摜쐬\łB 

BitCount4̏ꍇA16FtH[}bg16 RGBQUAD KvłBC[W RGBQUAD ̉Ԗڂ̐FɂȂ邩̃CfbNXŎA1f̕\ɂ4bitp܂B 

BitCount8̏ꍇA256FtH[}bg256 RGBQUAD KvłB1f̕\ɂ 8bit(1Byte)KvɂȂ鑼 BitCount==4 ̏ꍇƕς܂B

BitCount16̏ꍇA65536FtH[}bgRGBQUAD ͊܂܂܂BC[W16rbg(WORD)ŕ\AWORD œWJꂽƂŏʃrbg͋ł̌5rbg RGB ƕł܂BAk` BI_BITFIELDS ̏ꍇ RGBQUAD ̈ʒuɃJ[}XNƂȂ3 DWORD f[^A΁AԂ̏Ԃŕł邽߁Ã}XNf[^ɊeRGBl肵܂B

BitCount24̏ꍇA1677F̃tJ[摜ł RGBQUAD ͊܂܂܂BBGR ̏ɂꂼ1oCgŕłA3oCg1f\܂B

BitCount32̏ꍇA32rbg(DWORD)܂4oCg1f\ARGBQUAD ͊܂܂܂Bf[^̕т DWORD ɓWJƍŏ1oCgł̌RGB̏ԂŊe1oCgł܂BBYTEf[^ĎQƂ RGBQUAD \̂ƓтɂȂ܂B̃tH[}bg BitCount16̂ƂƓl BI_BITFIELDS w肳ꂽƂ̓J[}XN RGBQUAD ̈ʒuɎw肳܂B 

typedef struct tagRGBQUAD { // rgbq
	BYTE	rgbBlue;
	BYTE	rgbGreen;
	BYTE	rgbRed;
	BYTE	rgbReserved;
} RGBQUAD;


óAꂼA΁AԂ̋\܂B

yrbgzz

RGBQUAD\̂̂Ƃɂ́Arbg}bvf[^܂BEɁAɃf[^Ă܂Bi{gAbvEgbv_Eɂ鎞ɂ͍𕉂̐ɂKv܂Bj
rbgz̃foCXReLXgÃrbg}bvŎ擾ɂGetDIBits()֐gĂB
