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

UWP InkCanvas调用LoadAsync加载JPG时报HRESULT E_FAIL COM组件错误

问题根因与解决方案

错误原因

你触发异常的核心原因是:InkStrokeContainer.LoadAsync() 方法仅支持读取*墨水序列化格式(ISF, Ink Serialized Format)*的专用笔迹数据,你当前保存的是渲染后的JPG位图文件,格式完全不匹配,因此会抛出COM组件调用失败的E_FAIL异常。
同时你现有加载逻辑存在冗余问题:重复读取了两次同路径文件,定义的inkFile变量未使用,开启inputStream后却将未重置指针的stream传入加载方法,也会增加异常概率。

解决方案

方案1:保留笔迹可编辑能力(适配你选中、重排的需求,推荐)

你需要在保存阶段同时输出两份文件:一份JPG用于预览,一份ISF格式的源笔迹数据用于后续加载编辑。

保存逻辑修改

在原有JPG保存逻辑的基础上,新增ISF笔迹保存代码:

StorageFolder storageFolder = await StorageFolder.GetFolderFromPathAsync(fileNotesFolderPath);
string fileName = App._PreparedFor + "_" + App._Date + "_PageID_" + App._CoverPageID;
// 原有JPG预览保存逻辑保留
var jpgFile = await storageFolder.CreateFileAsync(fileName + ".jpg", CreationCollisionOption.ReplaceExisting);
CanvasDevice device = CanvasDevice.GetSharedDevice();
CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, (int)myInkCanvas.ActualWidth, (int)myInkCanvas.ActualHeight, 96);
using (var ds = renderTarget.CreateDrawingSession())
{
    ds.Clear(Windows.UI.Colors.White);
    ds.DrawInk(myInkCanvas.InkPresenter.StrokeContainer.GetStrokes());
}
using (var fileStream = await jpgFile.OpenAsync(FileAccessMode.ReadWrite))
{
    await renderTarget.SaveAsync(fileStream, CanvasBitmapFileFormat.Jpeg, 1f);
}

// 新增:保存ISF格式笔迹源文件
var isfFile = await storageFolder.CreateFileAsync(fileName + ".isf", CreationCollisionOption.ReplaceExisting);
using (var isfStream = await isfFile.OpenAsync(FileAccessMode.ReadWrite))
{
    await myInkCanvas.InkPresenter.StrokeContainer.SaveAsync(isfStream);
}

加载逻辑修改

直接读取ISF文件加载笔迹即可:

StorageFolder storageFolder = await StorageFolder.GetFolderFromPathAsync(fileNotesFolderPath);
string fileName = App._PreparedFor + "_" + App._Date + "_PageID_" + App._CoverPageID;
var isfFile = await storageFolder.GetFileAsync(fileName + ".isf");
if (isfFile != null)
{
    // 先清空现有笔迹避免叠加
    myInkCanvas.InkPresenter.StrokeContainer.Clear();
    using (var stream = await isfFile.OpenAsync(FileAccessMode.Read))
    {
        await myInkCanvas.InkPresenter.StrokeContainer.LoadAsync(stream);
    }
}
// 若需要同步显示原有背景,可额外读取JPG文件赋值给InkCanvas下层的Image控件即可

方案2:仅加载已有的JPG文件(笔迹不可编辑)

如果你只有历史保存的JPG文件,无法回溯源笔迹,可以在InkCanvas下层放置一个Image控件,调整Canvas.ZIndex让Image在最底层,将JPG加载到该Image控件中即可。该方案仅能展示笔迹位图,不支持选中、编辑操作,无法适配你的重排需求。

内容的提问来源于stack exchange,提问作者Cenk Yenikoylu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:06:07