Изменить размер панорамного изображения до фиксированного размера - PullRequest
2 голосов
/ 01 марта 2011

Я хочу изменить размер изображения до фиксированной ширины и высоты (т.е. 150 пикселей).Тем не менее, существует проблема, если есть большая разница в высоте и ширине исходной фотографии (например, панорамной фотографии), уменьшенный эскиз выглядит плохо.Есть ли какое-нибудь умное решение, чтобы изменить размеры фотографий до фиксированной ширины и высоты?Например, посмотрите на это изображение: enter image description here

Вот мой код:

<?php
    $params = getimagesize($tempFile);
    $width = $params[0];
    $height = $params[1];

    $newwidth=150;
    $newheight= 150;
    $tmp=imagecreatetruecolor($newwidth,$newheight);

    imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height);
    imagejpeg($tmp,$img_name,80);

    imagedestroy($src);
    imagedestroy($tmp); 
?>

Есть ли какой-нибудь разумный способ разумного изменения размера изображений?Спасибо.

Ответы [ 4 ]

2 голосов
/ 01 марта 2011

Есть умное решение, оно называется Вырезание шва , и если ваш сервер поддерживает ImageMagick, вы делаете это следующим образом:

<?php
$im = new Imagick( 'image.jpg' );
$im->liquidRescaleImage( 600, 100, 3, 25 );
header( 'Content-Type: image/jpg' );
echo $im;
?>

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

Кстати, похоже, что twitpic просто обрезает квадрат изображения.В одном из моих предыдущих проектов я использовал следующий код:

if ($image->width > $image->height){
    //crop image in proportions 4/3, then resize to 500x300 (or proportionally lower resolution), 
    //sharp it a little and decrease quality. 
    //I used one of the Yii framework extensions.
    $image->crop($image->width, $image->width/4*3)->resize(500, 300, Image::WIDTH)->sharpen(15)->quality(75);
}
2 голосов
/ 01 марта 2011

Похоже, что twitpic выясняет, какова длина короткой оси, затем берет квадрат с центром на исходном изображении со сторонами, равными длине короткой оси, и затем уменьшает его до 150x150.

0 голосов
/ 01 марта 2011

Вам нужно будет рассчитать соответствующие координаты для исходной области, которую вы хотите скопировать:

imagecopyresampled($tmp,$src,0,0,[THIS VALUE],[THIS VALUE],$newwidth,$newheight, [THIS VALUE],[THIS VALUE]);

На данный момент вы берете область от 0,0 (x, y) до ширины, высоты(x, y) исходной области и попытайтесь ограничить ее размером 150x150.

вам нужно будет рассчитать, какая из ширины и высоты является самой большой, и обрезать ее, а также убедиться, что это соотношениетак же, как ваше полученное изображение (в вашем случае, соотношение составляет 1,0 из-за 150x150).

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

subtract 317 from 1050 = 733; // this is the excessive area for both sides
divide by 2 =~ 366; // to get the excessive area for one side

Сейчас, используйте первую координату x 366, чтобы начать 366 пикселей слева.Используйте вторую координату x 1050 - 366, начиная с 366 пикселей справа.

Таким образом, ваш пример должен быть (просто угадать здесь):

imagecopyresampled($tmp,$src,0,0,366,0,$newwidth,$newheight, $width - 366, 0);

Вам, конечно, понадобится некоторая логика, чтобы вычислить это правильно для любого другого размера.

0 голосов
/ 01 марта 2011

Нет, изменить, получить только центр 150x150 пикселей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...