У меня есть некоторое изображение. Мне нужно с помощью 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;
Проверено, работает.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
С помощью CRUD с генерировал GridView на индексной странице