電子書籍の厳選無料作品が豊富!

LRESULT CALLBACK WndProcScreenCapture(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//MMTIME mm;
//CommonClass Common;
static int id,x,y;
HDC hdc;
PAINTSTRUCT ps;
static HBRUSH hBrush;
HWND desktop;
RECT rc;
static int width,height;
static BITMAPINFO bmpInfo;
static LPDWORD lpPixel;
static HBITMAP hBitmap;
static HDC hMemDC;
FILE *fpt;
int i,j;



//clock_t start,end;
switch (message) {
case WM_CREATE:
desktop=GetDesktopWindow();//デスクトップのハンドルを取得
GetWindowRect(desktop,&rc);//デスクトップのRECT情報を取得
width=rc.right;
height=rc.bottom;

//DIBの情報を設定する
bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth=width;
bmpInfo.bmiHeader.biHeight=height;
bmpInfo.bmiHeader.biPlanes=1;
bmpInfo.bmiHeader.biBitCount=32;
bmpInfo.bmiHeader.biCompression=BI_RGB;

//DIBSection作成
hdc=GetDC(hWnd);
hBitmap=CreateDIBSection(hdc,&bmpInfo,DIB_RGB_COLORS,(void**)&lpPixel,NULL,0);
hMemDC=CreateCompatibleDC(hdc);
SelectObject(hMemDC,hBitmap);
ReleaseDC(hWnd,hdc);

fopen_s(&fpt,"20090715.raw","wb");
fwrite((void**)&lpPixel[0],sizeof(unsigned char),width*height,fpt);

/* DIBSectionにグラデーション描画 */
for (i = 0;i < height;i++) {
for (j = 0;j <width;j++) {


#if 0
/* DIBピクセル列に直接アクセス */
lpPixel[i + j * 256] = (i << 16);
lpPixel[i + (j + 32) * 256] = (i << 8);
lpPixel[i + (j + 64) * 256] = i;
lpPixel[i + (j + 96) * 256] = (i << 16) | (i << 8) | i;

/* GDI経由で描画 */
SetPixel(hMemDC, i, j + 128, RGB(i, 0, 0));
SetPixel(hMemDC, i, j + 128 + 32, RGB(0, i, 0));
SetPixel(hMemDC, i, j + 128 + 64, RGB(0, 0, i));
SetPixel(hMemDC, i, j + 128 + 96, RGB(i, i, i));
#endif

}
}

//fwrite(&(bmpInfo.bmiHeader),sizeof(unsigned char),40,fpt);
//fwrite((void**)&lpPixel,sizeof(unsigned char),width*height,fpt);
//fwrite(&(bmpInfo.bmiColors),sizeof(unsigned char),width*height,fpt);
fclose(fpt);




//スクリーンをDIBSectionにコピー
hdc=GetDC(desktop);
BitBlt(hMemDC,0,0,width,height,hdc,0,0,SRCCOPY);
ReleaseDC(desktop,hdc);


break;
case WM_DESTROY:
//自らlpPixelを解放するべからず
DeleteDC(hMemDC);
DeleteObject(hBitmap); //BMPを削除した時、lpPixelも自動的に解放される
PostQuitMessage(0);
break;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
BitBlt(hdc,0,0,width,height,hMemDC,0,0,SRCCOPY);
EndPaint(hWnd,&ps);
break;

case WM_CHAR:


の様に書いて、windowにキャプチャ画像を表示することは
できたのですが、
この画像の画像情報のピクセルのポインタはどれなのでしょうか?
画像をraw形式でもいいので保存したいのですが、
どうしたら、キャプチャした画像を ファイルとして保存
できますか?//fwrite((void**)&lpPixel,sizeof(unsigned char),width*height,fpt);
ではうまくいきませんでした。

A 回答 (1件)

ポインタは&lpPixel[0]でもいいですが


普通は簡単に
fwrite(lpPixel,sizeof(DWORD),width*height,fpt);
でしょうか(1画素32ビットなのでサイズはDWORDに)
キャプチャした画像を保存するなら

//スクリーンをDIBSectionにコピー
hdc=GetDC(desktop);
BitBlt(hMemDC,0,0,width,height,hdc,0,0,SRCCOPY);
ReleaseDC(desktop,hdc);
//コピーしたデータを保存
fwrite(lpPixel,sizeof(DWORD),width*height,fpt);
の順番になります
    • good
    • 0
この回答へのお礼

fwrite(lpPixel,sizeof(DWORD),width*height,fpt);
でうまくいきました
DWORDだったところに気がつきませんでした
ありがとうございました。
無事解決しました。

お礼日時:2009/07/16 21:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!