使用 Imagick 为白色剪影着色
Colorize white silhouette with Imagick
我有一个透明背景的白色形状,我想用一些任意颜色更改它以获得彩色轮廓。输入可以是 SVG 或 PNG。输出必须是 PNG 文件。
在下面的示例中,我试图将白色圆圈更改为红色,但它不起作用。我认为我不了解 colorizeImage
和 tintImage
函数的作用。
<?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');
我有一个透明背景的白色形状,我想用一些任意颜色更改它以获得彩色轮廓。输入可以是 SVG 或 PNG。输出必须是 PNG 文件。
在下面的示例中,我试图将白色圆圈更改为红色,但它不起作用。我认为我不了解 colorizeImage
和 tintImage
函数的作用。
<?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');