Принудительно сохранять пропорции загруженного изображения

#php #html #image #file-upload

#php #HTML #изображение #загрузка файла

Вопрос:

Я размещаю изображение в теге image

 <img src="image.jpg" width="100" height="50" />
  

Если пользователь загружает изображение размером 100×100, я хочу, чтобы оно отображалось так, как тег выше

 <img src="image.jpg" width="50" height="50" />
  

Как этого добиться?

ps

Я использую php, если это вообще проблема на стороне сервера.

Комментарии:

1. Итак, вы хотите сохранить пропорции изображения и задать ширину или высоту?

2. Не устанавливать, просто сохранять пропорции в пределах ширины или высоты. Если исходное изображение 100×10 и тег <img src=»image.jpg » width = «50» height =»70″ /> Мне нужно использовать целых 50 пикселей ширины и только 10 пикселей из 70 доступных для высоты. Будет много пустого места, но изображение сохранит свою форму. Надеюсь, я уловил суть. Спасибо.

Ответ №1:

Используйте getimagesize() для получения размера изображения. Затем сделайте это для уменьшения размера, но с сохранением соотношения сторон:

 if ($width > $height)
{
    $ratio = (float)100 / $width;
}
else
{
    $ratio = (float)100 / $height;
}

$width  = (int)round($width  * $ratio);
$height = (int)round($height * $ratio);
  

Ответ №2:

Этот код поместит любое изображение в поле MaxWidth x maxHeight с сохранением соотношения сторон и заполнения белым фоном.

 $img = new Imagick('orig.jpg');
$maxWidth = 100;
$maxHeight = 50;

$geom = $img->getImageGeometry();
$fitWidth = (($maxWidth/$geom['width'])<($maxHeight/$geom['height']))?true:false;
if($fitWidth){
    $img->thumbnailImage($maxWidth,0,false);
}else{
    $img->thumbnailImage(0,$maxHeight,false);
}

$canvas = new Imagick();
$canvas->newImage($maxWidth,$maxHeight,'white','jpg');

$geom = $img->getImageGeometry();
$x = ($maxWidth-$geom['width'])/2;
$y = ($maxHeight-$geom['height'])/2;
$canvas->compositeImage($img,imagick::COMPOSITE_OVER,$x,$y);

$canvas->writeImage('thumb.jpg');