使用SkiaSharp.Extended.Svg将SVG转PNG出现噪点,求解决方案
解决SkiaSharp.Extended.Svg转换SVG到PNG出现噪点的问题
嗨,我来帮你搞定这个转换后出现噪点的问题~先理清楚你的场景:用SkiaSharp.Extended.Svg 1.60.0(netcoreapp2.0)转简单SVG到PNG,结果生成的图有噪点。先看看你的原始代码:
原始SVG代码
<svg height="100" width="100"> <circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" /> </svg>
原始转换代码
// using SkiaSharp; // using SkiaSharp.Extended; // using SkiaSharp.Extended.Svg; string fromfile = "circle.svg"; string tofile = "circle.png"; SKEncodedImageFormat toencoding = SKEncodedImageFormat.Png; var svg = new SkiaSharp.Extended.Svg.SKSvg(); using (var pic = svg.Load(fromfile)) { Console.WriteLine($"{pic.CullRect.Width},{pic.CullRect.Height}"); using (var bmp = new SKBitmap((int)svg.Picture.CullRect.Width, (int)svg.Picture.CullRect.Height)) { using (var canvas = new SKCanvas(bmp)) using (var paint = new SKPaint()) { canvas.DrawPicture(svg.Picture); canvas.Flush(); canvas.Save(); using (var img = SKImage.FromBitmap(bmp)) using (var data = img.Encode(toencoding, 100)) { using (var stm = data.AsStream()) using (var ostm = File.Create(tofile)) { stm.CopyTo(ostm); } } } } }
噪点产生的原因及修复方案
出现噪点主要是这几个小问题:画布初始化不彻底、没有开启抗锯齿、绘制顺序有点混乱。下面是修改后的代码,我会标注关键调整点:
// using SkiaSharp; // using SkiaSharp.Extended; // using SkiaSharp.Extended.Svg; string fromfile = "circle.svg"; string tofile = "circle.png"; SKEncodedImageFormat toencoding = SKEncodedImageFormat.Png; var svg = new SkiaSharp.Extended.Svg.SKSvg(); using (var pic = svg.Load(fromfile)) { Console.WriteLine($"{pic.CullRect.Width},{pic.CullRect.Height}"); // 1. 用SKImageInfo明确指定Bitmap的颜色格式,选32位真彩色避免像素失真 var imgInfo = new SKImageInfo( (int)pic.CullRect.Width, (int)pic.CullRect.Height, SKColorType.Rgba8888, SKAlphaType.Premul); using (var bmp = new SKBitmap(imgInfo)) { using (var canvas = new SKCanvas(bmp)) { // 2. 先清空画布,避免残留随机像素(这是噪点的常见来源) canvas.Clear(SKColors.Transparent); // 3. 创建带抗锯齿的Paint,让图形边缘更平滑 using (var paint = new SKPaint { IsAntialias = true, FilterQuality = SKFilterQuality.High }) { // 用带抗锯齿的Paint绘制SVG Picture canvas.DrawPicture(pic, SKMatrix.Identity, paint); } // 4. 调整顺序:先刷新画布,再生成图片 canvas.Flush(); using (var img = SKImage.FromBitmap(bmp)) using (var data = img.Encode(toencoding, 100)) { using (var stm = data.AsStream()) using (var ostm = File.Create(tofile)) { stm.CopyTo(ostm); } } } } }
关键修改点说明
- 指定Bitmap格式:用
SKImageInfo创建SKBitmap,明确使用SKColorType.Rgba8888(32位真彩色)和预乘alpha模式,避免默认格式带来的像素模糊或噪点 - 清空画布:绘制前调用
canvas.Clear(),确保画布初始状态干净,不会残留随机垃圾像素 - 开启抗锯齿:给
SKPaint开启抗锯齿和高质量滤镜,消除图形边缘的锯齿状噪点 - 调整绘制顺序:去掉不必要的
canvas.Save(),绘制完成后先Flush再生成图片,避免状态混乱
这样修改后,生成的PNG应该就干净无噪点啦~
内容的提问来源于stack exchange,提问作者skitoy4321
相关产品推荐
相关产品推荐

