The Nine

The Nine 是一名非常热爱编程以及旅游、心理学的青年,Delphi将是The Nine的主要编程语言,如果您的爱好和The Nine相近,那么请关注,如果您需要与我联系,请点击"发信给作者"我会及时和你联系!

基于Delphi的屏幕抓图技术的实现

(1)抓取屏幕图像的难点有两个:一是如何夺取屏幕的句柄,二是知道屏幕句柄后如何获取屏幕的图像。Borland公司的设计人员用画布(Tcanvas)对象封装了Windows的大部分图形输出功能,可以通过它以更直观的方式和Windows的屏幕打交道,而不必关心令人头疼的Windows API函数。具体程序如下:

procedure TForm1.Timer1Timer(Sender:TObject);//抓取屏幕,并保存到Image控件中
var
 Fullscreen:Tbitmap;
 FullscreenCanvas:TCanvas;
 dc:HDC;
begin
 Fullscreen:=TBitmap.Create; 
 //创建一个BITMAP来存放图象
 Fullscreen.Width:=screen.width;
 Fullscreen.Height:=screen.Height;
 DC:=GetDC(0); //取得屏幕的DC,参数0指的是屏幕
 FullscreenCanvas:=TCanvas.Create; 
 //创建一个CANVAS对象
 FullscreenCanvas.Handle:=DC;
 Fullscreen.Canvas.CopyRect(Rect(0,0,screen.Width,screen.Height),
 fullscreenCanvas,Rect(0,0,Screen.Width,Screen.Height)); 
 //把整个屏幕复制到BITMAP中
 FullscreenCanvas.Free; 
 //释放CANVAS对象
 ReleaseDC(0,DC); //释放DC
 //*******************************
 image1.picture.Bitmap:=fullscreen; //拷贝下的图象赋给IMAGE对象
 image1.Width:=fullscreen.Width;
 image1.Height:=fullscreen.Height;
 fullscreen.free; //释放bitmap
 form1.WindowState:=wsNormal; //复原窗口状态
 form1.show; //显示窗口
 messagebeep(1); //BEEP叫一声,报告图象已经截取好了。
end; 

  (2)Delphi的第三方控件ScreenCapture,它是一个很好的免费的截图控件,可以轻松抓取任意大小(全屏当然行)、屏幕的任何位置,还可以设置所截图像的形状、以及用何种模式截图。下面介绍的是用TcmWindow模式截图,使用非常简单,使用效果可以与著名的抓图软件SnagIt32媲美。

procedure TForm1.BtnStartClick(Sender:TObject);
begin
 ScreenCapture1.start; //开始截图
end;

 //当截取屏幕成功时,此事件发生
 procedure TForm1.ScreenCapture1Capture(Sender:TObject;Bitmap:TBitmap);
begin
 //调整滚动窗口的大小以适应截获图像的大小
 Scrollbox1.HorzScrollBar.Range:= Image1.width;
 Scrollbox1.VertScrollBar.Range:= Image1.height;
end;

procedure TForm1.FormCreate(Sender:TObject);
begin
 //载入entntacp.dll文件
 BtnStart.enabled:= ScreenCapture1.dllavailable;
 //显示版本信息
 caption:= '屏幕抓图软件' + ScreenCapture1.version;
end;

//当没有足够的内存支持截取屏幕时,此事件发生
procedure TForm1.ScreenCapture1Error(Sender:TObject);
begin
 MessageDlg('屏幕截取时发生一个错误!请关闭其他应用程序以获得更多内存资源.', mtError,[mbOK],0);
end;

 //当用户按“Esc”键,即取消屏幕截取时,此事件发生
procedure TForm1.ScreenCapture1UserCancelled(Sender:TObject);
begin
 MessageDlg('用户取消屏幕截取。',mtInformation,[mbOK],0);
end; 

评论
热度(2)

© The Nine | Powered by LOFTER