使用Imagick

时间:2018-04-03 11:04:50

标签: php imagick

我有一个透明背景的白色形状,我想用一些任意颜色来改变它,以获得彩色轮廓。输入可以是SVG或PNG。输出必须是PNG文件。

在以下示例中,我尝试将白色圆圈更改为红色,但它不起作用。我认为我不理解colorizeImagetintImage函数的作用。

<?php
$svg = <<<SVG
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="150" height="150">
   <ellipse style="fill:#ffffff" cx="50" cy="50" rx="50" ry="50" />
</svg>
SVG;

$color = '#FF0000';

$img = new \Imagick();
$img->readImageBlob($svg);
$img->setImageBackgroundColor('transparent');

//My tries
$test = clone $img;
$test->tintImage($color, 0, true);
$test->writeImage(__DIR__ . '/out_tint_0.png');

$test = clone $img;
$test->tintImage($color, 1.0, true);
$test->writeImage(__DIR__ . '/out_tint_1.png');

$test = clone $img;
$test->colorizeImage($color, 0, true);
$test->writeImage(__DIR__ . '/out_colorize_0.png');

$test = clone $img;
$test->colorizeImage($color, 1.0, true);
$test->writeImage(__DIR__ . '/out_colorize_1.png');

2 个答案:

答案 0 :(得分:0)

您无需使用Imagick编辑SVG。 只需添加CSS:background-color: #000;

答案 1 :(得分:0)

使用纯色创建相同大小的图像,然后仅考虑alpha通道

与原始图像合成
$base_color = new \Imagick();
$base_color->newImage($img->getImageWidth(), $img->getImageHeight(), '#ff8a00');
$base_color->compositeImage($img, Imagick::COMPOSITE_COPYOPACITY, 0, 0);

完整示例

<?php
$svg = <<<SVG
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="150" height="150">
   <ellipse style="fill:#ffffff" cx="50" cy="50" rx="50" ry="50" />
</svg>
SVG;

$color = '#FF0000';

$img = new \Imagick();
$img->readImageBlob($svg);
$img->setImageBackgroundColor('transparent');

$base_color = new \Imagick();
$base_color->newImage($img->getImageWidth(), $img->getImageHeight(), '#ff8a00');
$base_color->compositeImage($img, Imagick::COMPOSITE_COPYOPACITY, 0, 0);
$base_color->writeImage(__DIR__ . '/out_colorize_1.png');