Изменение размера изображения (PHP / GD)

Я ищу помощь / предложения по поиску наиболее эффективного способа изменить размер изображения настолько малым, насколько это возможно, используя PHP / GD , сохраняя соотношение сторон исходного изображения, но при условии, что размер измененного изображения больше заданной минимальной ширины & высота.

Например, изображение с измененным размером должно иметь ширину> 400 и высоту> 300, но должно быть как можно ближе к этим размерам при сохранении исходного соотношения сторон.

Таким образом, изображение «ландшафта» будет иметь идеальную высоту 300 или немного большую ширину> 400, а «портретное» изображение будет иметь идеальную ширину 400 или немного большую с высотой> 300 .

Я считаю, что это то, что вы ищете; в частности, изображения в средней колонке:

Когда исходное изображение более широкоеКогда исходное изображение вышеКогда пропорции одинаковы

Следующий код получен из Crop-To-Fit Image с использованием ASP / PHP :

list( $source_image_width, $source_image_height ) = getimagesize( '/path/to/image' ); $target_image_width = 400; $target_image_height = 300; $source_aspect_ratio = $source_image_width / $source_image_height; $target_aspect_ratio = $target_image_width / $target_image_height; if ( $target_aspect_ratio > $source_aspect_ratio ) { // if target is wider compared to source then // we retain ideal width and constrain height $target_image_height = ( int ) ( $target_image_width / $source_aspect_ratio ); } else { // if target is taller (or has same aspect-ratio) compared to source then // we retain ideal height and constrain width $target_image_width = ( int ) ( $target_image_height * $source_aspect_ratio ); } // from here, use GD library functions to resize the image 

Кажется, что эта работа выполнена …

  $data = @getimagesize($image); $o_w = $data[0]; $o_h = $data[1]; $m_w = 400; $m_h = 300; $c_w = $m_w / $o_w; $c_h = $m_h / $o_h; if($o_w == $o_h){ $n_w = ($n_w >= $n_h)?$n_w:$n_h; $n_h = $n_w; } else { if( $c_w > $c_h ) { $n_w = $m_w; $n_h = $o_h * ($n_w/$o_w); } else { $n_h = $m_h; $n_w = $o_w * ($n_h/$o_h); } }