Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.008 c
1-40472
Mantor
2003-10-02 13:51
2003.10.13
Dll & Form


1-40440
Pohil
2003-10-02 13:06
2003.10.13
Формат У EXE файла


4-40744
LOX
2003-08-06 16:16
2003.10.13
диалог выбора папок


3-40253
uuu
2003-09-24 12:17
2003.10.13
Найти разницу в днях между двумя датами.


14-40623
Users
2003-09-24 21:59
2003.10.13
Генерация пароля (A-Z, AA, AB, AC, ...)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский