toDataURL() 无法在 Blazor Webassembly 中使用 JS 互操作保存 HTML5 画布的内容?

Posted

技术标签:

【中文标题】toDataURL() 无法在 Blazor Webassembly 中使用 JS 互操作保存 HTML5 画布的内容?【英文标题】:toDataURL() can't save contents of HTML5 canvas with JS Interop in Blazor Webassembly? 【发布时间】:2021-12-07 19:56:59 【问题描述】:

我正在尝试使用 Blazor Wasm 作为学习练习来构建一个基本的绘图应用程序。通过 Blazor.Extensions.Canvas 提供的 API 绘制到画布似乎工作正常,但我正在尝试将画布的内容保存到 PNG 并且我遇到了问题。由于在 Blazor.Extensions.Canvas 提供的 C# 包装器中没有此方法,因此我在 index.html 的脚本标记内有一个简单的 JS 函数:

function saveCanvasContents(canvcont) //this parameter is supposed to be the canvas context object

    return canvcont.toDataURL();

从 C# 组件调用如下:

Object testObject = await jsRuntime.InvokeAsync<Object>("saveCanvasContents", new object[] _context);

_context 这里是 Blazor Extensions Canvas 的上下文,由_context = await CanvasReference.CreateCanvas2DAsync();OnAfterRenderAsync 中生成。

无论如何,运行它会在浏览器控制台中生成Microsoft.JSInterop.JSException: canvcont.toDataURL is not a function。我的直觉是,这是因为我传递的不是 HTMLCanvasElement,因此没有 toDataURL。将对画布组件的引用(上面的 CanvasReference,它的类型为 BECanvasComponent)传递给它具有相同的结果。我是否误解了 Blazor 的 JS interop / JS 的基本知识,还是在 Blazor 中有更好的方法来解决这个问题?

【问题讨论】:

【参考方案1】:

想通了。我必须通过_context.Canvas 的方法。我传递给它的所有其他内容都是指一个 BECanvas 组件,它包装了一个 HTML5 画布,而不是一个常规的旧 HTML 画布,因此其中一个没有 toDataURL 方法是有道理的。祝以后发现这个的人好运。

【讨论】:

以上是关于toDataURL() 无法在 Blazor Webassembly 中使用 JS 互操作保存 HTML5 画布的内容?的主要内容,如果未能解决你的问题,请参考以下文章

node.js用uploadify上传本地图片后,把它放到canvas,无法使用todataurl()方法

如何在没有 Blazor Web 组件的情况下从 JavaScript 使用 C# WebAssemly

无法在 Blazor 中移动 div

寻找 toDataUrl 指导

Blazor - 无法从“方法组”转换为“EventCallback”

无法呈现 Blazor 组件