Delphi World - Функции для работы с объектом типа TImage
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Функции для работы с объектом типа TImage

Автор: VID
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Функции для работы с объектом типа TImage

Модуль ImgTools предоставляет функции для работы с изображениями,
в частности для работы с визуальным объектом типа TImage.

Function FitBestSize - Подбор оптимального размера рисунка,
в соответствии с областью на которой он расположен
Function CenterImage - Центрирование рисунка в области, на которой он расположен
Function SetImageSize - Процентное изменение размера рисунка

Каждая функция возвращает результат типа TImageSizeParams;
type TImageSizeParams = record
OldImageWidth - ширина рисунка до преобразований
OldImageHeight - высота рисунка до преобразований
OldImageLeft - позиция X рисунка до преобразований
OldImageTop - позиция Y рисунка до преобразований
NewImageWidth - ширина рисунка после преобразований
NewImageHeight - высота рисунка после преобразований
NewImageLeft - позиция X рисунка после преобразований
NewImageTop - позиция Y рисунка после преобразований
NewImageSizePercent - размер рисунка в процентах после преобразования,
от размера рисунка до преобразования
end;

Зависимости: ExtCtrls
Автор:       VID, vidsnap@mail.ru, ICQ:132234868, Махачкала
Copyright:   VID
Дата:        05 мая 2002 г.
***************************************************** }

unit ImgTools;

interface

uses ExtCtrls;

type
  TImageSizeParams = record
    OldImgWidth, OldImgHeight, OldImageLeft, OldImageTop,
      NewImgWidth, NewImgHeight, NewImageLeft, NewImageTop,
      NewImgSizePercent: Integer;
  end;

type
  TTimeState = (tsBefore, tsAfter);

function FitBestSize(Img: TImage): TImageSizeParams;
function CenterImage(Img: TImage): TImageSizeParams;
function SetImageSize(Img: TImage; SizePercent: Integer): TImageSizeParams;

var
  ImageSizeParams: TImageSizeParams;

implementation

//Обнуление полей переменной типа TImageSizeParams

function ClearImageSizeParams: TImageSizeParams;
begin
  Result.OldImgWidth := 0;
  Result.OldImgHeight := 0;
  Result.OldImageLeft := 0;
  Result.OldImageTop := 0;
  Result.NewImgWidth := 0;
  Result.NewImgHeight := 0;
  Result.NewImageLeft := 0;
  Result.NewImageTop := 0;
  Result.NewImgSizePercent := 0;
end;

//Получение параметров рисунка до и после преобразований

function GetImageSizeParams(Img: TImage; TimeState: TTimeState):
  TImageSizeParams;
begin
  if img = nil then
  begin
    result := ClearImageSizeParams;
    ImageSizeParams := Result;
    exit;
  end;
  if TimeState = tsBefore then
  begin
    ImageSizeParams := ClearImageSizeParams;
    result.OldImgWidth := img.Width;
    Result.OldImgHeight := img.Height;
    result.OldImageLeft := img.Left;
    result.OldImageTop := img.Top;
  end;
  if TimeState = tsAfter then
  begin
    Result := ImageSizeParams;
    Result.NewImgWidth := img.Width;
    Result.NewImgHeight := img.Height;
    result.NewImageLeft := img.Left;
    result.NewImageTop := img.Top;
    Result.NewImgSizePercent := Round(Result.NewImgWidth / Result.OldImgWidth *
      100);
  end;
  ImageSizeParams := Result;
end;

//Подбор оптимального размера рисунка, в соответствии с областью на которой он расположен

function FitBestSize(Img: Timage): TImageSizeParams;
var
  h, w, i, x, y: Integer;
  K, b, a: Double;
begin
  if Img = nil then
    exit;
  try
    Result := ClearImageSizeParams;
    Img.AutoSize := True;
    Img.AutoSize := False;
    GetImageSizeParams(Img, tsBefore);
    h := img.picture.Height;
    w := img.picture.Width;
    i := 0;
    repeat
      x := img.Parent.clientwidth - w;
      y := img.Parent.clientheight - h;
      i := i + 1;
      k := w / h;
      if y < x then
      begin
        b := y;
        h := h + Round(b);
        a := H * k - W;
        w := w + Round(a);
      end;
      if y >= x then
      begin
        a := x;
        w := w + Round(a);
        b := (w / k) - H;
        h := h + Round(b);
      end;
    until (w < img.Parent.width) or (h < img.Parent.height) or (i >= 2);
    img.Stretch := true;
    img.Width := w;
    img.height := h;
    Result := GetImageSizeParams(Img, tsAfter);
  except
  end;
end;

//Центрирование рисунка в области, на которой он расположен

function CenterImage(Img: TImage): TImageSizeParams;
begin
  Result := ClearImageSizeParams;
  if Img = nil then
    exit;
  GetImageSizeParams(img, tsBefore);
  img.left := (Img.parent.Width div 2) - (img.Width div 2);
  img.Top := (Img.parent.Height div 2) - (img.height div 2);
  Result := GetImageSizeParams(img, tsAfter);
end;

//Процентное изменение размера рисунка

function SetImageSize(Img: TImage; SizePercent: Integer): TImageSizeParams;
var
  K: Double;
  nw, nh: Integer;
begin
  Result := ClearImageSizeParams;
  if Img = nil then
    exit;
  if SizePercent < 0 then
    exit;
  Img.AutoSize := True;
  Img.AutoSize := False;
  GetImageSizeParams(img, tsBefore);
  try
    K := img.height / img.width;
  except exit;
  end;
  nw := Round(img.Width * SizePercent / 100);
  nh := round(nw * k);
  img.Stretch := true;
  img.Width := nw;
  img.Height := nh;
  Result := GetImageSizeParams(img, tsAfter);
end;

end.
Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования