imagick увеличить размер полотна

764
07 февраля 2017, 23:11

У меня есть некоторое изображение. Мне нужно с помощью imagick создать для него квадратное превью, но дело в том, что изображение может быть любой ширины и любой высоты. Превью должно представлять из себя белый квадрат 150х150 с изображением в центре.
Допустим размеры изображения- 200х400. Тогда нужно изменить изображение функцией thumbnailImage(-1, 150). теперь его размеры- 75х150. Можно ли как-нибудь растянуть полотно, чтобы его размеры стали 150х150, а новое пространство заполнилось белым цветом. Как в Pain.NET. Снизу пример самого изображения и его превью.

Answer 1

Сейчас я использую следующий алгоритм:

$image = new Imagick($source); // создаю объект с моей картинкой
$d = $image->getImageGeometry(); //получаю ее размеры  и в зависимости от них скалирую картинку по ширине или по высоте
$w = $d['width'];
$h = $d['height'];
if ($w>$h) $image->thumbnailImage(150, -1);
else $image->thumbnailImage(-1, 150);
$prew = new Imagick(); //создаю объект для превью и создаю на нем новое изображение 150х150 белого цвета
$prew->newImage(150, 150, new ImagickPixel('white'));
$d = $image->getImageGeometry(); //получаю новые размеры изображения и считаю отступы для помещения по центру
$w = $d['width'];
$h = $d['height'];
$ox = (150 - $w) / 2;
$oy = (150 - $h) / 2;
$prew->compositeImage($image, Imagick::COMPOSITE_DEFAULT, $ox, $oy); //помещаю на превью свою картинку, соблюдая заранее посчитанные отступы
$prew->writeImage($dest);



Если кто не понял, меня интересует более упрощенный до пары строк алгоритм, если это возможно.

Answer 2

Создайте два объекта: один квадрат с нужной стороной, второй - тамбс из целевой картинки с шириной равной стороне первого квадрата. И наложите тамбс на квадрат.

$bg = new Imagick();
$bg->newImage(100, 100, new ImagickPixel('white'));
$bg->setImageFormat('jpg');
$image = new Imagick('path_to.jpg');
$image->thumbnailImage(100, 0);
$bg->compositeImage($image, Imagick::ALIGN_CENTER,0,(100-$image->getImageHeight())/2);
header('Content-type: image/png');
echo $bg;

Проверено, работает.

READ ALSO
Связные списки в opencart

Связные списки в opencart

Делаю связные списки в opencart

859
Перезаписать массив

Перезаписать массив

Здравствуйте, у меня есть вложенные массивы:

756
Как добавить условие в dataProvider в yii2

Как добавить условие в dataProvider в yii2

С помощью CRUD с генерировал GridView на индексной странице

1138