簡體   English   中英

在 .NET 中修剪 SVG 空白

[英]Trim SVG whitespace in .NET

我正在嘗試以編程方式將 SVG 文件轉換為 PNG 文件。 SVG 的邊緣有一些我想去掉的空白。 我想在轉換為 PNG 之前修剪空白,因為沒有空白的 SVG 大小將決定我需要縮放 SVG 的大小。


我發現的大多數幫助文檔都基於HTML/JavaScript 解決方案,但我需要在 .NET 中執行此操作。

這是我在幾個網站上看到的針對 HTML/JS 的普遍推薦方法:

var svg = document.getElementsByTagName("svg")[0];
var bbox = svg.getBBox();
var viewBox = [bbox.x, bbox.y, bbox.width, bbox.height].join(" ");
svg.setAttribute("viewBox", viewBox);
prompt("Copy to clipboard: Ctrl+C, Enter", svg.outerHTML);

SVG.NET似乎是領先的 .NET SVG 處理包,但文檔非常稀少。

看起來這個庫有 API 來支持推薦的 JavaScript 方法,但是當我更新ViewBox並保存時,它看起來就像原始圖像一樣。 這是我的 F# 嘗試:

let svg = SvgDocument.Open("original.svg")
let bmp1 = svg.Draw()
bmp1.Save("original.png", ImageFormat.Png)

let bounds = svg.Bounds
svg.ViewBox <- SvgViewBox(bounds.Left, bounds.Top, bounds.Width, bounds.Height)

let bmp2 = svg.Draw()
bmp2.Save("trimmed.png", ImageFormat.Png)

如果我設置斷點並檢查Bounds的值,它似乎確實代表了內容邊界框(不包括空格)。


我發現的另一種選擇是GrapeCity.Documents.Imaging 這不太受歡迎,但有更好的文檔。 但是,它似乎沒有公開我能找到的 SVG 邊界框的任何 API。


如何在 .NET 中修剪 SVG?

哈克蠻力解決方法

通用算法:

  1. 將 SVG 渲染為 BMP 而不做任何更改
  2. 迭代 BMP 的像素以找到邊界框
  3. 確定可用於適應容器中邊界框的最大比例
  4. 以正確的比例再次將 SVG 渲染為 BMP
  5. 縮小邊界框
  6. 將 BMP 裁剪到縮小的邊界框

這是一個包含所有細節的GitHub Gist

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM