Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.13;
Скачать: CL | DM;

Вниз

Помогите. Формула размеров 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 вся ветка

Текущий архив: 2003.10.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
1-40488
plyaznik
2003-10-02 12:38
2003.10.13
помогайте, мастера


3-40242
GSV_
2003-09-24 10:51
2003.10.13
ADOCommand.Execute: сколько RecordsAffected


9-40228
APanyovin
2003-04-10 11:02
2003.10.13
Оптимальное хранилище для динамических массивов


4-40727
Saracin
2003-08-11 14:40
2003.10.13
Как сделать так чтобы все сообщения, которые приходят окну ...


3-40277
Виктор
2003-09-20 23:53
2003.10.13
ADOQuery и DateTime