Форум: "Media";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];
ВнизПомогите. Формула размеров tumbhaila?! Найти похожие ветки
← →
AlexT1000 (2003-06-11 13:43) [0]Помогите. Торможу .
Нужна формула нахождения размеров превью изображения
т.е . даны размеры битмапа и размеры ректа в котором нужно отрисовать превью данного битмапа.
как получить размеры и 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;
{===================================================================}
← →
MBo (2003-06-11 13:47) [1]в конце новой статьи в LoadPicture есть подобная штука
← →
AlexT1000 (2003-06-11 14:17) [2]твоя формула несколько не то чт омне нужно.
у тебя если битмап меньше имаджа в который необходимо отрисовать превью просто происходит отрисовка всего битмапа на имаже
а мне нужно ,чтобы при этом размеры битмапа увеличивались до границ имаджа
вся загвоздка как раз в этом . вот что у меня получилось из твоей фомулы
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;
← →
jel (2003-06-11 14:31) [3]Может быть проще использовать StretchBlt если есть размеры и битмапа и ректа?
Или нужно непременно рассчитывать фактор масштабирования?
← →
AlexT1000 (2003-06-11 14:36) [4]нужно рассчитывать фактор
Вот формула Очень похожая на правду
{===========================================================}
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;
{===================================================================}
← →
CyberStorm (2003-06-15 13:04) [5]Че тут сложного :-), сначала вычисляешь отношения вертикального и горизонтального размеров поля Preview к соответствующим размерам битмапа, затем выбираешь наименьший коеффициент из полученных и используешь его для расчетов размеров битмап в поле Preview.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c