Пропорциональное изменение размеров изображения - получение эскизов

Тема в разделе "Delphi", создана пользователем WinHack, 28 ноя 2016.

  1. WinHack
    Идея для создания Вашего приложения: создание формы, на которой пользователь может видеть открытые формы и передвигаться по ним, отображая их эскизы в диалоговом окне.

    Идея подобна "Quick Tabs": особенность браузера IE7.

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

    Создание Эскиза

    Ниже находится блок кода, чтобы получить изображение формы (Form1), используя метод GetFormImage. В результате TBitmap будет изменен до максимальной ширины эскиза (200px) и высоты (150px). Изменение размеров сохраняет пропорции.

    В результате изображение будет отображено в управлении TImage по имени Image1

    Код:
    const
      maxWidth = 200;
      maxHeight = 150;
    var
      thumbnail : TBitmap;
      thumbRect : TRect;
    begin
      thumbnail := Form1.GetFormImage;
      try
        thumbRect.Left := 0;
        thumbRect.Top := 0;
    
        // пропорциональное изменение размеров
        if thumbnail.Width > thumbnail.Height then
        begin
          thumbRect.Right := maxWidth;
          thumbRect.Bottom := (maxWidth * thumbnail.Height) div thumbnail.Width;
        end
        else
        begin
          thumbRect.Bottom := maxHeight;
          thumbRect.Right := (maxHeight * thumbnail.Width) div thumbnail.Height;
        end;
    
        thumbnail.Canvas.StretchDraw(thumbRect, thumbnail) ;
    
    // Изменение размеров изображения
        thumbnail.Width := thumbRect.Right;
        thumbnail.Height := thumbRect.Bottom;
    
        // отображение в управлении TImage
        Image1.Picture.Assign(thumbnail) ;
      finally
        thumbnail.Free;
      end;
    end;
    Обратите внимание: GetFormImage только копирует клиентскую область формы. Если Вам нужно получить полный снимок формы, включая ее границы, нужен будет другой подход. Но это в следующий раз!