BYTEとCBitmap間の変換



実はとても简単な事で、结局1つの午后をして、原因は1つの小さい细かい点で、ああ、いつもこの上で负けます.の
まず、CBitmapから抽出した画素データはBYTEタイプに割り当てられ、コードは以下の通りである.
	CBitmap Bmp;// 
	Bmp.LoadBitmap(IDB_BITMAP1);// BMP 
	Bmp.GetBitmap(&bm);   // 
	long sizeByte = bm.bmHeight * bm.bmWidth * 4;  // , 32 , *4, 24 , *3
	BYTE *pBmpBuffer = new BYTE[sizeByte]; 
         memset(pBmpBuffer, 0, sizeByte);// 
	Bmp.GetBitmapBits(sizeByte, pBmpBuffer);// 

 
次にBYTEがCBitmapに変換され、コードは以下の通りです.
CBitmap bkBmp;

CDC *pDC = GetDC();

 long sizeByte = bkHeight * bkWidth * 4;
 bkBmp.CreateCompatibleBitmap(pDC,bkWidth,bkHeight);// , 
 bkBmp.SetBitmapBits(sizeByte,pImg);// 

初期化画像に長い間詰まっていました..自分で定義したCBitmap変数はCBitmapタイプポインタなので、私は
bkBmp->CreateCompatibleBitmap(pDC,bkWidth,bkHeight);

結果はいつも間違っていて、なぜか分かりませんが、変数に変更してからすべて正常になりました.ポインタが初期化できないからだと思います.オブジェクトがないからです.
他の人のやり方では、復元された画像が複雑であれば、BYTEでCBitmapを復元する最も安全な方法は
まずBITMAPINFO変数を定義し、その後この変数を初期化し、ピクチャのファイルヘッダを定義し、次にCreateDIBSectionを使用してBITMAPINFOに基づいて空のビットマップを作成し、memcpyでBYTEの画素データをこの空孔図にコピーし、最後にCBitmap::FromHandleで得られたHBITSMAPタイプ変数をCBitmapタイプに変換する.
この方法では、ヘッダファイルは自分で定義するので、元の画像に基づいて自分で定義することができ、プログラマー自身の権力が大きい.でも、これからはこんな面倒な方法が使えないことを心から祈っています~