Как добавить границу вокруг png-изображения? Всякий раз, когда я пытаюсь добавить границу с помощью функции borderImage, доступной в imagick, она теряет прозрачность, если она является png-изображением.
<?php $image = new Imagick(); $image->readImage('tux.png'); $image->BorderImage(new ImagickPixel("red") , 5,5); // send the result to the browser header("Content-Type: image/" . $image->getImageFormat()); echo $image;
Это исходное изображение:
и это после добавления границы:
Цвет границы также применяется к фону. Я хочу сделать это с помощью imagick Как я могу применить границу к прозрачному изображению без потери прозрачности?
Если вы хотите добиться такого результата:
то это он. Если вы захотите, вы можете даже дать отступы между границей и изображением.
/** Set source image location. You can use URL here **/ $imageLocation = 'tux.png'; /** Set border format **/ $borderWidth = 10; // You can use color name, hex code, rgb() or rgba() $borderColor = 'rgba(255, 0, 0, 1)'; // Padding between image and border. Set to 0 to give none $borderPadding = 0; /** Core program **/ // Create Imagick object for source image $imageSource = new Imagick( $imageLocation ); // Get image width and height, and automatically set it wider than // source image dimension to give space for border (and padding if set) $imageWidth = $imageSource->getImageWidth() + ( 2 * ( $borderWidth + $borderPadding ) ); $imageHeight = $imageSource->getImageHeight() + ( 2 * ( $borderWidth + $borderPadding ) ); // Create Imagick object for final image with border $image = new Imagick(); // Set image canvas $image->newImage( $imageWidth, $imageHeight, new ImagickPixel( 'none' ) ); // Create ImagickDraw object to draw border $border = new ImagickDraw(); // Set fill color to transparent $border->setFillColor( 'none' ); // Set border format $border->setStrokeColor( new ImagickPixel( $borderColor ) ); $border->setStrokeWidth( $borderWidth ); $border->setStrokeAntialias( false ); // Draw border $border->rectangle( $borderWidth / 2 - 1, $borderWidth / 2 - 1, $imageWidth - ( ($borderWidth / 2) ), $imageHeight - ( ($borderWidth / 2) ) ); // Apply drawed border to final image $image->drawImage( $border ); $image->setImageFormat('png'); // Put source image to final image $image->compositeImage( $imageSource, Imagick::COMPOSITE_DEFAULT, $borderWidth + $borderPadding, $borderWidth + $borderPadding ); // Prepare image and publish! header("Content-type: image/png"); echo $image;
внешних пунктов/** Set source image location. You can use URL here **/ $imageLocation = 'tux.png'; /** Set border format **/ $borderWidth = 10; // You can use color name, hex code, rgb() or rgba() $borderColor = 'rgba(255, 0, 0, 1)'; // Padding between image and border. Set to 0 to give none $borderPadding = 0; /** Core program **/ // Create Imagick object for source image $imageSource = new Imagick( $imageLocation ); // Get image width and height, and automatically set it wider than // source image dimension to give space for border (and padding if set) $imageWidth = $imageSource->getImageWidth() + ( 2 * ( $borderWidth + $borderPadding ) ); $imageHeight = $imageSource->getImageHeight() + ( 2 * ( $borderWidth + $borderPadding ) ); // Create Imagick object for final image with border $image = new Imagick(); // Set image canvas $image->newImage( $imageWidth, $imageHeight, new ImagickPixel( 'none' ) ); // Create ImagickDraw object to draw border $border = new ImagickDraw(); // Set fill color to transparent $border->setFillColor( 'none' ); // Set border format $border->setStrokeColor( new ImagickPixel( $borderColor ) ); $border->setStrokeWidth( $borderWidth ); $border->setStrokeAntialias( false ); // Draw border $border->rectangle( $borderWidth / 2 - 1, $borderWidth / 2 - 1, $imageWidth - ( ($borderWidth / 2) ), $imageHeight - ( ($borderWidth / 2) ) ); // Apply drawed border to final image $image->drawImage( $border ); $image->setImageFormat('png'); // Put source image to final image $image->compositeImage( $imageSource, Imagick::COMPOSITE_DEFAULT, $borderWidth + $borderPadding, $borderWidth + $borderPadding ); // Prepare image and publish! header("Content-type: image/png"); echo $image;
Я получил этот метод отсюда . В основном мы просто делаем прямоугольник с прозрачной ImagickDraw::rectangle
и отформатированной рамкой с помощью ImagickDraw::rectangle
, затем мы помещаем изображение внутри прямоугольника с помощью Imagick::compositeImage
.
Вот результат, если вы установите $borderPadding
10
:
Это оно! Надеюсь, поможет 🙂