如何去除.NET MAUI DrawingView生成图片的灰色背景?
解决.NET MAUI DrawingView生成图片背景灰色问题
问题核心:DrawingView的GetImageStream方法仅捕获绘制的线条内容,不会包含控件的BackgroundColor(这是布局层的背景,不属于绘图内容),所以生成的图片默认背景是透明的,在某些场景下会显示为灰色(比如容器背景是灰色,或图片查看器用灰色填充透明区域)。
直接修改获取图片的逻辑,手动绘制白色背景即可解决,推荐用SkiaSharp实现跨平台的绘图逻辑:
步骤1:安装SkiaSharp依赖
在项目的NuGet包管理器中安装SkiaSharp.Views.Maui包,用于跨平台绘图。
步骤2:替换图片生成代码
将OnLineCompletedCommand中的平台特定代码替换为以下跨平台逻辑:
using SkiaSharp; using SkiaSharp.Views.Maui; private async void OnLineCompletedCommand(IDrawingLine line) { SignatureLines.Add(line); // 定义图片尺寸 int width = 500; int height = 500; // 创建SkiaSharp画布 var imageInfo = new SKImageInfo(width, height); using var surface = SKSurface.Create(imageInfo); var canvas = surface.Canvas; // 绘制白色背景 canvas.Clear(SKColors.White); // 绘制签名线条 using var paint = new SKPaint { Color = SKColors.Black, StrokeWidth = 2, IsAntialias = true, StrokeCap = SKStrokeCap.Round, // 保持线条圆润,和DrawingView一致 StrokeJoin = SKStrokeJoin.Round }; foreach (var drawLine in SignatureLines) { var skPoints = drawLine.Points.Select(p => new SKPoint((float)p.X, (float)p.Y)).ToArray(); canvas.DrawPoints(SKPointMode.Polygon, skPoints, paint); } // 将画布转为流并保存 using var image = surface.Snapshot(); using var stream = new MemoryStream(); image.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream); stream.Position = 0; SignatureBytes = stream.ToArray(); SignatureImage = new Image { Source = ImageSource.FromStream(() => new MemoryStream(SignatureBytes)) }; }
关键说明
- 手动调用
canvas.Clear(SKColors.White)绘制白色背景,确保生成的图片自带白色底色,不会出现透明/灰色背景。 - 使用SkiaSharp的绘图逻辑和DrawingView的线条属性保持一致(比如
StrokeCap、StrokeWidth),保证签名样式和绘制时一致。 - 跨平台通用,无需再写Android/iOS的平台特定代码。
额外检查
如果之前IOS代码中存在stream.Position未重置的问题,新代码已经通过stream.Position = 0解决,避免图片加载失败。
内容的提问来源于stack exchange,提问作者mbai
相关产品推荐
相关产品推荐

