У меня есть некоторое изображение. Мне нужно с помощью imagick создать для него квадратное превью, но дело в том, что изображение может быть любой ширины и любой высоты. Превью должно представлять из себя белый квадрат 150х150 с изображением в центре.
Допустим размеры изображения- 200х400. Тогда нужно изменить изображение функцией thumbnailImage(-1, 150). теперь его размеры- 75х150. Можно ли как-нибудь растянуть полотно, чтобы его размеры стали 150х150, а новое пространство заполнилось белым цветом. Как в Pain.NET. Снизу пример самого изображения и его превью.
Сейчас я использую следующий алгоритм:
$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);
Если кто не понял, меня интересует более упрощенный до пары строк алгоритм, если это возможно.
Создайте два объекта: один квадрат с нужной стороной, второй - тамбс из целевой картинки с шириной равной стороне первого квадрата. И наложите тамбс на квадрат.
$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;
Проверено, работает.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей