2009-12-02 3 views
1

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

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

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

ответ

0

Это, кажется, получить работу ...

$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); 
      } 
    } 
+0

Некоторые комментарии или объяснение было бы полезно, чтобы понять логику и условия – Philipp

5

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

When source image is wider When source image is taller When aspect ratios are same

После кода, полученного из Crop-To-Fit an Image Using 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