怎么将SVG转成PNG(.NET工具包编写)


一天,作者在深圳湾吹风时突然想到自己还有 20 多位粉丝,所以决定每周至少要水一篇文章。

众所周知,一篇文章要有封面,正痛苦时,.NET 官方网站更新了一大波质量上乘的插图;高兴之余,发觉平台不支持 SVG 图片,所以有了这篇文章。

不过在这里,我劝!各位年轻人,耗自为汁,不要再耍这种聪明,小聪明,啊!互联网还是要讲版权,不要搞窝里斗。

介绍


首先进行简单介绍,若已有了解可跳过该小节。

SVG 是一种基于 XML 语法的图像格式,全称是可缩放矢量图(Scalable Vector Graphics)。其他图像格式都是基于像素处理的,SVG 则是属于对图像的形状描述,所以它本质上是文本文件,体积较小,且不管放大多少倍都不会失真。

阮一峰的网络日志《SVG 图像入门教程》http://www.ruanyifeng.com/blog/2018/08/svg.html

PNG 是一种采用从 LZ77 派生的无损数据压缩算法的位图格式,其压缩比高,生成文件体积小。

百度百科《PNG》https://baike.baidu.com/item/png

稍微总结,SVG 文本体积小、缩放不失真,PNG无损、压缩比高、背景透明,需要详细了解请打开上面的链接进行学习。

SVG.NET


微软开源网站上有一个 SVG 项目(svg.codeplex.com),但是因为年代久远长时间没有维护,并且没有发布 Nuget 包;后来有组织将代码维护到了 GitHub(github.com/vvvv/SVG),沿用了微软的协议(MS-PL),并且发布了 Nuget 包,使用非常简单:

PM> Install-Package Svg
var svg = SvgDocument.Open("dotnet.svg");
Bitmap image = svg.Draw();
image.Save("dotnet.png");

上述代码中,调用 Draw 方法绘制图片时没有设置宽高,所以会使用 SVG 文档中默认的宽高,这样转换出来的图片分辨率可能会略低,可以按照原有比例进行放大:

var svg = SvgDocument.Open("dotnet.svg");float width = svg.ViewBox.Width * 4;
float height = svg.ViewBox.Height * 4;Bitmap image = svg.Draw((int)width, (int)height);
image.Save("dotnet.png");

顺便提一下,该包以及其依赖包会涉及到多种开源协议:MIT、MS-PL、LGPL;主要说明一下 MS-PL 和 LGPL,都可以作为类库引用到商业软件中。

到此,SVG 转换为 PNG 已经完成,如果需要继续了解 .NET 工具包制作请继续往下。

工具包制作


.NET Core 工具是一种特殊的 NuGet 包,其中包含控制台应用程序。

微软官方文档《管理工具》https://aka.ms/global-tools

即可以通过命令 dotnet tool 进行工具的安装/卸载/管理,详情请阅读官方教程。

首先,我们选择一个包来简化程序参数解析等处理过程:

PM> Install-Package McMaster.Extensions.CommandLineUtils

该程序也是之前一直在微软内部作为共享代码使用,然后作为 extensions 产品的一部分发布成了 Nuget 包,但是后来放弃并邀请社区维护;社区接力后,添加了很多诸如依赖注入等有趣的功能,现微软推荐大家使用该社区维护版本。深度使用请阅读其 GitHub 上的 Readme。

首先我们定义需要接收的数据,SVG 目录、PNG 目录、放大倍数:

internal interface IOptions
{public string SvgDir { get; set; }public string PngDir { get; set; }public int Enlarge { get; set; }
}

然后编写 Command 类,CommandLineUtils 会根据该类生成帮助文档,以及接收并处理用户输入:

internal class Command : IOptions
{[Option(Description = "SVG 图片目录")]public string SvgDir { get; set; }[Option(Description = "PNG 图片目录")]public string PngDir { get; set; }[Option(Description = "放大倍数")]public int Enlarge { get; set; }public void OnExecute(){Handler handler = new(){Options = this,};handler.Handle();}
}

最后在 Program.cs 中将 CommandLineUtils 对接到程序入口:

using McMaster.Extensions.CommandLineUtils;CommandLineApplication.Execute<Command>(args);

至此,该工具的主要流程已完成,但是要真正运行还需要编写 Command 中调用的 Handler 类,该类主要逻辑是将 SVG 转为 PNG,上述章节已有讲解;其整个类还有其他文件操作、异常处理代码,全部列出会占用较多篇幅,不想动手的同学可以直接点击文章尾部的 原文链接 到 GitHub 下载源代码。

最后,制作工具包还需要在项目文件中配置:

<PackAsTool>true</PackAsTool>
<ToolCommandName>svg2png</ToolCommandName>

将编译生成的 Nuget 包发布到 nuget.org 中,过程略。

使用 svg2png


安装 svg2png

PS> dotnet tool install -g svg2png

查看帮助

PS> svg2png -h
Usage: svg2png [options]Options:-s|--svg-dir <SVG_DIR>  SVG 图片目录-p|--png-dir <PNG_DIR>  PNG 图片目录-e|--enlarge <ENLARGE>  放大倍数-?|-h|--help            Show help information

转换

PS> svg2png -s E:\svg2png -p E:\output -e 4

END

祝编码愉快。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ghelper怎么在手机上用_当长时间不用手机玩《崩坏3》、《战双》

崩坏3、战双&#xff0c;虽然是手机游戏&#xff0c;作为一个PC党&#xff0c;我还是热衷于用电脑玩游戏。用电脑玩游戏可以把画质全部开到最大&#xff0c;依旧可以顺畅地进行游戏。手机就不行&#xff0c;即使是苹果&#xff0c;把画质拉满&#xff0c;依旧会有卡顿。特别是崩…

System.Text.Json中时间格式化

转自&#xff1a;Rayomcnblogs.com/Rayom/p/13967415.html简介.Net Core 3.0开始全新推出了一个名为System.Text.Json的Json解析库&#xff0c;用于序列化和反序列化Json&#xff0c;此库的设计是为了取代Json.Net(Newtonsoft.Json)时间格式化的不足System.Text.Json的优点就不…

windows server 启用 vss_windows服务器常用的安全加固方法

Windows操作系统本身已经提供了多种安全机制&#xff0c;如标识与鉴别、访问控制、用户账户控制、安全审计、文件系统。但是&#xff0c;这并不意味着操作系统就固若金汤。事实上&#xff0c;任何一个Windows版本都或多或少的存在着漏洞&#xff0c;而且在不断的被挖掘出来。Wi…

说说 C# 9 新特性的实际运用

前言你一定会好奇&#xff1a;“老周&#xff0c;你去哪开飞机了&#xff1f;这么久没写博客了。”老周&#xff1a;“我买不起飞机&#xff0c;开了个铁矿&#xff0c;挖了一年半的石头。谁知铁矿垮了&#xff0c;压死了几条蜈蚣&#xff0c;什么也没挖着。”所以&#xff0c;…

thinkpad笔记本散热风扇_十代酷睿笔记本低至2999元 你可以入手了_笔记本新闻

这年头3000元能干什么&#xff1f;买一套化妆品还是一套乐高积木&#xff1f;现在很严肃地告诉你&#xff0c;可以买一台笔记本&#xff0c;而且是搭载英特尔第十代酷睿处理器的轻薄笔记本——联想ThinkPad 翼14 Slim。联想ThinkPad 翼14 Slim轻薄笔记本其搭载了英特尔十代酷睿…

BenchmarkDotNet v0.12x新增功能

起因在看.Net 官方博客 .Net 5性能优化 中,发现测试性能的BenchmarkDotNet版本已经是v0.12.1,然后去看BenchmarkDotNet文档,发现还是有不少新的特性.v0.12.0支持多个运行时(API改进),增加对.Net 5支持支持DotNet创建BenchmarkDotNet项目(项目模版)增加NativeMemoryProfiler(目前…

centos amd双显卡_PCIe4.0和PCIe3.0对显卡性能差别大吗?

众所周知&#xff0c;AMD X570、B550主板&#xff0c;包括RX3000系列显卡&#xff0c;率先支持了PCIe 4.0协议&#xff0c;高达32GB/s带宽&#xff0c;相比现在的PCIe3.0带宽足足翻了一倍&#xff0c;也是AMD新平台一大卖点&#xff0c;然而intel却无动于衷&#xff0c;并各种表…

我画着图,FluentAPI 她自己就生成了

在 Newbe.ObjectVistor 0.3 版本中我们非常兴奋的引入了一个紧张刺激的新特性&#xff1a;使用状态图来生成任意给定的 FluentAPI 设计。开篇摘要 在非常多优秀的框架中都存在一部分 FluentAPI 的设计。这种 API 设计更加符合人类自言语言描述。使得代码更加具备可读性。在 New…

java爬虫基础知识,Java网络爬虫基础知识

引言Java 网络爬虫具备很好的扩展性可伸缩性&#xff0c;其是目前搜索引擎开发的重要组成部分。例如&#xff0c;著名的网络爬虫工具 Nutch 便是采使用 Java 开发&#xff0c;该工具以 Apache Hadoop 数据结构为依托&#xff0c;提供了良好的批解决支持。Java 网络爬虫涉及到 J…

.NET5都来了,你还不知道怎么部署到linux?最全部署方案,总有一款适合你

随着2020进入4季度&#xff0c;.NET5正式版也已经与大家见面了。不过&#xff0c;尽管 .NET Core发布已经有四五年的时间&#xff0c;但到目前为止&#xff0c;依旧有很多.NET开发者在坚守者.NET4&#xff0c;原因不尽相同&#xff0c;但最大的问题可能还是不熟悉Linux&#xf…

好用的平板电脑_平板选择华为M6,这里有几点建议

大家好&#xff0c;我是师兄。平板几乎已经成大学生生活中必备的物品之一了&#xff0c;现在的学生实在是太会享受了。作为华为M6的重度使用用户&#xff0c;在这里给大家在购买华为平板M6时提几点建议。1.质量挺好的&#xff0c;品制有保证购买华为平板M6已经半年了&#xff0…

读取oracle bfile字段,ORACLE中BFILE字段的使用研究_oracle

因为做项目&#xff0c;需要使用BFILE字段存储图像文件&#xff0c;所以进行了一些研究。bfile字段实际的文件存储在文件系统中,字段中存储的是文件定位指针.bfile对oracle来说是只读的,也不参与事务性控制和数据恢复bfile的基本操作如下&#xff1a;1.先在oracle数据库中下面我…

客户的一个紧急bug,我用了两种方式进行 C# 反编译修改源码

一&#xff1a;背景 1. 讲故事周五下午运营反馈了一个紧急bug&#xff0c;说客户那边一个信息列表打不开&#xff0c;急需解决&#xff0c;附带的日志文件也发过来了&#xff0c;看了下日志大概是这样的&#xff1a;日期:2020-11-13 12:25:45,923 线程ID:[3924] 日志级别:INFO …

离线语音识别软件_从音乐识别软件起家,这家公司如何备战车载AI语音市场GGAI对话...

加入高工智能汽车专业行业群(自动驾驶5群&#xff0c;车联网智能座舱3群&#xff0c;智能网联商用车2群)&#xff0c;加微信&#xff1a;17157613659&#xff0c;出示名片&#xff0c;仅限智能网联汽车软硬件供应商及OEM厂商。早在2016年&#xff0c;亚马逊推出的语音助手Alexa…

int函数在Oracle,vb中int是什么意思 ?

VB语言中int函数的意思是取整数。即&#xff1a;int(x)函数是取不大于x的最大整数。例如&#xff1a;1、int(4.88)4int(4.88)即是取一个不大于4.88且最接近4.88的整数&#xff0c;所以int(4.88)4。2、int(8.1)8int(8.1)即是取一个不大于8.1且最接近8的整数&#xff0c;所以int(…

windows如何添加本机dns记录_运维必看!超清晰的 DNS 原理入门指南

来源&#xff1a;阮一峰的网络日志作者&#xff1a;阮一峰链接&#xff1a;http://www.ruanyifeng.com/blog/2016/06/dns.htmlDNS 是互联网核心协议之一。不管是上网浏览&#xff0c;还是编程开发&#xff0c;都需要了解一点它的知识。本文详细介绍DNS的原理&#xff0c;以及如…

天际数见数据质量巡检架构优化

源宝导读&#xff1a;天际数见平台是一个数据可视化的BI平台&#xff0c;定位于为高层决策提供数据可视化赋能。数据准确性是生命线&#xff0c;如何提前发现数据问题&#xff0c;快速定位和修复问题&#xff0c;成为我们必须攻克的难点。本文将介绍数见平台通过架构优化&#…

db2 删除存储过程_蚂蚁金服OceanBase挑战TPCC | TPCC基准测试之存储优化

蚂蚁金服自研数据库 OceanBase 登顶 TPC-C 引起业内广泛关注&#xff0c;为了更清楚的展示其中的技术细节&#xff0c;我们特意邀请 OceanBase 核心研发人员对本次测试进行技术解读&#xff0c;共包括五篇&#xff1a;1)TPC-C基准测试介绍2)OceanBase如何做TPC-C测试3)TPC-C基准…

Github Actions 中 Service Container 的使用

Github Actions 中 Service Container 的使用Intro之前写过一个 StackExchange.Redis 的一个扩展&#xff0c;测试项目依赖 redis&#xff0c;所以之前测试一直只是在本地跑一下&#xff0c;最近通过 Github Action 中的 Service Container 来通过 CI 来跑测试&#xff0c;分享…

深度探秘.NET 5.0

2020 中国.NET 开发者峰会正式启动 &#xff0c;欢迎大家提交演讲主题或者购买超级早鸟票。今年11月10号 .NET 5.0 如约而至。这是.NET All in one后的第一个版本&#xff0c;虽然不是LTS(Long term support)版本&#xff0c;但是是生产环境可用的。微软从.NET 5 Preview 1就开…