BITMAP-DIB変換 – プログラミング – Home

通知
すべてクリア

BITMAP-DIB変換


高橋
 高橋
(@高橋)
ゲスト
結合: 24年前
投稿: 15
Topic starter  

サンプルを調べえていて見つけたソースを以下に示します。
私は描画画像(on draw)をBITMAP-DIB変換したいのですが、
このソースをどこにおけばいいのかが分かりません。
環境はWINXP VC++6.0 、「MFC AppWizard(exe)」SDIです。
どうかご教授ください。
宜しくお願いします。
void saveBMP(HWND hwnd,LPCTSTR lpszFn) {

DWORD dwSize,dwFSize,dwWidth,dwHeight,dwLength;
HANDLE fh;
LPBITMAPFILEHEADER lpHead;
LPBITMAPINFOHEADER lpInfo;
LPBYTE lpBuf,lpPixel;
RECT rec;
HDC hdc,hdcMem;
HBITMAP hBMP,hOld;

GetClientRect(hwnd,&rec); /* クライアント領域取得 */

dwWidth=rec.right;
dwHeight=rec.bottom;

if ((dwWidth*3) % 4==0) /* バッファの1ラインの長さを計算 */
dwLength=dwWidth*3;
else
dwLength=dwWidth*3+(4-(dwWidth*3) % 4);

/* 書き込み用バッファのサイズ計算 */
dwFSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)
+dwLength*dwHeight;

/* バッファ確保とポインタ設定 */
lpBuf=(LPBYTE)GlobalAlloc(GPTR,dwFSize);
lpHead=(LPBITMAPFILEHEADER)lpBuf;
lpInfo=(LPBITMAPINFOHEADER)(lpBuf+sizeof(BITMAPFILEHEADER));
lpPixel=lpBuf+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

/* 24ビットBMPファイルのヘッダ作成 */
lpHead->bfType='M'*256+'B';
lpHead->bfSize=dwFSize;
lpHead->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
lpInfo->biSize=sizeof(BITMAPINFOHEADER);
lpInfo->biWidth=dwWidth;
lpInfo->biHeight=dwHeight;
lpInfo->biPlanes=1;
lpInfo->biBitCount=24;

/* ウインドウのデバイスコンテキスト取得 */
hdc=GetDC(hwnd);
/* ウインドウのデバイスコンテキスト互換のBITMAP作成 */
hBMP=CreateCompatibleBitmap(hdc,dwWidth,dwHeight);

/* BITMAPにウインドウのクライアント領域をコピー */
hdcMem=CreateCompatibleDC(hdc);
hOld=SelectObject(hdcMem,hBMP);
BitBlt(hdcMem,0,0,dwWidth,dwHeight,hdc,0,0,SRCCOPY);
SelectObject(hdcMem,hOld);
GetDIBits(hdc,hBMP,0,dwHeight,lpPixel,(LPBITMAPINFO)
lpInfo,DIB_RGB_COLORS);

ReleaseDC(hwnd,hdc);
DeleteObject(hBMP);
DeleteObject(hdcMem);

/* バッファをファイルに書き出す */
fh=CreateFile
(lpszFn,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(fh,lpBuf,dwFSize,&dwSize,NULL);
CloseHandle(fh);

GlobalFree(lpBuf);

}


引用解決済
トピックタグ
kajiki
 kajiki
(@kajiki)
ゲスト
結合: 22年前
投稿: 19
 

このソースはMFCを使ってないね
引数のHWNDは正しく渡せる?

これは関数としてまとめてあるからどこにおくかより
どのタイミングで呼び出すかが問題なのはわかる?

メニューに『画像を保存』でも用意してそのハンドラで呼び出すか
あるいはそのハンドラ内に直接ソースを書けばよろし


返信引用
SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
 

ていうかこれ、24ビットモード専用なんですけど大丈夫?
GetDIBits()でビットデータをlpPixelに取得してますけど、
それを24ビットに変換するコードは略してるのかな?
書き込みはlpBufってなってるので、何かしらの変換コードがあるはずですよね。
いや、分かってやっているのでしたらいいのですけど一応確認という事で。

GrobalFree(lpBuf)って最後にあるけどGrobalAlloc()がないのでやっぱ略したのかな。


返信引用
高橋
 高橋
(@高橋)
ゲスト
結合: 24年前
投稿: 15
Topic starter  

皆様ありがとうございました。
皆様の助言を参考にします。
MFCで描画した画像をbitmapで保存するサンプルや良い例が載ってあるホームページなど
はありますか?
ご存知の方がいらっしゃいましたら紹介してください。
宜しくお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました