![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите. Формула размеров tumbhaila?!
AlexT1000 © (2003-06-11 13:43:00)Помогите. Торможу .
Нужна формула нахождения размеров превью изображения
т.е . даны размеры битмапа и размеры ректа в котором нужно отрисовать превью данного битмапа.
как получить размеры и scale пропорционального превью для данного битмапа. моя функция работает некорректно
W, H - ширина высота имаджа куда будет отрисован превью
Wi,Hi- ширина высота битмапа из для которого нужно построить превью
dstw,dsth - высота ширина превью
result - scale превью
function ScaleImg(W,H,Wi,Hi:integer;Var Size : TSize):single;
Var dstw,dsth : integer;
begin
if(Wi>Hi)then begin
dstw:=W;
dsth:=round(W*(Hi/Wi));
if(Hi>H)then begin
dsth:=H;
dstw:=round(H*(Wi/Hi));
end;
end else begin
dsth:=H;
dstw:=round(H*(Wi/Hi));
if (Wi<=W) and (Wi <> Hi) then begin
dstw:=W;
( W*(Hi/Wi)Помогите. Торможу .
Нужна формула нахождения размеров превью изображения
т.е . даны размеры битмапа и размеры ректа в котором нужно отрисовать превью данного битмапа.
как получить размеры и scale пропорционального превью для данного битмапа. моя функция работает некорректно
W, H - ширина высота имаджа куда будет отрисован превью
Wi,Hi- ширина высота битмапа из для которого нужно построить превью
dstw,dsth - высота ширина превью
result - scale превью
function ScaleImg(W,H,Wi,Hi:integer;Var Size : TSize):single;
Var dstw,dsth : integer;
begin
if(Wi>Hi)then begin
dstw:=W;
dsth:=round(W*(Hi/Wi));
if(Hi>H)then begin
dsth:=H;
dstw:=round(H*(Wi/Hi));
end;
end else begin
dsth:=H;
dstw:=round(H*(Wi/Hi));
if (Wi<=W) and (Wi <> Hi) then begin
dstw:=W;
dsth:=round(W*(Hi/Wi));
end;
end;
Result := dstw / Wi ;
Size.CX := dstw;
Size.CY := dsth;
end;
{===================================================================}
CyberStorm (2003-06-15 13:04:00) [1]
Че тут сложного :-), сначала вычисляешь отношения вертикального и горизонтального размеров поля Preview к соответствующим размерам битмапа, затем выбираешь наименьший коеффициент из полученных и используешь его для расчетов размеров битмап в поле Preview.
AlexT1000 (2003-06-11 14:36:00) [2]нужно рассчитывать фактор
Вот формула Очень похожая на правду
{===========================================================}
function ScaleImg(W,H,Wi,Hi:integer;Var Size : TSize):single;
Var dstw,dsth : integer;
ScaleX,ScaleY : single;
begin
ScaleX := W / Wi;
ScaleY := H / Hi;
if ScaleX < ScaleY then begin
dstH := MulDiv(Hi, W, Wi);
dstW := MulDiv(Wi, W, Wi)
end else begin
dstW := MulDiv(Wi, H, Hi);
( Hi, H, Hi)нужно рассчитывать фактор
Вот формула Очень похожая на правду
{===========================================================}
function ScaleImg(W,H,Wi,Hi:integer;Var Size : TSize):single;
Var dstw,dsth : integer;
ScaleX,ScaleY : single;
begin
ScaleX := W / Wi;
ScaleY := H / Hi;
if ScaleX < ScaleY then begin
dstH := MulDiv(Hi, W, Wi);
dstW := MulDiv(Wi, W, Wi)
end else begin
dstW := MulDiv(Wi, H, Hi);
dstH := MulDiv(Hi, H, Hi);
end;
Result := dstw / Wi ;
Size.CX := dstw;
Size.CY := dsth;
end;
{===================================================================}
jel (2003-06-11 14:31:00) [3]
Может быть проще использовать StretchBlt если есть размеры и битмапа и ректа?
Или нужно непременно рассчитывать фактор масштабирования?
AlexT1000 (2003-06-11 14:17:00) [4]твоя формула несколько не то чт омне нужно.
у тебя если битмап меньше имаджа в который необходимо отрисовать превью просто происходит отрисовка всего битмапа на имаже
а мне нужно ,чтобы при этом размеры битмапа увеличивались до границ имаджа
вся загвоздка как раз в этом . вот что у меня получилось из твоей фомулы
function ScaleImg(W,H,Wi,Hi:integer;Var Size : TSize):single;
Var R : Trect;dstw,dsth : integer;
ScaleX,ScaleY : single;
begin
ScaleX := Wi / W;
ScaleY := Hi / H;
if ScaleX > ScaleY then
if ScaleX > 1 then begin
dstw := W;
dsth := Round(Hi / ScaleX);
end else begin СЛАБОЕ ЗВЕНО!
dsth := Hi;
dstW := Wi;
end
else begin
if ScaleY > 1 then begin
dsth := H;
dstW := Round(Wi / ScaleY);
end else begin СЛАБОЕ ЗВЕНО!
dsth := Hi;
dstW := Wi;
end;
( Result * Wi)твоя формула несколько не то чт омне нужно.
у тебя если битмап меньше имаджа в который необходимо отрисовать превью просто происходит отрисовка всего битмапа на имаже
а мне нужно ,чтобы при этом размеры битмапа увеличивались до границ имаджа
вся загвоздка как раз в этом . вот что у меня получилось из твоей фомулы
function ScaleImg(W,H,Wi,Hi:integer;Var Size : TSize):single;
Var R : Trect;dstw,dsth : integer;
ScaleX,ScaleY : single;
begin
ScaleX := Wi / W;
ScaleY := Hi / H;
if ScaleX > ScaleY then
if ScaleX > 1 then begin
dstw := W;
dsth := Round(Hi / ScaleX);
end else begin СЛАБОЕ ЗВЕНО!
dsth := Hi;
dstW := Wi;
end
else begin
if ScaleY > 1 then begin
dsth := H;
dstW := Round(Wi / ScaleY);
end else begin СЛАБОЕ ЗВЕНО!
dsth := Hi;
dstW := Wi;
end;
end;
Result := dstw / Wi ;
Size.CX := dstw;// Trunc(Result * Wi);
Size.CY := dsth;//Trunc(Result * Hi);
end;
MBo (2003-06-11 13:47:00) [5]
в конце новой статьи в LoadPicture есть подобная штука