線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1836
推到 Plurk!
推到 Facebook!

如何截取螢幕畫面並存成jpg檔

答題得分者是:Zard
andy7200
一般會員


發表:6
回覆:6
積分:2
註冊:2004-09-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-10 10:23:19 IP:163.29.xxx.xxx 未訂閱
我的程式是一個show Chart 的程式. 如果我要把目前在螢幕上的程式畫面存成圖片檔,該怎麼做? 我希望是按一下鍵盤的F1就可以把圖片存進c:\\picture 內.我參考anpino大大的程式如下,但不知道如何著手,第一,這個寫法須要元件盤的那些物件或是怎麼設定Properties和Events? 第二,要如何將我的需求加入這個程式內?  謝謝!    anpino's code:    void CaptureScreen(const TSavePictureDialog *SavPicDlg, const TImage *IMGdes, const TImage *IMGsur) {   String lc_strNewFilePath,lc_strFileType;   TJPEGImage *lc_jpgJpegBuf = NULL;      // 擷取畫面   IMGdes->Canvas->CopyRect(IMGdes->BoundsRect,From1->Canvas,IMGsur->BoundsRect);      // 存檔   SavPicDlg->InitialDir = GetCurrentDir();   if(SavPicDlg->Execute())   {        lc_strFileType = ExtractFileExt(Form1->SavPicDlg->FileName);     lc_strNewFilePath = SavPicDlg->FileName;        if(lc_strFileType == "")     {          lc_strNewFilePath = Form1->SavPicDlg->FileName + ".bmp";       lc_strFileType = ".bmp";        }        if(lc_strFileType == ".jpg" || lc_strFileType == ".jpeg" || lc_strFileType == ".JPG" || lc_strFileType == ".JPEG")     {          lc_jpgJpegBuf = new TJPEGImage () ;       lc_jpgJpegBuf->Assign(IMGdes->Picture->Bitmap);       lc_jpgJpegBuf->CompressionQuality=90;       lc_jpgJpegBuf->SaveToFile(lc_strNewFilePath);       delete lc_jpgJpegBuf ;       lc_jpgJpegBuf = NULL;        }     else if(lc_strFileType == ".bmp" || lc_strFileType == ".BMP")     {         IMGdes->Picture->Bitmap->SaveToFile(lc_strNewFilePath);        }     else     {          Application->MessageBox("This file type is not allow.", "Load File", MB_OK);     }      } }  
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-10 13:06:25 IP:210.243.xxx.xxx 未訂閱
給你一個範例
//---------------------------------------------------------------------------    #include 
#include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int iScreenWidth, iScreenHeight;    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  Image1->Visible = FALSE;
  // 取得螢幕大小
  iScreenWidth = GetSystemMetrics(SM_CXSCREEN);
  iScreenHeight = GetSystemMetrics(SM_CYSCREEN);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Image1->Width = iScreenWidth;
  Image1->Height = iScreenHeight;
  // 把螢幕影像畫在Image1上
  BitBlt(Image1->Canvas->Handle, 0, 0, iScreenWidth, iScreenHeight, GetDC(0), 0, 0, SRCCOPY);      // 利用 TJPEGImage 轉為 JPEG檔
  TJPEGImage* jpeg = new TJPEGImage;
  jpeg->Assign(Image1->Picture->Bitmap);
  jpeg->SaveToFile("c:\\1.jpg");
}
//---------------------------------------------------------------------------
andy7200
一般會員


發表:6
回覆:6
積分:2
註冊:2004-09-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-11 11:20:18 IP:163.29.xxx.xxx 未訂閱
請問 Zard 大大: Image1 和 BitBlt 是從那裡來的? 不好意思喔,小弟是初學者...
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-11 12:12:11 IP:211.23.xxx.xxx 未訂閱
引言: 請問 Zard 大大: Image1 和 BitBlt 是從那裡來的? 不好意思喔,小弟是初學者...
Image1是TImage元件(在元件的Additional那頁), 要Run我給你範例, 請在你的Form上放上個TImage元件, 並命名為Image1. 而BitBlt是Windows API(宣告在WinGDI.h裡), 函式詳細內容查一下MSND就有了
andy7200
一般會員


發表:6
回覆:6
積分:2
註冊:2004-09-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-12 09:17:55 IP:163.29.xxx.xxx 未訂閱
感謝感謝! 我照作然後compile的結果出現 Unit1.cpp(18): E2451 Undefined symbol 'iScreenHeight' Unit1.cpp(17): E2451 Undefined symbol 'iScreenWidth' 請問這樣是出了什麼問題呢?
Londer
一般會員


發表:5
回覆:32
積分:7
註冊:2003-01-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-12 09:36:39 IP:211.22.xxx.xxx 未訂閱
用 F1 當熱鍵似乎不太適合,建議加個輔助鍵(如 Ctrl + F1),給您範例如下:    
Unit1.h 檔內容
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:        // IDE-managed Components
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
private:        // User declarations
public:                // User declarations
        void __fastcall OnHotKey(TWMHotKey& HotKeyMsg);
        BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_HOTKEY,TWMHotKey,OnHotKey)
        END_MESSAGE_MAP(TForm)
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif    Unit1.cpp 檔內容
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
#include 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 ::RegisterHotKey(Handle,VK_F1,MOD_CONTROL,VK_F1);//登錄 Ctrl F1 熱鍵
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
 ::UnregisterHotKey(Handle,VK_F1);//取消先前登錄的 Ctrl F1 熱鍵
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnHotKey(TWMHotKey& HotKeyMsg)
{
 if(HotKeyMsg.HotKey==VK_F1) //判斷是否為自己所設之熱鍵 F1
 {
  Graphics::TBitmap *tmp=new Graphics::TBitmap; // 宣告一點陣圖暫存用
  tmp->Width=Screen->Width; // 將圖片設為跟螢幕一樣寬
  tmp->Height=Screen->Height; // 將圖片設為跟螢幕一樣高
  BitBlt(tmp->Canvas->Handle, 0, 0, Screen->Width, Screen->Height, GetDC(0), 0, 0, SRCCOPY); //抓螢幕      //以下部份可用您上面給的方式帶入,請自行修改^^
  TJPEGImage* jpeg = new TJPEGImage; // 宣告一 JPEG 圖存檔用
  jpeg->Assign(tmp); // 將所抓取的暫存圖指入
  jpeg->CompressionQuality=80; //設定 Jpeg 的壓縮品質
  jpeg->SaveToFile("c:\\1.jpg"); // 儲存
  delete jpge;//刪除動態宣告之 jpeg
  delete tmp;//刪除動態宣告之 tmp 
 }
}
不用多放任何的元件即可執行,試試看吧 < >< > 發表人 - Londer 於 2004/11/12 09:43:19
Londer
一般會員


發表:5
回覆:32
積分:7
註冊:2003-01-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-12 09:40:57 IP:211.22.xxx.xxx 未訂閱
引言: 感謝感謝! 我照作然後compile的結果出現 Unit1.cpp(18): E2451 Undefined symbol 'iScreenHeight' Unit1.cpp(17): E2451 Undefined symbol 'iScreenWidth' 請問這樣是出了什麼問題呢?
Zard 大大給的範例中的最上面 int iScreenWidth, iScreenHeight; 您肯定漏打了
系統時間:2024-11-23 5:24:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!