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

Angelight

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

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

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

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

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

Спасибо!
 

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

ЗЫ. или все гораздо проще и ты просто пропорции посчитать не можешь?

Полагаю, гораздо проще. Изображение, по ширине либо высоте (по большей стороне) необходимо увеличить до 512 px. К примеру, картинка 200 х 300. Большую сторону (300 px) необходимо увеличить до 512 px, а ширину (в данном случае) также увеличить, пропорционально высоте. В результате, получится изображение 341 х 512. Либо, если большей стороной является ширина изображения - ее увеличиваем до 512 px, а высоту пропорционально "подгоняем", если можно так выразиться. :)
 
пусть первый прямоугольник будет со сторонами 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. Вот на этот минимум тебе и надо умножить стороны.
 
пусть первый прямоугольник будет со сторонами 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;

Задача решена! ЧТД... :)
 
блин, задача решается в три строчки, зачем городить огород??
PHP:
$k = min($fix_size/$width, $fix_size/$height);
$new_width = $width * $k;
$new_height = $height * $k;
 
Angelight, а если заменить $fix_size на $fix_width и $fix_height, то получится ещё более универсальный код. Фиксированные блоки не всегда квадраты.
 
Angelight, а если заменить $fix_size на $fix_width и $fix_height, то получится ещё более универсальный код. Фиксированные блоки не всегда квадраты.

Мне необходимо было изображение "подгонять" по большей стороне до 512 px, если каждая из сторон менее 512 px (изображение большого размера пропорционально уменьшается до 512 px с большей стороны). БОльшая из сторон увеличивается до 512 px, другая (ширина либо высота) пропорционально "подгоняется". В любом случае, будет прямоугольник...
 
кэп как бы намекает нам на то что могут случится например изображения 123 х 123 или 650 х 650 в вашем коде нет проверки на равносторонние картинки меньшего или большего размера от нужного
 
кэп как бы намекает нам на то что могут случится например изображения 123 х 123 или 650 х 650 в вашем коде нет проверки на равносторонние картинки меньшего или большего размера от нужного

А ведь и точно. Проверку на равносторонние картинки упустил. Спасибо за замечание!

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

PHP:
if( $height >= $width )

// а также

if( $width >= $height )

Вроде, теперь правильно... :)
 
При варианте, предложенном Varan'ом, а именно:

PHP:
$k = min($fix_size/$width, $fix_size/$height);
$new_width = $width * $k;
$new_height = $height * $k;

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

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