Измените размер изображения с помощью 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);
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 для миниатюры портрета
Вы можете взглянуть на эту функцию, которую я использую в своем классе изображений:
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
, ширина должна быть установлена в максимальная ширина и высота должны быть рассчитаны на основе этого. Если сравнение происходит наоборот, просто установите высоту на максимальную высоту и рассчитайте новую ширину.
Вы должны переключить высоту и ширину во второй части, обратите внимание на часть ($width/$height)
:
} else {
$newheight=800;
$newwidth=($width/$height)*$newheight;
$newheight1=150;
$newwidth1=($width/$height)*$newheight;
}