Измените размер изображения с помощью PHP, определите самую длинную сторону и измените размер в соответствии с?


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

Я хочу сделать следующее: Определите самую длинную сторону изображения (т. Е. портрет или пейзаж) А затем измените размер изображения, чтобы самая длинная сторона была 800 пикселей, И сохраните пропорции.

Вот код, который у меня есть до сих пор.. Для пейзажных изображений это работает нормально, но с портретными изображениями это искажает их как сумасшедшее. пс. Я делаю увеличенное изображение, а также миниатюра.

list($width,$height)=getimagesize($uploadedfile);

if($width > $height){

    $newwidth=800;
    $newheight=($height/$width)*$newwidth;

    $newwidth1=150;
    $newheight1=($height/$width)*$newwidth1;

} else {


    $newheight=800;
    $newwidth=($height/$width)*$newheight;


    $newheight1=150;
    $newwidth1=($height/$width)*$newheight;

}
$tmp=imagecreatetruecolor($newwidth,$newheight);
$tmp1=imagecreatetruecolor($newwidth1,$newheight1);
Author: Tim Cooper, 2011-05-07

3 answers

Вы, вероятно, ошибаетесь:

Когда $width > $height это означает, что это пейзаж. Установка maxwidth на 800 означает (высота/ширина)*800 = новая высота. С другой стороны, $height > $width означает, что значение maxheight равно 800 и, следовательно, (ширина/высота)*800 - это новая ширина.

Прямо сейчас вы используете соотношение высоты и ширины, а не наоборот. Пример:

Image: 1600 (w) x 1200 (h)
Type: Landscape
New Width: 800
New Height: (1200 (h) / 1600(w) * 800 (nw) = 600

Image 1200 (w) x 1600 (h)
Type: Portrait
New Height: 800
New Width: (1200 (w) / 1600(h) * 800 (nh) = 600

Надеюсь, вы поняли, о чем я говорю, вы просто поменяли их местами:) Также обратите внимание, что вы умножаете на $newheight вместо $newheight1 для миниатюры портрета

 3
Author: Joshua - Pendo, 2011-05-06 22:05:10

Вы можете взглянуть на эту функцию, которую я использую в своем классе изображений:

public function ResizeProportional($MaxWidth, $MaxHeight)
{

    $rate = $this->width / $this->height;

    if ( $this->width / $MaxWidth > $this->height / $MaxHeight )
        return $this->Resize($MaxWidth, $MaxWidth / $rate);
    else
        return $this->Resize($MaxHeight * $rate, $MaxHeight);
}

В основном он сначала вычисляет пропорции изображения в долларах США на основе ширины/высоты. Затем он проверяет, выйдет ли ширина за пределы при изменении размера ( $this->width / $MaxWidth > $this->height / $MaxHeight ), и если да, то устанавливает ширину на желаемую максимальную ширину и соответственно вычисляет высоту.

$this->width / $MaxWidth это процент от ширины изображения, основанный на максимальной ширине. Поэтому, если $this->width / $MaxWidth больше, чем $this->height / $MaxHeight, ширина должна быть установлена в максимальная ширина и высота должны быть рассчитаны на основе этого. Если сравнение происходит наоборот, просто установите высоту на максимальную высоту и рассчитайте новую ширину.

 0
Author: stormbreaker, 2011-05-06 22:05:35

Вы должны переключить высоту и ширину во второй части, обратите внимание на часть ($width/$height):

} else {


    $newheight=800;
    $newwidth=($width/$height)*$newheight;


    $newheight1=150;
    $newwidth1=($width/$height)*$newheight;

}
 0
Author: jeroen, 2011-05-06 22:06:15