• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

FireMonkey. Графика. Делаем скриншот любого контрола

Lomanu4 Оффлайн

Lomanu4

Команда форума
Администратор
Сообщения
1,164
Симпатии
222
Баллы
155
VK
Программа будет делать:
  • Снимок любых элементов управления, которые находятся в контейнере «layoutSource: TLayout» (верхняя половина формы);
  • Отображать его в «imgDest: TImage» (Нижняя половина формы);
  • Сохранять полученный скриншот в файл «screenshot.png».
каждого элемента управления есть метод, который позволяет отрисовать себя и всех потомков на указанной канве:
Код:
procedure PaintTo(const ACanvas: TCanvas; const ADestRect: TRectF; const AParent: TFmxObject = nil);
  • ACanvas — Канва, на которой необходимо произвести отрисовку
  • ADestRect — Область отрисовки. Обратите внимание, что выводимое изображение будет подгоняться под эту область.
  • AParent (не обязательное) — Если вы хотите получить изображение в рамках другого контейнера, то нужно указать это.
План получения скриншота следующий:
  1. Код:
    procedure TForm51.ActionMakeScreenshotExecute(Sender: TObject);
    [LIST][*]var[/LIST]
    [LIST][*]  BitmapBuffer: TBitmap;[/LIST]
    [LIST][*]  SourceRect: TRectF;[/LIST]
    [LIST][*]begin[/LIST]
    [LIST][*]  // Фиксируем размер снимаемой области[/LIST]
    [LIST][*]  SourceRect := TRectF.Create(0, 0, layoutSource.Width, layoutSource.Height);[/LIST]
    [LIST][*]  // Создаем временный буфер для получения скриншота[/LIST]
    [LIST][*]  BitmapBuffer := TBitmap.Create(Round(SourceRect.Width), Round(SourceRect.Height));[/LIST]
    [LIST][*]  try[/LIST]
    [LIST][*]    // Переводим канву в режим отрисовки - начинаем процесс отрисовки сцены[/LIST]
    [LIST][*]    if BitmapBuffer.Canvas.BeginScene then[/LIST]
    [LIST][*]      try[/LIST]
    [LIST][*]        // Говорим контролу отрисовать себя в канве нашего буфера в указанной области[/LIST]
    [LIST][*]        layoutSource.PaintTo(BitmapBuffer.Canvas, SourceRect);[/LIST]
    [LIST][*]      finally[/LIST]
    [LIST][*]        // Завершаем процесс отрисовки, заканчивая формируемую сцену[/LIST]
    [LIST][*]        BitmapBuffer.Canvas.EndScene;[/LIST]
    [LIST][*]      end;[/LIST]
    [LIST][*]    imgDest.Bitmap.Assign(BitmapBuffer);[/LIST]
    [LIST][*]    BitmapBuffer.SaveToFile('./screenshot.png');[/LIST]
    [LIST][*]  finally[/LIST]
    [LIST][*]    FreeAndNil(BitmapBuffer);[/LIST]
    [LIST][*]  end;[/LIST]
    [LIST][*]end;
[/LIST]
Если вы хотите вывести только один контрол, нужно вызывать метод TControl.PaintTo для того контрола, для которого вы хотите получить скриншот (не забыв про размеры SourceRect).
Результат работы примера представлен ниже:

Файл проекта можно скачать тут: [dl] http://fire-monkey.ru/index.php?app=core&module=attach&section=attach&attach_id=13 [/dl]
 
Вверх Снизу