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;
Функция захватывает весь экран (или окно, если оно предоставлено) и сохраняет его в виде JPEG-изображения. Она использует функцию GetDC для получения контекста устройства для окна, затем создает битмап (TBitmap) и использует BitBlt для копирования содержимого окна в него. Наконец, она присваивает битмап к объекту TJPEGImage и устанавливает качество сжатия.
Метод использует функцию Windows API keybd_event для имитации события Print Screen (PrtScn). Затем открывает буфер обмена и устанавливает формат данных на CF_DIB (Device Independent Bitmap). Функция GetClipBoardData получает данные битмапа, которые затем загружаются в контроле изображения с помощью метода LoadFromClipboardFormat.
Метод 3
functionCreateWindowBitmap(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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.