C#中PNG转SVG:解决无颜色及版权信息问题求助
哈哈,这个问题我之前帮朋友踩过坑,刚好能给你捋清楚!
一、为啥生成的SVG没颜色?
首先得戳破一个关键点:Potrace本身是专门处理单色(黑白)位图的矢量追踪工具,它压根不支持彩色。你用ImageMagick转PNM的时候,如果默认生成的是单色PNM(比如PBM格式),那Potrace输出的SVG自然只有黑白。
解决思路分两种:
优先推荐:换支持彩色追踪的工具
既然Potrace天生不支持彩色,不如直接换工具,省心太多:- Inkscape:免费开源,命令行模式就能直接转彩色SVG,效果还不错。你在C#里可以直接调用它的命令行,示例代码大概是这样:
加using System.Diagnostics; var inkscapeStartInfo = new ProcessStartInfo { FileName = "path/to/your/inkscape.exe", Arguments = "--export-type=svg --export-plain-svg input.png --output=output.svg", UseShellExecute = false, RedirectStandardOutput = true, CreateNoWindow = true }; using var process = Process.Start(inkscapeStartInfo); process?.WaitForExit();--export-plain-svg参数能去掉Inkscape自带的冗余元数据,输出干净的SVG。 - AutoTrace:比Potrace多支持一点彩色,也是开源免费的,同样可以用C#调用命令行,适合颜色不复杂的图。
- 如果预算够,VectorMagic的API是行业顶尖的,但需要付费。
- Inkscape:免费开源,命令行模式就能直接转彩色SVG,效果还不错。你在C#里可以直接调用它的命令行,示例代码大概是这样:
硬刚Potrace(适合颜色极少的图,比如logo)
要是非得用Potrace,那就得手动拆颜色通道:- 用ImageMagick把彩色PNG拆成多个单色PNM(比如每个颜色单独提取成一个黑白通道);
- 用Potrace分别把每个PNM转成SVG路径;
- 在C#里把这些SVG路径读出来,给每个路径加上对应的颜色,再合并成一个完整的彩色SVG。
这个方法比较折腾,只适合颜色特别少的场景。
二、怎么去掉SVG里的版权语句?
那些NuGet包带版权,要么是封装的原生工具本身加的(比如Potrace默认会加一行注释),要么是包作者额外加的。解决方法也很直接:
直接调用原生工具,别用NuGet包
下载官方原生的ImageMagick、Potrace(或者Inkscape),然后用C#的Process类调用命令行,完全可控。比如Potrace生成的SVG默认会有一行类似<!-- Created by potrace 1.16, written by Peter Selinger 2001-2019 -->的注释,你可以在生成后用C#直接删掉:string svgContent = File.ReadAllText("output.svg"); // 注意匹配你用的Potrace版本的注释内容 svgContent = svgContent.Replace("<!-- Created by potrace 1.16, written by Peter Selinger 2001-2019 -->", string.Empty); File.WriteAllText("output.svg", svgContent);找干净的NuGet包
有些社区维护的包不会加额外版权,搜的时候多看看用户评论,或者自己封装一个简单的调用类,完全自己把控输出。
三、最终建议
如果你的核心需求是快速生成带颜色的干净SVG,直接用Inkscape命令行是最优解——免费、开源、支持彩色,还能输出无冗余的SVG。要是必须用免费开源的追踪工具,AutoTrace比Potrace更适合彩色场景。
另外,尽量别用那些带额外版权的NuGet包,直接调用原生工具不仅灵活,还能避免各种莫名其妙的问题。
内容的提问来源于stack exchange,提问作者Sam

