Пропорциональное увеличение изображения

Angelight

Новичок
Добрый день!

Никак не возьму в толк систему расчета, которая помогает пропорционально увеличивать изображение.

К примеру, картинка: 279 x 350. Большую часть необходимо довести до 512 пикселов. Ширина увеличивается пропорционально высоте. В результате, должно быть изображение следующих размеров: 409 х 512.

Либо, исходное изображение 200 х 300. Большую часть увеличиваем до 512 пикселов. Результат: 341 х 512.
По ширине: 300 х 200. Большую часть (ширина) увеличиваем до 512 пикселов. Результат: 512 х 341.

Научите? Боюсь, что самостоятельно не справлюсь. Гугл не спешит помочь, к сожалению...

Спасибо!
 

Angelight

Новичок
Спасибо за ссылки! Но, честно говоря, чтобы все эти формулы "переварить", необходимо иметь соответствующие математические познания. Явно что-то из высшей математики... :)

ЗЫ. или все гораздо проще и ты просто пропорции посчитать не можешь?
Полагаю, гораздо проще. Изображение, по ширине либо высоте (по большей стороне) необходимо увеличить до 512 px. К примеру, картинка 200 х 300. Большую сторону (300 px) необходимо увеличить до 512 px, а ширину (в данном случае) также увеличить, пропорционально высоте. В результате, получится изображение 341 х 512. Либо, если большей стороной является ширина изображения - ее увеличиваем до 512 px, а высоту пропорционально "подгоняем", если можно так выразиться. :)
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
пусть первый прямоугольник будет со сторонами a1 и b1. Прямоугольник в который надо вписать - a2 и b2 (в примере a2=b2=512)

Тебе надо узнать во сколько раз надо увеличить стороны первого прямоугольника, назовем это коеффициентом увеличения k.
Таким образом получаем систему уравнений
a1 * k <= a2
b1 * k <= b2

или
k <= a2 / a1
k <= b2 / b1

другими словами, k - это наименьшее из a2/a1 и b2/b1. Вот на этот минимум тебе и надо умножить стороны.
 

Angelight

Новичок
пусть первый прямоугольник будет со сторонами a1 и b1. Прямоугольник в который надо вписать - a2 и b2 (в примере a2=b2=512)

Тебе надо узнать во сколько раз надо увеличить стороны первого прямоугольника, назовем это коеффициентом увеличения k.
Таким образом получаем систему уравнений
a1 * k <= a2
b1 * k <= b2

или
k <= a2 / a1
k <= b2 / b1

другими словами, k - это наименьшее из a2/a1 и b2/b1. Вот на этот минимум тебе и надо умножить стороны.
Благодарю! Вдумывался, вычислял, и в итоге пришел к следующему решению:

PHP:
$fix_size = 512;

// ширина изображения
$width = 200;
// высота изображения
$height = 300;

if( $height > $width )
 {
     // коэффициент
     $k = $fix_size / $height;
     $new_w = round( $width * $k );
     $new_h = $fix_size;
 }
elseif( $width > $height )
 {
     // коэффициент
     $k = $fix_size / $width;
     $new_w = $fix_size;
     $new_h = round( $height * $k );
 }
В результате, изображения "подгоняются" под нужный размер:

1. Исходное: 200 х 300;
Результат: 341 x 512;

2. Исходное: 300 х 200;
Результат: 512 x 341;

Задача решена! ЧТД... :)
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
блин, задача решается в три строчки, зачем городить огород??
PHP:
$k = min($fix_size/$width, $fix_size/$height);
$new_width = $width * $k;
$new_height = $height * $k;
 

jonjonson

Охренеть
Angelight, а если заменить $fix_size на $fix_width и $fix_height, то получится ещё более универсальный код. Фиксированные блоки не всегда квадраты.
 

Angelight

Новичок
Angelight, а если заменить $fix_size на $fix_width и $fix_height, то получится ещё более универсальный код. Фиксированные блоки не всегда квадраты.
Мне необходимо было изображение "подгонять" по большей стороне до 512 px, если каждая из сторон менее 512 px (изображение большого размера пропорционально уменьшается до 512 px с большей стороны). БОльшая из сторон увеличивается до 512 px, другая (ширина либо высота) пропорционально "подгоняется". В любом случае, будет прямоугольник...
 

Lakr

Новичок
кэп как бы намекает нам на то что могут случится например изображения 123 х 123 или 650 х 650 в вашем коде нет проверки на равносторонние картинки меньшего или большего размера от нужного
 

Angelight

Новичок
кэп как бы намекает нам на то что могут случится например изображения 123 х 123 или 650 х 650 в вашем коде нет проверки на равносторонние картинки меньшего или большего размера от нужного
А ведь и точно. Проверку на равносторонние картинки упустил. Спасибо за замечание!

Слегка изменил свой код выше, подкорректировав проверку в условиях if...else:

PHP:
if( $height >= $width )

// а также

if( $width >= $height )
Вроде, теперь правильно... :)
 

Angelight

Новичок
При варианте, предложенном Varan'ом, а именно:

PHP:
$k = min($fix_size/$width, $fix_size/$height);
$new_width = $width * $k;
$new_height = $height * $k;
Не требуются проверки на равносторонние изображения. Что уже хорошо и меньше возни. :)
 

Lakr

Новичок
я извиняюсь а что будет в $k ? $k = min($fix_size/$width, $fix_size/$height); если стороны будут равны и на что будет множится $width и $height дальше? в мане я не нашел как будет действовать данная функция в таких условиях, и лично я бы предварительно всё таки проверочку делал
 

Alien85

I like my cat
я извиняюсь а что будет в $k ? $k = min($fix_size/$width, $fix_size/$height); если стороны будут равны и на что будет множится $width и $height дальше? в мане я не нашел как будет действовать данная функция в таких условиях, и лично я бы предварительно всё таки проверочку делал
что меньше: 520 или 520?
 

Alien85

I like my cat
Lakr, вы что за ахинею пишите? включите голову уже!
какая разница, равны они или нет!

min( 520, 520 ); // выдаст 520 - это ОЧЕВИДНО!!!
 
Сверху