我有一个透明背景的白色形状,我想用一些任意颜色来改变它,以获得彩色轮廓。输入可以是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');
答案 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');