使用嵌入图像从SVG创建PNG

时间:2017-10-10 14:45:25

标签: php svg png imagick magickwand

我一直在努力奋斗这几天: 我有一个svg图像,显示网站用户选择的颜色覆盖在产品的图像上。换句话说,svg包含基本映像(作为本地文件的xlink(同一目录)或base64编码的嵌入式uri(data:image / png; base64,...)。

我想将此图像保存为所选内容的确认,然后可以通过电子邮件将其发送给客户。由于svg的电子邮件支持至少可以说不完整,我想将图像从svg转换为png。然而,iMagick和MagickWand都没有成功。它们都只渲染叠加层并忽略嵌入或链接的png。

我已经尝试了我能想到的每个变体,包括从url读取图像或从file_get_contents结果中读取imageblob。但结果总是一样的:没有背景图片。

我还尝试删除所有<![CDATA]>,< style>,< g>来自svg的其他非必要信息,以确保它不是svg内容的问题。但同样结果是相同的(当然没有css样式!)

我在浪费时间吗? iMagick可以不转换嵌入/链接图像吗?或者我是愚蠢的,错过了一些明显的东西?

以下是代码示例(非常标准): 当客户选择了一种颜色方案并且看起来像这样(在此处截断)时,svgs会保存到服务器中:

<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时,它们会完美显示。

我试图将它们转换为pngs:

<?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吗?

感谢任何建议

非常感谢

0 个答案:

没有答案