Можно ли сделать отступы при склейки изображений с помощью ImageMagick?
Всем привет. Хочу сделать склейку изображений с помощью ImageMagick php, сделал из мануала этот пример:
<?php
$im = new Imagick();
$im->newImage(100, 50, "red");
$im->newImage(100, 50, "green");
$im->newImage(100, 50, "blue");
$im->resetIterator();
$combined = $im->appendImages(true);
$combined->setImageFormat("png");
header("Content-Type: image/png");
echo $combined;
?>
Всё работает, но они получаются "слипшиеся", хотелось бы добавить отступы между ними. Почитал, предлагают создать еще 1 изображение, ибо просто отступы сделать вроде как нельзя. Я попробовал так...
$im = new Imagick();
$newImg = new Imagick();
$newImg->newImage(1024, 20, new ImagickPixel('transparent'));
$im->newImage(100, 50, "red");
$im->newImage(100, 50, "green");
$im->newImage(100, 50, "blue");
$obj = new Imagick();
foreach ($im as $key => $value) {
$obj->addImage($value);
$obj->addImage($newImg);
//echo $key;
}
$obj->resetIterator();
$combined = $obj->appendImages(true);
$combined->setImageFormat("png");
header("Content-Type: image/png");
echo $combined;
В таком случае, выводится картинка, но как будто она не доступна, ошибок нет, но и изображения нет... Подскажите, есть ли решение, или может я не так делаю, пытался найти в документации, так и не нашел ничего связанного с отступами в изображениях...
Ответы (2 шт):
Добавляю своё решение. Мне кажется это своего рода костыль, но это работает...
$pdf = 'path/file.pdf';
/** Создал объект Imagick с коллекцией изображений страниц из PDF файла **/
$im = new Imagick($pdf);
$count_pages = $im->getNumberImages(); // Получаем количество страниц
$new_background_width = $im->getImageWidth() + 20; // Получаем значение ширины страницы и добавляем + 20px
$new_background_height = $im->getImageHeight() + 40; // Получаем значение высоты страницы и добавляем + 40px
/** Создаю задний фон размерами полученными ранее, чтобы были чуть больше чем размер страницы **/
$newImg = new Imagick();
$newImg->newImage($new_background_width, $new_background_height, new ImagickPixel('white'));
/** Создал пустой объект куда будет добавляться коллекция изображений **/
$result = new Imagick();
if ($count_pages) {
for ($i = 0; $i < $count_pages; $i++) {
$page = $pdf.'['.$i.']';
$image = new Imagick($page); // Получаю изображение конкретной страницы [0, 1, 2...];
$image->borderImage('grey', 1, 1); // добавил серую обводку (по желанию)
$image->roundCorners(10, 10); // скруглил углы (по желанию)
$newImg->compositeImage($image, Imagick::COMPOSITE_OVER, 10, 20); // Наложение на задний фон изображения конкретной страницы с отступами
$result->addImage($newImg); // Заполняем пустую коллекцию уже новым изображением состоящим из заднего форма + наложенное изображение конкретной страницы
$image->clear(); // чистка
$image->destroy(); // чистка
}
$newImg->clear(); // чистка
$newImg->destroy(); // чистка
$result->resetIterator();
/* Соединяем все изображения в одно */
$res = $result->appendImages(true);
$result->clear(); // чистка
$result->destroy(); // чистка
$res->setImageFormat("jpg"); //выбираем формат
$res->adaptiveResizeImage($res->getImageWidth()/1.6, $res->getImageHeight()/1.6); // Оптимизировал размер, поделив значения ширины и высоты для уменьшения размера изображения(по желанию)
$res->writeImage($your_path.'/preview.jpg'); // Сохраняем изображение в нужную директорию
}
Ну как-то так, если кто внесет корректировки в код, для большей продуктивности, буду благодарен. Всем спасибо за обсуждение.
Для кеширования вначале можно проверить наличие готового файла в хранилище, а иначе генерить.
$filepath="$your_path/preview.jpg";
$url="$your_url/preview.jpg";
//Если файл есть - переадресуем на его урл
if(file_exists($filepath)){
header("Location: $url");
exit;
}
//Здесь генерация файла, которую заканчиваем сохранением в файл и отдачей во фронт
...
$res->writeImage($filepath);
header("Content-Type: image/jpeg");
echo $res;