我为此苦苦挣扎了好几天:我有一个 svg 图像,它显示了网站用户选择的颜色,覆盖在产品图像上。换句话说,svg 包含基本图像(作为指向本地文件(同一目录)的 xlink 或作为 base64 编码的嵌入式 uri(data:image/png;base64,...)。
我想将此图像保存为对所选内容的确认,然后可以通过电子邮件将其发送给客户。由于至少可以说对 svg 的电子邮件支持不完整,因此我想将图像从 svg 转换为 png。然而,iMagick 和 MagickWand 都没有成功地做到这一点。它们都只是渲染叠加层并忽略嵌入或链接的 png。
我已经尝试了我能想到的所有变体,包括从 url 读取图像或从 file_get_contents 结果读取 imageblob。但结果总是一样的:没有背景图像。
我还尝试从 svg 中删除所有 <![CDATA]>、<style>、<g> 和其他非必要信息,以确保 svg 内容没有问题。但是结果还是一样的(当然没有 css 样式!)
我在浪费时间吗?iMagick 不能转换嵌入/链接的图像吗?还是我很愚蠢,错过了一些明显的东西?
这是代码示例(非常标准):当客户选择配色方案时,svg 将保存到服务器,如下所示(此处截断):
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="400px" height="400px" viewBox="0 0 400 400" style="enable-background:new 0 0 400 400;" xml:space="preserve">
<style type="text/css">
<![CDATA[
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:rgb(17,178,0);mix-blend-mode: multiply;}
.st2{fill-rule:evenodd;clip-rule:evenodd;fill:rgb(112,23,145);mix-blend-mode: multiply;}
]]>
</style>
<image style="overflow:visible;" width="400" height="400" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAYAAACAvzbMAAAgAElEQVR4nOy9a6xtWXYe9I0x51r7...
...U5ErkJggg==">
</image>
<path class="st2" d="M40.605,152.484c1.056,0.048,2.112,0...
...38.013,253.708z"/>
<path class="st1" d="M38.733,139.381c0.192...
114.615,234.27z"/>
</svg>
当用作 svg 图像的 URI 时,它们可以完美显示。
我正在尝试将它们转换为png:
<?php
$im = new Imagick();
$im->setBackgroundColor(new ImagickPixel('transparent'));
$im->readImageBlob($svg); //readImage($url) gives same result
$im->setImageResolution(72,72);
$im->resampleImage (72,72,imagick::FILTER_UNDEFINED,1);
$im->setImageFormat("png"); //png, png24, png32 all give same result
$im->writeImage("../svg/temp.png");
?>
<img src="temp.png">
与 MagickWand 相同(或者):
<?php
$mw = NewMagickWand();
$transparentColor = NewPixelWand();
PixelSetColor($transparentColor, 'transparent');
MagickSetBackgroundColor($mw, $transparentColor);
MagickReadImage($mw, $_SERVER['DOCUMENT_ROOT']."/svg/example.svg");
MagickSetImageBackgroundColor($mw, $transparentColor);
MagickSetImageFormat($mw, 'png32'); // png, png24 and png32 all same result
MagickWriteImage($mw, $_SERVER['DOCUMENT_ROOT']."/svg/temp2.png");
?>
<img src="temp2.png">
谁能建议一种获取整个图像的方法,而不仅仅是进入 png 的两条路径?
感谢任何建议
非常感谢