Изменение размера изображения с помощью PHP, определение самой длинной стороны и изменение размера в соответствии с? - PullRequest
3 голосов
/ 07 мая 2011

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

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

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

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);

Ответы [ 3 ]

3 голосов
/ 07 мая 2011

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

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

0 голосов
/ 07 мая 2011

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

} else {


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


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

}
0 голосов
/ 07 мая 2011

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

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);
}

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

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

...