当前位置: 首页 > 工具软件 > svg2png > 使用案例 >

【笔记】svg2png

容飞掣
2023-12-01

  最近做了emf2svg的工程,发现转出来的svg不能重新导入ppt,所以搞了个svg2png。这些功能很多都是有比较完善的代码,只是在windows下搞会比较麻烦。这次我测试的是sf_svg(github上找一下),需要SFMLhttp-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里面的渐变焦点没有实现,看起来和原图有区别。

 类似资料: