【笔记】svg2png

  最近做了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里面的渐变焦点没有实现,看起来和原图有区别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Golang中,你可以使用第三方库来实现SVG转换为PNG的功能。一个常用的库是github.com/ajstarks/svgo。以下是一个简单的示例代码,演示了如何使用该库将SVG转换为PNG: ```go package main import ( "fmt" "github.com/ajstarks/svgo" "image/png" "os" ) func main() { // 创建一个新的PNG文件 file, err := os.Create("output.png") if err != nil { fmt.Println("无法创建PNG文件:", err) return } defer file.Close() // 创建一个SVG绘图上下文 canvas := svg.New(png.Writer(file), true) // 在SVG上下文中绘制图像 canvas.Start(500, 500) canvas.Circle(250, 250, 200, "fill:none;stroke:black") canvas.End() // 完成绘制并将SVG转换为PNG canvas.Flush() fmt.Println("SVG转换为PNG成功") } ``` 在这个示例中,我们使用svgo库创建了一个SVG绘图上下文,并在其中绘制了一个圆形。然后,我们使用png.Writer将SVG转换为PNG,并将结果保存到output.png文件中。 请注意,这只是一个简单的示例,你可以根据自己的需求进行更复杂的SVG转换操作。同时,你也可以使用其他的SVG转换库,根据你的具体需求选择合适的库进行使用。 #### 引用[.reference_title] - *1* *2* *3* [svg转换pngsvgpng格式步骤](https://blog.csdn.net/qs1137981843/article/details/129086583)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值