Можно ли сделать отступы при склейки изображений с помощью 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 шт):

Автор решения: Studlara

Добавляю своё решение. Мне кажется это своего рода костыль, но это работает...

            $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'); // Сохраняем изображение в нужную директорию
            }

Ну как-то так, если кто внесет корректировки в код, для большей продуктивности, буду благодарен. Всем спасибо за обсуждение.

→ Ссылка
Автор решения: Solt

Для кеширования вначале можно проверить наличие готового файла в хранилище, а иначе генерить.


$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;

→ Ссылка