使用 Imagick 为白色剪影着色

Colorize white silhouette with 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');

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

创建一个相同大小的纯色图像,然后仅考虑 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');