GetDIBits

GetDIBitsは、指定されたハンドルのDDBのピクセルデータ列を指定のメモリ領域に格納するWindowsAPI・・・。

GetDIBits 関数

CreateDIBitmapがDIBからDDBへの変換を行うための関数とすると、このGetDIBitsは逆でDDBからDIBへの変換を行うことができる・・・。

LoadImageで読み込んだDDB"test.bmp"を、ウィンドウ破棄時にDIBに変換して"test2.bmp"として保存する・・・。

LoadImageで"test.bmp"をロードし、

WM_PAINTで表示・・・。

ここまでは破棄処理・・・。

BITMAPINFOのbiも保存するので、わかっている情報は予めセットしておかないといけない・・・。

ピクセルデータ列のところはNULLにして、biのアドレスだけ渡してGetDIBitsを呼ぶ・・・。
そうすると、bi.bmiHeader.biSizeImageにピクセルデータ列のサイズが格納される・・・。

このサイズのメモリを確保・・・。

確保したメモリアドレスとbiを渡して、再びGetDIBitsを呼ぶと、ピクセルデータ列が格納される・・・。

biの項目全てを1回目で入れてくれればいいのだが、どうもそうではないらしくbi.bmiHeaderの大半はセットしておかないといけないみたい・・・。

BITMAPFILEHEADERのbfhのほうにも、情報をセットしておく・・・。

ファイルに書き込む・・・。

残りの破棄処理・・・。

f:id:BG1:20151129173746p:plain

最初、test.bmpだけの状態・・・。

f:id:BG1:20151129173808p:plain

実行して、表示されて、ウィンドウを閉じて、プログラムを終わると、

f:id:BG1:20151129173835p:plain

test2.bmpができている・・・。

f:id:BG1:20151129173903p:plain

左がtest.bmp、右がtest2.bmp・・・。
DIBにして保存されてるのがわかる・・・。

Sample/GetDIBits.cpp at master · bg1bgst333/Sample · GitHub