Функции для работы с объектом типа 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.