怎么将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 進行工具的安裝/卸載/管理,詳情請閱讀官方教程。
首先,我們選擇一個包來簡化程序參數解析等處理過程:
該程序也是之前一直在微軟內部作為共享代碼使用,然后作為 extensions 產品的一部分發布成了 Nuget 包,但是后來放棄并邀請社區維護;社區接力后,添加了很多諸如依賴注入等有趣的功能,現微軟推薦大家使用該社區維護版本。深度使用請閱讀其 GitHub 上的 Readme。
首先我們定義需要接收的數據,SVG 目錄、PNG 目錄、放大倍數:
然后編寫 Command 類,CommandLineUtils 會根據該類生成幫助文檔,以及接收并處理用戶輸入:
最后在 Program.cs 中將 CommandLineUtils 對接到程序入口:
至此,該工具的主要流程已完成,但是要真正運行還需要編寫 Command 中調用的 Handler 類,該類主要邏輯是將 SVG 轉為 PNG,上述章節已有講解;其整個類還有其他文件操作、異常處理代碼,全部列出會占用較多篇幅,不想動手的同學可以直接點擊文章尾部的 原文鏈接 到 GitHub 下載源代碼。
最后,制作工具包還需要在項目文件中配置:
<PackAsTool>true</PackAsTool> <ToolCommandName>svg2png</ToolCommandName>將編譯生成的 Nuget 包發布到 nuget.org 中,過程略。
使用?svg2png
安裝 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轉換
END
祝編碼愉快。
總結
以上是生活随笔為你收集整理的怎么将SVG转成PNG(.NET工具包编写)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core3.1升级.NET5,
- 下一篇: System.Text.Json中时间格