Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получение изображения экрана

Delphi , ОС и Железо , Монитор и Экран

Получение изображения экрана

Способ 1

Code:

// В качестве параметров передаются:
// AHandle - хэндл окна, скриншот которого мы хочем получить
// CompressPercent - процент сжатия картинки
// AImage - картинка, в которую будет помещено изображение
// в случае успешного скриншота функция вернет True
{©Drkb v.3(2007): www.drkb.ru}
 
function GetScreenShot(const AHandle: THandle; const CompressPercent: Byte;
var AImage: TJPEGImage): Boolean;
var
fBitmap: TBitmap;
DC: HDC;
Rect: TRect;
begin
Result := False;
if AImage = nil then Exit;
DC := GetDC(AHandle);
if DC <> 0 then
try
   fBitmap := TBitmap.Create;
   try
     if not GetClientRect(AHandle, Rect) then Exit;
     fBitmap.Width := Rect.Right - Rect.Left;
     fBitmap.Height := Rect.Bottom - Rect.Top;
     fBitmap.PixelFormat := pf32bit;
     Result := BitBlt(fBitmap.Canvas.Handle, 0, 0, fBitmap.Width,
       fBitmap.Height, DC, 0, 0, SRCCOPY);
     if not Result then Exit;
     AImage.Assign(fBitmap);
     AImage.CompressionQuality := CompressPercent;
   finally
     fBitmap.Free;
   end;
finally
   ReleaseDC(AHandle, DC);
end;
end;
 
// Пример использования...
procedure TForm1.Button1Click(Sender: TObject);
var
Image: TJPEGImage;
begin
// Скриншот рабочего стола
Image := TJPEGImage.Create;
try
   if GetScreenShot(GetDesktopWindow, 150, Image) then
     Image1.Picture.Assign(Image);
finally
   Image.Free;
end;
// Скриншот нашей формы
Image := TJPEGImage.Create;
try
   if GetScreenShot(Handle, 150, Image) then
     Image2.Picture.Assign(Image);
finally
   Image.Free;
end;
end;

Автор Rouse_

Взято из http://forum.sources.ru

 Способ 2

Code:

keybd_event(VK_SNAPSHOT,1,KEYEVENTF_KEYUP,0);
OpenClipBoard(Form1.handle);
try
SetClipBoardData(CF_DIB,Form1.handle);
vv:=GetClipBoardData(CF_BITMAP);
Image1.Picture.LoadFromClipboardFormat(CF_BITMAP,vv,0);
finally
CloseClipBoard;
EmptyClipBoard;
end;

Автор: Song

Взято из http://forum.sources.ru

Способ 3

Еще один способ получения скриншота окна, на чистом WinApi:

Code:

function CreateWindwowBitmap(Wnd: HWND): HBITMAP;

 
var
R: TRect;
W, H: Integer;
DC, memDC: HDC;
bm, oldBM: HBITMAP;
begin
GetWindowRect(Wnd, R);
W := R.Right - R.Left;
H := R.Bottom - R.Top;
DC := GetWindowDC(Wnd);
memDC := CreateCompatibleDC(DC);
bm := CreateCompatibleBitmap(DC, W, H);
oldBM := SelectObject(memDC, bm);
BitBlt(memDC, 0,0, w, h, DC, 0,0, SRCCOPY);
SelectObject(memDC, oldBM);
DeleteDC(memDC);
DeleteObject(oldBM);
ReleaseDC(Wnd, DC);
Result := bm;
end;

Автор: Krid

Взято из http://forum.sources.ru

Привет! Я переведу текст на русский язык:

Сборник кода Delphi для захвата экрана или изображения окна!

Давайте пройдемся по каждому фрагменту кода и дадим комментарии к тому, что они делают:

Метод 1

function GetScreenShot(AHandle: THandle; CompressPercent: Byte; var AImage: TJPEGImage): Boolean;

Функция захватывает весь экран (или окно, если оно предоставлено) и сохраняет его в виде JPEG-изображения. Она использует функцию GetDC для получения контекста устройства для окна, затем создает битмап (TBitmap) и использует BitBlt для копирования содержимого окна в него. Наконец, она присваивает битмап к объекту TJPEGImage и устанавливает качество сжатия.

Метод 2

keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_KEYUP, 0);
OpenClipBoard(Form1.Handle);
try
  SetClipBoardData(CF_DIB, Form1.Handle);
  vv := GetClipBoardData(CF_BITMAP);
  Image1.Picture.LoadFromClipboardFormat(CF_BITMAP, vv, 0);
finally
  CloseClipBoard;
  EmptyClipBoard;
end;

Метод использует функцию Windows API keybd_event для имитации события Print Screen (PrtScn). Затем открывает буфер обмена и устанавливает формат данных на CF_DIB (Device Independent Bitmap). Функция GetClipBoardData получает данные битмапа, которые затем загружаются в контроле изображения с помощью метода LoadFromClipboardFormat.

Метод 3

function CreateWindowBitmap(Wnd: HWND): HBITMAP;

Функция захватывает содержимое окна и возвращает его в виде битмапа. Она использует функции Windows API GetWindowRect, CreateCompatibleDC, CreateCompatibleBitmap, BitBlt, SelectObject и DeleteObject для достижения этого.

В целом, эти кодовые фрагменты демонстрируют различные способы захвата экрана или изображения окна в Delphi: 1. Метод 1: Использует BitBlt для копирования содержимого окна в битмап, который затем сохраняется в виде JPEG-изображения. 2. Метод 2: Имитация события Print Screen и загрузка полученного битмапа из буфера обмена. 3. Метод 3: Создает совместимый контекст устройства и битмап для окна, копирует его содержимое с помощью BitBlt, и возвращает битмап.

Каждый метод имеет свои преимущества и недостатки, в зависимости от вашей конкретной задачи и ограничений.

Получение изображения экрана - способ получения скриншота окна или рабочего стола в приложении Delphi с использованием функции BitBlt и различных методов.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Монитор и Экран ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:57:08/0.0060310363769531/1