如何将字节数组转换为DrawingView所需的ObservableCollection<IDrawingLine>?
解决DrawingView字节数组转回ObservableCollection的问题
首先要明确:直接从图片字节数组反向生成ObservableCollection<IDrawingLine>是不可行的,因为图片是像素化的位图数据,无法还原出绘制时的矢量线条信息。正确的做法是在保存签名时,同时序列化SignatureLines集合,而非只保存图片字节。
一、修改保存逻辑:同时存储线条数据和图片字节
1. 序列化线条集合
IDrawingLine的实现类DrawingLine支持序列化,我们可以用JSON序列化工具(如System.Text.Json)将线条集合转为可存储的字节数据:
// 把SignatureLines序列化为JSON字符串 var linesJson = JsonSerializer.Serialize(SignatureLines); // 将JSON字符串转为字节数组,和图片字节一同保存 byte[] linesBytes = Encoding.UTF8.GetBytes(linesJson);
后续加载签名时,优先使用线条数据还原,能完整保留可编辑的矢量签名信息。
2. 完整保存示例
// 原有获取图片字节的逻辑保留 DrawingView sigView = new DrawingView { Lines = SignatureLines, IsMultiLineModeEnabled = true, ShouldClearOnFinish = false, LineColor = Colors.Black, LineWidth = 5, BackgroundColor = Colors.White, WidthRequest = 250, HeightRequest = 250 }; var stream1 = await sigView.GetImageStream(250, 250); byte[] sigBytes = new byte[stream1.Length]; await stream1.ReadAsync(sigBytes, 0, sigBytes.Length); // 新增序列化线条数据的逻辑 var linesJson = JsonSerializer.Serialize(SignatureLines); byte[] linesBytes = Encoding.UTF8.GetBytes(linesJson); // 将sigBytes(图片字节)和linesBytes(线条数据字节)保存到数据库/磁盘
二、加载签名:反序列化线条数据到SignatureLines
从存储中读取linesBytes后,反序列化为ObservableCollection<IDrawingLine>即可绑定到DrawingView:
// 读取存储的linesBytes string linesJson = Encoding.UTF8.GetString(linesBytes); // 反序列化为具体的DrawingLine集合(IDrawingLine的实现类) var lines = JsonSerializer.Deserialize<ObservableCollection<DrawingLine>>(linesJson); // 赋值给ViewModel的SignatureLines属性 SignatureLines = lines ?? new ObservableCollection<IDrawingLine>();
三、仅保存图片字节的补救方案
如果之前仅保存了图片字节,无法还原矢量线条,只能将图片作为静态内容显示:
// 将字节数组转为ImageSource,绑定到界面的Image控件 var imageSource = ImageSource.FromStream(() => new MemoryStream(sigBytes));
注意事项
- 序列化时需使用
DrawingLine而非IDrawingLine接口,因为接口无法直接实例化。 - 若序列化出现异常,可添加配置项处理枚举等特殊类型:
var options = new JsonSerializerOptions { Converters = { new JsonStringEnumConverter() } }; var linesJson = JsonSerializer.Serialize(SignatureLines, options);
内容的提问来源于stack exchange,提问作者user1918584
相关产品推荐
相关产品推荐

