⼀些图像格式转换⼯具的使⽤⽅法(eps2svgwithpdf)
前⾔:
⼯作中要把eps的图形转化为svg的,需要借助⼀些⼯具。
⾸先,eps是Adobe公司开发的的⽤来印刷打印的图像格式,不是传统的位图,也不完全是⽮量图。svg是完全的⽮量图。很多⼯业中使⽤的印刷图像⽂件格式都是eps格式,但是要对其进⾏复杂的编辑操作时,要把图形转为svg导⼊,于是这就涉及到了⼀个图形格式转换的问题。⽤Adobe Illustrator可以很快的实现这个转换,但是这不是免费使⽤的,⽽且在其他公司开发的软件中也⽆法调⽤Adobe公司给出的任何接⼝,只能⼿动导⼊到AI中⼿动导出。在⽆法使⽤Adobe的格式转换⽅案的情况下,我们只能寻⼀些其他⽅法。
在windows和Linux的情况还是有区别的,现在⽹络上的⼤多数解决⽅案都是Linux下的,但是我们开发很多软件时,很多都是在windows下使⽤的,所以这⾥我简略总结⼀下windows环境下⼀些图形格式转换⼯具如何使⽤,以及如何将eps格式的转图形化为svg的。
在Linux环境下:
最佳的解决⽅案是先eps2pdf,然后pdf2svg。
这两种⽅法应该是都可以⽤的,但是可惜是在Linux的,没法⽤在windows。
这⾥eps转pdf⽤的是GS,pdf转svg⽤的是Poppler和Cairo,这种⽅案在Linux下算是⽐较成熟的了,Poppler和Cairo我还没有研究过如何使⽤,这⾥暂时不介绍了。
下⾯要介绍的⼏种⼯具是:Ghost Script 、Inkscape 、Potrace 、⼀个在Github上开源的js脚本(pdf2svg)
svg图形Ghost Script:
这⾥给出⼀个将eps转化为pdf的事例
命令: E:/path/gs/gs8.64/ -P -dNOPAUSE -dNOSAFER -dBATCH -dEPSCrop -
sDEVICE=pdfwrite -sOutputFile=E:/path/1.pdf E:/path/1.eps
这⾥中间很多参数,参考⼀下说明⽂档就⾏,简⽽⾔之就是将⼀个eps⽂件转化为了pdf,⽽且经过很多测试,这个转化过程⾮常完美。GS的sDEVICE=参数也有⼀个svg,我们将eps⽂件直接⽤GS转化为svg时,GS转化效果⾮常差,在⼀些有宽度的线条上,GS转出来的图形会有多余出来的东西,所以我们只⽤GS脚本实现eps2pdf。
Inkscape:
这个⼯具本来是⼀个在Linux开源的⼯具,直接sudo操作⼀通就能使⽤的,在Linux下可以只使⽤Inkscape很⽅便的转换⽂件格式,Inkscape将eps转为svg也是先⽤的GS将eps转为pdf,再⽤⾃⼰的⼯具将pdf转为了svg,在Windows版本的Inkscape是不⽀持eps⽂件格式的,只能将pdf转换为svg,除⾮安装了GS插件。在这⾥Inkscape的pdf2svg转换出来的效果⾮常棒,但是Inkscape的体积⽐较⼤,最新版本的压缩⼀下也要100mb,旧版本的也⾄少要50mb,所以不是很实⽤。
命令语句: E:\ -l E:\output\out.svg E:\output\1.pdf
Potrace:
这就是⼀个将位图转化为svg的⼯具,只⽀持bmp等4种位图⽂件格式,png,jpg都不⽀持,⽽且转成svg效果也很差,它只是⼀个消除锯齿,让图像平滑的⼯具,转出来的图像不适合精确的编辑。
使⽤⽅法在readme⾥有,语法⼤同⼩异,这⾥不赘述了。
Github上开源的js脚本(pdf2svg):
这个脚本⾮常⼩,但是需要⽤到Node.js 来运⾏这个脚本,加起来10mb。
这个脚本把路径写死了,⽆论是⽂件⽣成路径还是⽂件保存路径,他都写的是"./xxx",都保存在了当下⽬录,如果你不加修改,就只能cd进到这个⽬录⾥,还不能直接从别的⼯作路径直接指定运⾏这个脚本。
只能运⾏: pdf2svg.js in.pdf
这时他会⾃动根据你pdf的页数⽣成很多svg⽂件,命名为in-1,in-2,in-3,⽣成⽂件的⽬录他也规定了。
这⾥我修改了⼀下他的脚本,添加了两个参数,并且允许异地访问这个脚本。最后两个参数分别规定了这个脚本的⼯作路径(很多东西都⽣成在这⾥,也在这个路径⾥寻,加个这个也便于修改脚本),和svg⽂件的输出路径。
可以运⾏: C:\Users\Administrator>E:/ E:/pdf2svgmaster/pdf2svg.js
E:/pdf2svgmaster/in.pdf E:/pdf2svgmaster E:/out.svg
综合解决⽅案:
先⽤GS将eps转为pdf,再⽤nodejs运⾏这个开源脚本将pdf转为svg
可能遇到的问题:
1.图形⼤⼩在转换过程中变化
在GS的参数⾥加上 -dEPSCrop
2.运⾏调⽤js脚本后,程序⼀直卡住
⼀般的只要
process->waitForFinished(Process_WaitMsecs);
但是node很奇怪,会⼀直不退出。
process->start(comandStr);
process->waitForStarted(2000);
process->waitForReadyRead(Process_WaitMsecs);
QString retStr=process->readAll();
因为js脚本会有命令⾏输出,所以我们等待它有返回结果的时候就读取⽂件,然后node程序就会异常退出。
但是这⾥要注意⼀下,waitForReadyRead 只要发现程序有任何输出就会迅速执⾏,如果脚本中有⼀些console的⽆⽤信息输出,程序就会迅速读到底,在没有写⼊svg⽂件的时候,就读完了,后⾯就会不到svg⽂件。所以我的解决⽅案是把js脚本中⽆⽤的输出全部注释掉,只留下写⼊⽂件后的那个console输出。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。