|
Sleep이 없으면, 1초에 10000번 이상도 캡쳐할 수 있지만.. 이렇게 되면 마우스도 멈춰버리네요. --;
그래서 Sleep를 넣고요.. 1초에 100번 정도 캡쳐가 될 수 있도록 하였습니다.
폼에 있는 컨트롤은 Timer, Button 입니다.
그리고, VGA 카드 통합 보드는 아래 작업을 할때, 더 심각하게 멈춥니다. 이전에 개발했던 프로그램이.. VGA 카드 통합 보드에서는 거의 못쓸 지경이더군요.. -_-a
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HDC hdHandle = GetDC(0);
int itCaptureCount = 0;
bool blNeedClose = false;
TImage *CAPTURE = new TImage(Form1);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
CAPTURE->Width = Screen->Width;
CAPTURE->Height = Screen->Height;
CAPTURE->Picture->Bitmap->PixelFormat = pf24bit;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete CAPTURE;
ReleaseDC(0, hdHandle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Form1->Caption = itCaptureCount;
itCaptureCount = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
while(!blNeedClose) {
CAPTURE->Picture->Bitmap = NULL;
BitBlt(CAPTURE->Canvas->Handle, 0, 0, Screen->Width, Screen->Height,
hdHandle, 0, 0, SRCCOPY);
itCaptureCount ++;
Sleep(10);
Application->ProcessMessages();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
blNeedClose = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
CAPTURE->Picture->SaveToFile("C:\\TEST.BMP");
}
//---------------------------------------------------------------------------
김정모 님이 쓰신 글 :
: 답변감사합니다. 하지만 말씀하신 방법은 이미 알고 있는 내용이구요
: 그저 한번 정도 가져오기에는 무난하지만.. 여러번 반복적으로 가져오려구 하면
: 무쟈게 느리다는것을 아실 수 있으실껍니다.
: 좀더 빠른 방법이 없을까요?
:
:
:
: 하느리 님이 쓰신 글 :
: : 흠날리~ 제가 graphics32 컴포넌트를 사용해 보지를 않아서 그냥 제가 만들어서 사용하는 방법을 올립니다. 제가 사용할 때는 그리 느리지 않았는 것 같은데, 이것보다 더 빠른 것을 원하신다면.... (애구, 할 말이 없네요. -_-a)
: :
: : //---------------------------------------------------------------------------
: : // 화면(CRT)을 그림으로 읽어오는 함수
: : // bmp : 화면을 받을 클래스
: : // area : 캡쳐할 영역
: : // width : 받아올 화면의 너비
: : // height : 〃 높이
: : void __fastcall GetCRT (Graphics::TBitmap *bmp, TRect& area, int width, int height)
: : {
: : bmp->Width = width;
: : bmp->Height = height;
: : HWND desktop = GetDesktopWindow ();
: : HDC dt_dc = GetDC (desktop);
: : SetStretchBltMode (bmp->Canvas->Handle, STRETCH_HALFTONE);
: : StretchBlt (bmp->Canvas->Handle, 0,0, width, height,
: : dt_dc, area.Left, area.Top, area.Right - area.Left, area.Bottom - area.Top, SRCCOPY);
: : ReleaseDC (desktop, dt_dc);
: : }
: : //---------------------------------------------------------------------------
: : // 사용예
: : //---------------------------------------------------------------------------
: : // 아래 예제는 화면전체를 320*240 크기로 가져 오는 것입니다.
: : // 실제 사이즈로 가져 오실려면 320 대신 Screen->Width, 240 대신 Screen->Height를 인자로 GetCRT를 호출하시면 됩니다.
: :
: : Graphics::TBitmap *bmp = new Graphics::TBitmap ();
: : TRect area = TRect (0, 0, Screen->Width, Screen->Height); // 받아올 화면의 영역
: : GetCRT (bmp, area, 320, 240);
: : bmp->SaveToFile ("바탕화면.bmp");
: : bmp->FreeImage ();
: : delete bmp;
: : bmp = NULL;
: : //---------------------------------------------------------------------------
: :
: :
: :
: :
: :
: :
: :
: : 김정모 님이 쓰신 글 :
: : : Image1->Bitmap->Draw(rect, rect, DesktopDC); <-- 이렇게 하면 컴파일시 에러가 발생하는군요
: : :
: : :
: : : 배경화면에서 그림을 가져오려구 하는데
: : : TImage에서는 그냥 bitblt 함수에 Image->Canvas를 넣어주었더니 잘 가져왔습니다.
: : : 하지만 속도가 너무 느려서 Graphics32 Component는 좀 빠를까해서
: : : 바꾸려고 합니다. 그런데 Graphics32 Component에서는
: : : TImage32 Component를 사용하여 바탕화면을 가져오려구 bitblt를 했는데
: : : Canvas->Handle을 주니까 잘 가져오긴 가져오는데 그저 Canvas에 올려놓았을뿐
: : : 제가 저장할수 가 없었습니다.
: : : 좀 이해가 안가실까봐 다시 설명드리면
: : :
: : : 저는 Graphics32 Component를 이용해서 바탕화면을 캡쳐한 후 저장하고 싶습니다.
: : : 그리고 아주 빠른 속도로 하고싶습니다. 저장하는 시간은 문제가 되지 않지만
: : : 바탕화면에서 저장할 수 있는 상태까지 되는데 시간이 너무 오래 걸리더군요
: : : 빠르게 할수 있는 방법이나 위에 설명한 문제에 대한 답을 하시는 분은 해결책좀 알려주시면 감사하겠습니다.
: : :
: : :
: : :
|