Главная страница
    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.46 MB
Время: 0.008 c
1-40373
ikar
2003-10-01 13:55
2003.10.13
шифрование текстовых файлов XOR


14-40610
Sacred
2003-09-23 21:55
2003.10.13
Пополнение счета!!!


4-40718
acsoft
2003-08-09 16:30
2003.10.13
Как с помощью API нарисовать на форме кнопку?


7-40683
BlackIce
2003-08-01 14:31
2003.10.13
Регистрация драйвера


1-40433
romeo
2003-10-03 01:17
2003.10.13
Создание Undo-Redo





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский