php изменить размер изображения zoomcrop без рамки (логика) - PullRequest
1 голос
/ 15 сентября 2011

У меня есть класс для работы с изображениями, я хочу создавать изображения, которые всегда заполняют всю новую ширину и высоту, чтобы не было границ / сплошной цвет фона, я просто не могу понять, как я могу заставить его всегда заполнять высоту и ширину ( поддержание соотношения сторон загруженного изображения ), если ширина И высота изображения меньше, чем новый размер изображения.

точно так же, как zoomcrop (zc = 1) из класса phpthumb (я посмотрел код из него, но я не мог имитировать поведение)

    public function resizeCrop($newwidth, $newheight) {

                        ...

            $x = $this->getX();
            $y = $this->getY();

            ...

            else if ($x < $newwidth && $y < $newheight)
            {

            // logic ??

            }

    }

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Вы должны убедиться, что меньшая (относительно пропорций исходного изображения и стороны контейнера) сторона увеличена до максимума.Посмотрите на этот код:

public function resizeCrop($newwidth, $newheight) {
                ...
    $x = $this->getX();
    $y = $this->getY();

    // old images width will fit
    if(($x / $y) < ($newwidth/$newheight)){
        $scale = $newwidth/$x;
        $newX = 0;
        $newY = - ($scale * $y - $newheight) / 2;

    // else old image's height will fit
    }else{
        $scale = $newheight/$y;
        $newX = - ($scale * $x - $newwidth) / 2;
        $newY = 0;
    }

    // new image
    $dest = imagecreatetruecolor($newwidth, $newheight);

    // now use imagecopyresampled
    imagecopyresampled($dest, $src, $newX, $newY, 0, 0, $scale * $x, $scale * $y, $x, $y);
    return $dest;
}

Обновление: Исправлена ​​функция.Теперь он работает отлично, я проверил его на своем компьютере разработчика.

1 голос
/ 15 сентября 2011

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

В первом случае вы можете сравнить процентное изменение ширины и высоты соответственно, а затем использовать больший процент в качестве множителя для обоих измерений. Для изображения размером 1 x 1, которое вы хотите поместить в область размером 2 x 3 часа и сохранить соотношение сторон: вы можете использовать множитель 3x, получить изображение размером 3 x 3 и обрезать 0,5 единицы влево / вправо.

В последнем случае вы используете меньший процент в качестве множителя. Для изображения размером 1 x 1, которое вы хотите поместить в область размером 2 x 3 часа и сохранить соотношение сторон: вы можете использовать множитель 2x, получить изображение размером 2 x 2 и добавить 0,5 единицы сплошного цвета сверху / снизу .

...