记录下magick转svg渲染失败

magick 支持上百种格式转换,下面是pngsvg

$ magick hj.png hj.svg
magick: delegate failed `'potrace' --svg --output '%o' '%i'' @ error/delegate.c/InvokeDelegate/1911.

错误描述:需要提供外部的委托potrace, 这里表示需要安装此插件

下面首先安装potrace

# for mac
brew install potrace

# for alpine
apk add potrace

当前的系统版本是

NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.15.0
PRETTY_NAME="Alpine Linux v3.15"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"

当前的magick版本是

Version: ImageMagick 7.1.0-58 (Beta) Q16-HDRI aarch64 1590c22ec:20221230 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP(4.5)
Delegates (built-in): bzlib fontconfig freetype jng jp2 jpeg lcms lzma pangocairo png raw tiff webp x xml zip zlib
Compiler: gcc (10.3)

安装potrace后,需要再源码编译magick

$ cd ImageMagick-7 && \
    configure \
    make -j $(nproc) \
    make install

编译完成后,执行转换命令

$ magick hj.png hj.svg

查看hj.svg 渲染的背景是黑色,所以此次转换效果不佳。

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
 width="1258.000000pt" height="1140.000000pt" viewBox="0 0 1258.000000 1140.000000"
 preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.16, written by Peter Selinger 2001-2019
</metadata>
<g transform="translate(0.000000,1140.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M0 8114 l0 -3286 50 -64 ..... />
</g>
</svg>

上面xml文件就是hj.svg文件内容, 通过potrace转换出来的。 fill填充的颜色是黑色,所以导致结果不佳。

询问magick作者得出,需要取消外部potrace提供转换,使用默认的内部支持。所以这里需要到配置文件中注释掉一行代码

$ grep -i svg /usr/local/etc/ImageMagick-7/delegates.xml | grep -i potrace
<!--<delegate decode="pnm" encode="trace" command="&quot;potrace&quot; \-\-svg \-\-output &quot;%o&quot; &quot;%i&quot;"/> -->

再次执行转换命令,结果与原图的色彩一致

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 2

$svgName = $i.''.$svgName; $fname = $i.''.$fname; $svgfile = $svg_upload_dir . $svgName; $success = file_put_contents($svgfile, $c_s_str); $im = new Imagick(); $svg = '<?xml version="1.0" encoding="UTF-8" standalone="no" ? >'.file_get_contents($svgfile); $im->setBackgroundColor(new ImagickPixel('transparent'));// $im->readImageBlob($svg); $im->setImageFormat("png24"); $im->resizeImage(500, 500, imagick::FILTER_LANCZOS, 1);//Resize $im->writeImage(Mage::getBaseDir('media').'/tmp/tmp/'.$fname); 必须添加“<?xml version="1.0"”头且版本必须为1.0否则无法转换 看看你有没有安装安装inkscape扩展

1年前 评论
charliecen (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
39
粉丝
9
喜欢
71
收藏
102
排名:461
访问:1.9 万
私信
所有博文
社区赞助商