PHP размер изображения до минимальной ширины / высоты - PullRequest
2 голосов
/ 27 февраля 2012

Я пытался выяснить, как изменить размер загруженного изображения в PHP, чтобы оно не было меньше заданного размера (650x650). Однако, если пользователь загружает изображение, которое уже меньше моего минимума 650 с обеих сторон, никаких действий предпринимать не нужно.

Сценарий 1 - изображение шириной 2000px на 371px обновляется - размер не изменится, так как 371px уже меньше моего минимума.

Сценарий 2 - изображение размером 2000 на 1823 пикселя загружено - здесь я должен изменить размер изображения как можно ближе к минимуму, но не допускать, чтобы ширина или высота были ниже 650 пикселей.

Вот строки, о которых я думал до сих пор (я использую отличный скрипт simpleImage, чтобы помочь с изменением размера и получением размеров):

$curWidth = $image->getWidth();
$curHeight = $image->getHeight();               
$ratio = $curWidth/$curHeight;

if ($curWidth>$minImageWidth && $curHeight>$minImageHeight)
{
    //both dimensions are above the minimum, so we can try scaling
    if ($curWidth==$curHeight)
    {
        //perfect square :D just resize to what we want
        $image->resize($minImageWidth,$minImageHeight);
    }
    else if ($curWidth>$curHeight)
    {
        //height is shortest, scale that.
        //work out what height to scale to that will allow 
        //width to be at least minImageWidth i.e 650.   
        if ($ratio < 1) 
        {
            $image->resizeToHeight($minImageWidth*$ratio);
        } 
        else 
        {
            $image->resizeToHeight($minImageWidth/$ratio);
        }   
    }
    else
    {
        //width is shortest, so find minimum we can scale to while keeping
        //the height above or equal to the minimum height.
        if ($ratio < 1) 
        {
            $image->resizeToWidth($minImageHeight*$ratio);
        } 
        else 
        {
            $image->resizeToWidth($minImageHeight/$ratio);
        }   
}

Однако это дает мне некоторые странные результаты, время от времени оно все равно будет масштабироваться ниже минимума. Единственная его часть, которая работает, как и ожидалось, - это проверка размеров, превышающих минимальные, - она ​​не масштабирует ничего слишком маленького.

Я думаю, что моя самая большая проблема здесь заключается в том, что я не до конца понимаю взаимосвязь между соотношением сторон изображения и размерами, и как определить, какие размеры я смогу масштабировать, чтобы они превышали мои минимумы. Есть предложения?

Ответы [ 3 ]

4 голосов
/ 27 февраля 2012

попробуйте это:

$curWidth = $image->getWidth();
$curHeight = $image->getHeight();               
$ratio = min($minImageWidth/$curWidth,$minImageHeight/$curHeight);
if ($ratio < 1) {
    $image->resize(floor($ratio*$curWidth),floor($ratio*$curHeight));
}

или это:

$image->maxarea($minImageWidth, $minImageHeight);
2 голосов
/ 27 февраля 2012

Попробуйте это:

$curWidth  = $image->getWidth();
$curHeight = $image->getHeight();               
if ($curWidth>$minImageWidth && $curHeight>$minImageHeight) {
   $ratio = $curWidth/$curHeight;
   $zoom = image_ratio > 1
         ? $minImageHeight / $curHeight
         : $minImageWidth / $curWidth
         ;

   $newWidth = $curWidth * $zoom;
   $newHeight = $curHeight * $zoom;
}
0 голосов
/ 12 октября 2017

Этот фрагмент generic вычисляет минимальный размер изображения, но только если оба размера больше минимального размера.

list($width, $height) = getimagesize($image_dir); // Generic width and height of image

// Define minimum size for image
$min_width = 700;  // Example minimum width
$min_height = 500; // Example minimum height

// Only scale if the image is larger than the minimum size 
if ($width > $min_width && $height > $min_height) {

    // Determine the ratio which the image should be scaled with
    $ratio = $min_height/$min_width < $height/$width ? $min_height/$height : $min_width/$width;

    // Set new size
    $new_width = $width * $ratio;
    $new_height = $height * $ratio;

    // Resize image
    # image_resize($image, $new_width, $new_height) // Generic resize function
}

Алгоритм сравнивает минимальное соотношение размеров ($min_height/$min_width) с текущим соотношением размеров изображений ($height/$width).

  1. Если текущее соотношение изображений больше, изображение необходимо масштабировать, чтобы высота равнялась $min_height. Набор $ratio = $height/$min_height.
  2. Если текущий коэффициент изображения меньше, изображение необходимо масштабировать, чтобы ширина была равна $min_width. Набор $ratio = $width/$min_width.

Чтобы получить правильный размер, умножьте ширину и высоту на $ratio.

$new_width = $width * $ratio;
$new_height = $height * $ratio;
...