为什么bmp截取到另一个bmp不成功啊。

haochin 2014-06-17 02:37:33
代码是将bmp的相应矩形区域到bmp1上,
但是不成功啊,bmp1是空白的
因为是游戏,所以不能用普通的PrintScree

procedure CaptureScreen(AFileName: string);
const
CAPTUREBLT = $40000000;
var
hdcScreen: HDC;
hdcCompatible: HDC;
bmp,bmp1: TBitmap;
hbmScreen: HBITMAP;
hWnd: THandle;
rGame : TRect;
begin
hdcScreen := CreateDC('DISPLAY', nil, nil, nil);
hdcCompatible := CreateCompatibleDC(hdcScreen);
hbmScreen := CreateCompatibleBitmap(hdcScreen,
GetDeviceCaps(hdcScreen, HORZRES),
GetDeviceCaps(hdcScreen, VERTRES));
SelectObject(hdcCompatible, hbmScreen);
bmp := TBitmap.Create;
bmp1 := TBitmap.Create;
bmp.Handle := hbmScreen;
BitBlt(hdcCompatible,
0, 0,
bmp.Width, bmp.Height,
hdcScreen,
0, 0,
SRCCOPY or CAPTUREBLT);

hWnd := FindWindow(nil, '地下城与勇士');
if hWnd > 0 then
begin
GetWindowRect(hWnd,rGame);

bmp1.Width := rGame.Right - rGame.Left;
bmp1.Height := rGame.Bottom - rGame.Top;

bmp1.Canvas.CopyRect(Rect(0,0,rGame.Right,rGame.Bottom),bmp.Canvas,rGame);

bmp1.SaveToFile(AFileName);
end else
begin
bmp.SaveToFile(AFileName);
end;

bmp.Free;
bmp1.Free;
DeleteDC(hdcScreen);
DeleteDC(hdcCompatible);
end;
...全文
649 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
金卯刀 2014-06-19
  • 打赏
  • 举报
回复
截取用BitBlt试试

procedure CropBitmap(InBitmap, OutBitMap : TBitmap; X, Y, W, H :Integer);
begin
  OutBitMap.PixelFormat := InBitmap.PixelFormat;
  OutBitMap.Width  := W;
  OutBitMap.Height := H;
  BitBlt(OutBitMap.Canvas.Handle, 0, 0, W, H, InBitmap.Canvas.Handle, X, Y, SRCCOPY);
end;
haochin 2014-06-18
  • 打赏
  • 举报
回复
不, 这个截图,可以截到DX游戏的画面。 但是是全屏幕的, 存放在bmp中, 我想在bmp中将游戏部份再截图到bmp1中。 问题的关键在这一段:
  hWnd := FindWindow(nil, '地下城与勇士');
  if hWnd > 0 then
  begin
    GetWindowRect(hWnd,rGame);
 
    bmp1.Width := rGame.Right - rGame.Left;
    bmp1.Height := rGame.Bottom - rGame.Top;
 
    bmp1.Canvas.CopyRect(Rect(0,0,rGame.Right,rGame.Bottom),bmp.Canvas,rGame);
 
    bmp1.SaveToFile(AFileName);
在将bmp中游戏部份截取到bmp1时,没能实现。
haochin 2014-06-18
  • 打赏
  • 举报
回复
引用 4 楼 sz_haitao 的回复:
bmp保存到文件,是有内容的吗? 那就再读回来,再截取?
bmp有空容,直接将bmp保存到文件,是真个屏幕的截图。
haochin 2014-06-18
  • 打赏
  • 举报
回复
引用 5 楼 yc515623876 的回复:
hWnd := FindWindow(nil, '地下城与勇士'); if hWnd > 0 then begin GetWindowRect(hWnd,rGame); bmp1.Width := rGame.Right - rGame.Left; bmp1.Height := rGame.Bottom - rGame.Top; bmp1.Canvas.CopyRect(Rect(0,0,rGame.Right,rGame.Bottom),bmp.Canvas,rGame); bmp1.SaveToFile(AFileName); end else begin bmp.SaveToFile(AFileName); end; 你DebuG下这个代码 看看 rGame的 TRect = packed record case Integer of 0: (Left, Top, Right, Bottom: Longint); 1: (TopLeft, BottomRight: TPoint); end; 这几个参数有没有值
有值的
Andy-88 2014-06-18
  • 打赏
  • 举报
回复
hWnd := FindWindow(nil, '地下城与勇士'); if hWnd > 0 then begin GetWindowRect(hWnd,rGame); bmp1.Width := rGame.Right - rGame.Left; bmp1.Height := rGame.Bottom - rGame.Top; bmp1.Canvas.CopyRect(Rect(0,0,rGame.Right,rGame.Bottom),bmp.Canvas,rGame); bmp1.SaveToFile(AFileName); end else begin bmp.SaveToFile(AFileName); end; 你DebuG下这个代码 看看 rGame的 TRect = packed record case Integer of 0: (Left, Top, Right, Bottom: Longint); 1: (TopLeft, BottomRight: TPoint); end; 这几个参数有没有值
haitao 2014-06-18
  • 打赏
  • 举报
回复
bmp保存到文件,是有内容的吗? 那就再读回来,再截取?
haitao 2014-06-17
  • 打赏
  • 举报
回复
游戏?是不是基于dx的? 那的确与普通窗口程序的做法不同了
mjp1234airen4385 2014-06-17
  • 打赏
  • 举报
回复
游戏就不要想着用这些办法截屏了。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧