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
相关产品推荐
相关产品推荐

