請問如何擷取螢幕 |
答題得分者是:phototin
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
http://bbs.openfind.com.tw/cgi-bin/x_list?VAL=4016138530&BOARD=tw.bbs.comp.language&DISPLEN=15&NO=91&SORTBY=0 以下的程式碼可以將螢幕的畫面存成圖檔
因為當初是要將此圖檔透過網路傳送
所以關於bmp jpg的設定是傾向將檔案變小而不在乎品質
您可以自己更改相關設定
另外有注意的是
new 出來的記憶體可別忘了釋放
希望對您有用
Graphics::TBitmap* Bitmap=new Graphics::TBitmap();
TJPEGImage* jp = new TJPEGImage();
int LeftPos = 0;
int TopPos = 0;
int RightPos = Screen->Width;
int BottomPos = Screen->Height;
int RectHeight,RectWidth;
RectWidth = RightPos-LeftPos;
RectHeight = BottomPos-TopPos;
SourceDC = CreateDC("DISPLAY",NULL,NULL,NULL);
DestDC = CreateCompatibleDC(SourceDC);
Bhandle = CreateCompatibleBitmap(SourceDC,RectWidth,RectHeight);
SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,LeftPos,TopPos,SRCCOPY);
Bitmap->Handle = Bhandle;
jp->Grayscale = true;
jp->Assign(Bitmap);
jp->SaveToFile("c:\\fk.jpg");
DeleteDC(DestDC);
ReleaseDC(Bhandle,SourceDC); 有人可以修改嗎?或使用不同方式達成
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
phototin
初階會員 發表:13 回覆:30 積分:29 註冊:2002-06-15 發送簡訊給我 |
我的方式,好像大同小異,參考參考…。
#include "jpeg.hpp" //捉取全螢幕存成bmp格式 Graphics::TBitmap *bmp = new Graphics::TBitmap; bmp->Width = Screen->Width; bmp->Height = Screen->Height; bmp->PixelFormat = pf32bit; HDC hdc = ::GetWindowDC(0); ::BitBlt(bmp->Canvas->Handle, 0, 0, Screen->Width, Screen->Height, hdc, 0, 0, SRCCOPY); //轉成jpg的格式 TJPEGImage *jpg = new TJPEGImage(); jpg->PixelFormat = jf8Bit; jpg->CompressionQuality = 50; //壓縮率 jpg->Assign((TPersistent*)bmp); jpg->Compress(); //存檔 jpg->SaveToFile ("jpg.jpg") ; bmp->SaveToFile("bmp.bmp"); //釋放資源 ReleaseDC(FormServer->Handle, hdc); delete jpg; delete bmp; |
Cooky Kid
初階會員 發表:5 回覆:68 積分:44 註冊:2002-07-11 發送簡訊給我 |
若只要抓取螢幕至Image1元件中的話,用 API 函式也不錯... class TForm1 : public TForm
{
__published: // IDE-managed Components
TStaticText *StaticText1;
TPanel *Panel1;
TImage *Image1;
TToolBar *ToolBar1;
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
}; //---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//先將Form1視窗隱藏起來
Form1->Hide();
//延遲執行,讓系統有時間重繪螢幕
::Sleep(100);
//新建一點陣圖元件,並取得螢幕長寬圖素
Graphics::TBitmap *bitmap = new Graphics::TBitmap;
bitmap->Width = ::GetSystemMetrics(SM_CXSCREEN);
bitmap->Height = ::GetSystemMetrics(SM_CYSCREEN);
//取得螢幕的裝置設備(DC) handle
HDC hDC = ::GetDC(::GetDesktopWindow());
//複製螢幕畫面至點陣圖元件上
::BitBlt(bitmap->Canvas->Handle, 0, 0,
bitmap->Width, bitmap->Height,
hDC, 0, 0,
SRCCOPY);
//再將點陣圖元件指派給Image1元件中
Image1->Picture->Bitmap = bitmap;
//完成抓取全螢幕畫面後,即釋放螢幕的裝置設備(DC) handle
::ReleaseDC(bitmap->Canvas->Handle,hDC);
//釋放點陣圖元件
delete bitmap;
//再將Form1顯現在原來位置上
Form1->Show();
}
//---------------------------------------------------------------------------
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 利用Delphi的Tbitmap控制項抓取螢幕圖像
相信絕大部分電腦愛好者都使用過不同種類的抓圖軟體抓取螢幕圖形。在本文中,作者要向大家介紹的是利用Delphi的TBitmap控制項進行螢幕上任意視窗圖形的抓取。同時文章中還有如何利用Delphi的擴展消息處理功能?Delphi的視窗添加熱鍵和在任務欄上添加圖示的技巧。 程式的主要思路是:當按下?視窗建立的熱鍵後,首先獲得游標所在的視窗的矩形區域,然後建立一個TBitmap物件,將矩形區域複製到TBitmap物件中;最後利用TBitmap的圖像保存Method將複製到TBitmap中的點陣圖保存到磁片中。 程式1是完整的源代碼清單:
在運行程式前,首先要執行以下的步驟:
在Form1中加入一個TsavePictureDialog控制項,將其Name設置?SavePic。
改變Form1的如下屬性:
BorderStyle改變?bsNone;
FormStyle改變?fsStayOnTop;
Visable改變?False。
同時在Project1中的Application.Run語句前加入: Application.ShowMainForm := False;?了直觀顯示,還可以將Form1的Cursor屬性設置?crHandPoint。 unit Unit1; interface uses Windows, Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ExtCtrls,Menus,ExtDlgs,ClipBrd,ShellApi; const
WM_ICWM_USER 100; type
TForm1 = class(TForm)
SavePic: TSavePictureDialog;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
Private
//熱鍵消息處理函數
procedure WMHOTKEY(var Message:TMessage);message WM_HOTKEY;
//任務欄消息處理函數
procedure WMBarIcon(var Message:TMessage);message WM_ICONMESSAGE;
public
end; procedure CaptureControl;
var
Form1: TForm1;
tmpBitmap:TBitmap;
iBitmapValide:Boolean;
implementation
{$R *.DFM} procedure CaptureControl;
var
iTempWnd,iMeHwnd,iDC:LongWord;
tyRect :TRect;
tpRect : TPoint;
iWidth,iHeight:integer;
begin
//獲得游標位置
GetCursorPos(tpRect); //獲得游標所在位置的窗口控制碼
iMeHwnd:=WindowFromPoint(tpRect); //獲得視窗的矩形區域
GetWindowRect(iMeHwnd,tyRect); //獲得桌面窗口的控制碼
iTempWnd:=GetDesktopWindow;
iDC:=GetDC(iTempWnd);
iWidth:=tyRect.Right-tyRect.Left;
iHeight:=tyRect.Bottom-tyRect.Top; //建立點陣圖
tmpBitmap:=TBitmap.Create;
iBitmapValide:=True;
tmpBitmap.Width := iWidth;
tmpBitmap.Height := iHeight; //複製視窗矩形區域到點陣圖中
Bitblt(tmpBitmap.Canvas.Handle,0,0,iWidth,iHeight,iDC,tyRect.Left,tyRect.Top,SRCCOPY);
ReleaseDC(iTempWnd,iDC);
Form1.Visible := True; //使Form1覆蓋游標所在的窗口矩形
Form1.Left := tyRect.Left;
Form1.Top := tyRect.Top;
Form1.Width := iWidth;
Form1.Height := iHeight; tyRect.Left:=0;
tyRect.Right := iWidth;
tyRect.Top:=0;
tyRect.Bottom:=iHeight; //將點陣圖繪製到Form1的Canvas中
Form1.Canvas.Draw(0,0,tmpBitmap); //圍繞Form1畫出3個相素的紅色邊框
Frame3D(Form1.Canvas,tyRect,clRed,clRed,3);
end; //回應熱鍵,進行抓圖
procedure TForm1.WMHOTKEY(var Message:TMessage);
begin
if iBitmapValide then
begin
tmpBitmap.FreeImage;
tmpBitmap.Free;
iBitmapValide:=False;
end; CaptureControl;
end; procedure TForm1.WMBarIcon (var Message:TMessage);
begin
if ((Message.LParam = WM_RBUTTONDOWN)or (Message.LParam = WM_LBUTTONDOWN)) then
//在任務欄圖示上按下滑鼠鍵退出
close;
end; procedure TForm1.FormCreate(Sender: TObject);
var
lpData:PNotifyIconData;
begin
//註冊熱鍵?Ctrl Shift A
RegisterHotKey(Form1.handle,0,MOD_SHIFT OR MOD_CONTROL,65);
//在任務欄上建立圖示
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;
lpData.Wnd := Form1.Handle;
lpData.hIcon := Form1.Icon.Handle;
lpData.uCallbackMessage := WM_ICONMESSAGE;
lpData.uID :=0;
lpData.szTip := '螢幕捕捉';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_ADD,lpData);
dispose(lpData);
end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
lpData:PNotifyIconData;
begin
//退出時刪除任務欄圖示
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;
lpData.Wnd := Form1.Handle;
lpData.hIcon := Form1.Icon.Handle;
lpData.uCallbackMessage := WM_ICONMESSAGE;
lpData.uID :=0;
lpData.szTip := '螢幕捕捉';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_DELETE,lpData);
dispose(lpData); //退出時登出窗口熱鍵
UnRegisterHotKey(Form1.Handle,0);
if iBitmapValide then
begin
tmpBitmap.FreeImage;
tmpBitmap.Free;
iBitmapValide:=False;
end;
end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
//按下滑鼠左鍵保存視窗圖像
if (Button=mbLeft)then
with SavePic do
begin
DefaultExt := 'Bmp';
Execute;
if FileName<>'' then
tmpBitmap.SaveToFile(FileName);
end; //保存完圖像後刪除點陣圖
tmpBitmap.FreeImage;
tmpBitmap.Free;
iBitmapValide:=False;
Form1.Visible := False;
end; end. 按F9鍵運行程式,將游標移動到任意視窗上按下熱鍵Ctrl Shift A,則游標所在視窗被捕捉下來(同時被捕捉區域被紅色邊框框住作?標識)。在框內按下滑鼠左鍵就可以保存點陣圖圖像。這個程式也可以用來捕捉功能表。 同時程式也可以將圖像發送到剪貼板中,只要將上面程式中Form1的OnMouseUp事件置換?下面的程式段就可以了(程式2):
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
MyFormat : Word;
AData : THandle;
APalette : HPALETTE;
begin
if (Button=mbLeft)then
//按下滑鼠左鍵將tmpBitmap中的內容發送的剪貼板
begin
tmpBitmap.SaveToClipBoardFormat(MyFormat,AData,APalette);
ClipBoard.SetAsHandle(MyFormat,AData);
end; tmpBitmap.FreeImage;
tmpBitmap.Free;
iBitmapValide:=False;
Form1.Visible := False;
end; 以上的程式在Windows95,Delphi4.0下運行通過。
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |