BITMAP-DIB変換

[戻る]
高橋 2003/10/29(水) 20:18:05
サンプルを調べえていて見つけたソースを以下に示します。
私は描画画像(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 2003/10/29(水) 22:19:27
このソースはMFCを使ってないね
引数のHWNDは正しく渡せる?

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

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

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

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

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

古いスレッドには追加発言できません。