You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字节数组转换为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:07:48