Задать вопрос

Как скруглить углы изображения и обводки [Imagick]?

Не получается никак это сделать. Кто в курсе, помогите.
Обработчик

public function createThumbnail($imagePath, $fileSize, $fileExtension) {
        $image = new Imagick($imagePath);

        if ($image->getNumberImages() > 1 && strtolower($fileExtension) === 'ico') {
            // Выбираем самое большое изображение в ICO файле
            $maxWidth = 0;
            $maxHeight = 0;
            $imageIndex = 0;
            foreach ($image as $index => $frame) {
                $frameWidth = $frame->getImageWidth();
                $frameHeight = $frame->getImageHeight();
                if ($frameWidth > $maxWidth || $frameHeight > $maxHeight) {
                    $maxWidth = $frameWidth;
                    $maxHeight = $frameHeight;
                    $imageIndex = $index;
                }
            }
            $image->setIteratorIndex($imageIndex);
        }

        $newWidth = $image->getImageWidth();
        $newHeight = $image->getImageHeight();

        $thumbWidth = $this->thumbCreatingParams['Width'];

        if ($this->thumbCreatingParams['ResizeMode'] === 'trByWidth') {
            $thumbHeight = (int) round(($thumbWidth / $newWidth) * $newHeight);
        } elseif ($this->thumbCreatingParams['ResizeMode'] === 'trByHeight') {
            $thumbHeight = $newHeight;
            $thumbWidth = $newWidth;
        }

        $image->thumbnailImage($thumbWidth, $thumbHeight, true);

        // Подсчет размера в КБ
        $fileSizeKB = round($fileSize / 1024, 1);

        // Толщина подложек и отступы
        $overlayTopThickness = 3; // Толщина подложки сверху, слева и справа
        $overlayBottomHeight = 30; // Высота подложки внизу
        $transparentBorderThickness = 3; // Толщина прозрачной области

        // Создаем новое изображение с прозрачным фоном
        $background = new Imagick();
        $background->newImage($this->thumbCreatingParams['Width'] + 2 * ($overlayTopThickness + $transparentBorderThickness), $thumbHeight + $overlayBottomHeight + 2 * $transparentBorderThickness + $overlayTopThickness, new ImagickPixel('none'));
        $background->setImageFormat('png');

        // Цветные подложки
        $overlayColor = new ImagickPixel("#222222");
        // Верхняя подложка
        $overlayTop = new Imagick();
        $overlayTop->newImage($this->thumbCreatingParams['Width'] + 2 * $overlayTopThickness, $overlayTopThickness, $overlayColor, 'png');
        $background->compositeImage($overlayTop, Imagick::COMPOSITE_OVER, $transparentBorderThickness, $transparentBorderThickness);
        // Левая подложка
        $overlaySide = new Imagick();
        $overlaySide->newImage($overlayTopThickness, $thumbHeight, $overlayColor, 'png');
        $background->compositeImage($overlaySide, Imagick::COMPOSITE_OVER, $transparentBorderThickness, $overlayTopThickness + $transparentBorderThickness);
        // Правая подложка
        $background->compositeImage($overlaySide, Imagick::COMPOSITE_OVER, $this->thumbCreatingParams['Width'] + $overlayTopThickness + $transparentBorderThickness, $overlayTopThickness + $transparentBorderThickness);
        // Нижняя подложка
        $overlayBottom = new Imagick();
        $overlayBottom->newImage($this->thumbCreatingParams['Width'] + 2 * $overlayTopThickness, $overlayBottomHeight, $overlayColor, 'png');
        $background->compositeImage($overlayBottom, Imagick::COMPOSITE_OVER, $transparentBorderThickness, $thumbHeight + $overlayTopThickness + $transparentBorderThickness);

        // Композитим миниатюру поверх прозрачного фона
        $background->compositeImage($image, Imagick::COMPOSITE_OVER, $overlayTopThickness + $transparentBorderThickness, $overlayTopThickness + $transparentBorderThickness);

        // Путь к изображению-иконке
        $lensImagePath = '/var/www/html/domain.com/scripts/lens-white.png';

        // Загружаем изображение-иконку
        $lens = new Imagick($lensImagePath);
        $lensWidth = $lens->getImageWidth();
        $lensHeight = $lens->getImageHeight();

        // Композитим иконку на подложку в правый нижний угол
        $lensX = $background->getImageWidth() - $lensWidth - 12; // 5 пикселей отступ
        $lensY = $background->getImageHeight() - $lensHeight - 12; // 5 пикселей отступ
        $background->compositeImage($lens, Imagick::COMPOSITE_OVER, $lensX, $lensY);

        // Добавляем текст с разрешением и размером основного изображения
        $draw = new ImagickDraw();
        $draw->setFillColor('#FFFFFF'); // Цвет текста
        $draw->setFont('/usr/share/fonts/truetype/tahoma/tahoma.ttf'); // Надежный шрифт
        $draw->setFontSize(12);
        $draw->setGravity(Imagick::GRAVITY_NORTHWEST);

        // Координаты текста с учетом толщины подложки
        $yCoordinate = $thumbHeight + $overlayBottomHeight + $overlayTopThickness + $transparentBorderThickness - 23; // Опускаем текст вниз

        // Текст с отступами
        if ($fileSizeKB >= 1024) {
            $fileSizeMB = number_format($fileSizeKB / 1024, 2, '.', ''); // Точное деление, 2 знака после точки
            $text = "{$newWidth}x{$newHeight} [{$fileSizeMB} Mb]";
        } else {
            $text = "{$newWidth}x{$newHeight} [{$fileSizeKB} Kb]";
        }

        $background->annotateImage($draw, $overlayTopThickness + 5 + $transparentBorderThickness, $yCoordinate, 0, $text);



        // Сохранение для отладки
        // $background->writeImage('/tmp/test_output.png'); // Проверь вручную

        return $background;
    }



ПС. Это для того, чтобы выкладывать на чужие форумы в виде миниатюры при клике на которое переход на оригинал.
  • Вопрос задан
  • 104 просмотра
Подписаться 1 Простой 9 комментариев
Решения вопроса 1
BlagoYar
@BlagoYar Автор вопроса
Если кому интересно, вот готовое решение
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
SergeiVL
@SergeiVL
Senior PHP developer
// Создаем объект Imagick
$imagick = new Imagick('path/to/your/image.jpg');

// Устанавливаем радиус для углов
$radius = 20;

// Скругляем углы
$imagick->roundCorners($radius);

// Сохраняем измененное изображение
$imagick->writeImage('path/to/save/rounded_image.jpg');
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы