最近做了emf2svg的工程,发现转出来的svg不能重新导入ppt,所以搞了个svg2png。这些功能很多都是有比较完善的代码,只是在windows下搞会比较麻烦。这次我测试的是sf_svg(github上找一下),需要SFML(http-s://w-ww.sfml-dev.org/download/sfml/2.5.1/,如果不能跳转请将多余的-删掉)
在vs上编译,我是将所有的文件拉进来的,nanosvg并入sf_svg,然后修改部分文件的头文件引用之类的。我这边是将nanosvg++文件夹下放在sf_svg同一个目录下,然后全部拖进工程(末尾有列表),需要修改svg.hpp
#include "nanosvg++/nsvgpp.hpp"
#include "nsvgpp.hpp"
Rasterizer.cpp需要添加
#ifdef _WIN32
#pragma comment(lib,"sfml-graphics.lib")
#endif // _WIN32
加入新文件svg_dll.cpp(如果是exe,可以参考源码的example.cpp)
#include "Svg.hpp"
#include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Window/Event.hpp>
#include "sf_svg.h"
#ifdef _WIN32
#pragma comment(lib,"sfml-system-d.lib")
/* 可能不用下面这个,这个lib是我用来显示测试的 */
#pragma comment(lib,"sfml-window-d.lib")
#endif // _WIN32
//这是最简单的实现
void svg2png(const char *svg_file, const char *png_file)
{
/* Create image */
sfc::SVGImage img;
/* Don't show debug lines */
img.setMode(sfc::DrawMode::NORMAL);
/* Load SVG image from file */
img.loadFromFile(svg_file);
/* Rasterize image */
img.rasterize().saveToFile(png_file);
}
新加入svg_dll.h(如果是exe,不必添加)
#ifndef SF_SVG_H
#define SF_SVG_H
extern "C" {
__declspec(dllexport) void svg2png(const char *svg_file, const char *png_file);
}
#endif // !SVG2PNG_DLL_H
最后是关于SFML库的引用,对应放进include、lib就差不多了,bin也可以放进去,避免dll丢失。
<bin32>
<bin64>
<include32>
<include64>
<lib32>
<lib64>
Base.hpp
BezierAbstractCurve.cpp
BezierAbstractCurve.hpp
BezierCubicCurve.cpp
BezierCubicCurve.hpp
BezierCurve.hpp
BezierSquareCurve.cpp
BezierSquareCurve.hpp
debug.hpp
dllmain.cpp
enums.hpp
Image.cpp
Image.hpp
Nanosvg.cpp
nanosvg.hpp
Nanosvgrastr.cpp
nanosvgrastr.hpp
nsvgpp.hpp
Path.cpp
Path.hpp
Rasterizer.cpp
Rasterizer.hpp
sf_svg_dll.cpp
sf_svg_dll.h
sf_svg_dll.vcxproj
sf_svg_dll.vcxproj.filters
sf_svg_dll.vcxproj.user
Shape.cpp
Shape.hpp
stdafx.cpp
stdafx.h
Svg.cpp
Svg.hpp
targetver.h
VertexVector.hpp
----------20200602 mark----------
sf_svg对svg的支持比较简陋,class不支持,不过这个应该很容易实现的,写个解释的功能就差不多了,可以参考nonasvg.js的实现,还有就是style里面的渐变焦点没有实现,看起来和原图有区别。