Функции для работы с объектом типа TImage

=== Функции для работы с объектом типа TImage ===
{ **** 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
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.
Source: http://delphibase.endimus.com
ID: 01264