Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

01.01.2007
{ **** 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.