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

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

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

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


person AutomaticDrone    schedule 02.12.2009    source источник


Ответы (2)


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

Когда исходное изображение шире Когда исходное изображение выше  При одинаковом соотношении сторон

Следующий код получен из Crop-To -Подгонка изображения с помощью 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
person Salman A    schedule 02.12.2009

Кажется, работа сделана ...

    $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);
            }
    }
person AutomaticDrone    schedule 02.12.2009
comment
Некоторые комментарии или пояснения будут полезны для понимания логики и условий. - person Philipp; 18.08.2016