Windows 通过 Cordova 的 UWP 应用程序:将 canvas 转换为 Javascript 中 InkRecognizer 的流

Windows UWP apps via Cordova: convert canvas into stream for InkRecognizer in Javascript

我正在 Cordova 中为 Android 和 Windows 开发一个应用程序,并且难以识别 Windows 平台上 canvas 元素中的文本和数字( W10)

所以最近几天我浪费了时间尝试使用 Windows.Media.OCR 命名空间来识别我的 HTML5 canvas 涂鸦板上的手写数字参见 here on another SO question

然后我找到了 Windows.UI.Input.Inking 命名空间,类 几乎没有可用的 Javascript 解决方案。我发现有一个 InkManager 可以识别它自己的集合中的 InkStrokes 或 InkRecognizerContainer 中的笔画。

InkRecognizerContainer 具有接受输入流的 "loadAsync()" 方法。所以我想我只是加载转换为流的 canvas,并使用 InkManager 来识别这个容器。

不幸的是,如果我尝试使用 HTML5 canvas 转换为流,它会抛出我 "WIN RT: Unsepcified Error" 但不在回调中,它只会使应用程序崩溃。

var blob = canvas.msToBlob();
 var randomAccessStream = blob.msDetachStream();

 var inkStrokeContainer = new Windows.UI.Input.Inking.InkStrokeContainer();
 inkStrokeContainer.loadAsync(randomAccessStream).done(function () {
     debugger
 }, function (error) {
    console.log(error);
 });

任何帮助将不胜感激,因为我在这上面花了太多时间。

InkStrokeContainer.LoadAsync 需要一个包含墨迹笔划信息的文件,而不是任意位图。通常这将是从以前的 InkStrokeContainer 中保存出来的 ISF(墨水序列化格式)文件。 ISF 文件将笔画信息作为元数据包含在 gif 文件中,因此它们可以被普通的 gif 查看器显示,但典型的 gif 文件不包含 ISF 数据并且无法加载到 InkStrokeContainers。

InkManager 进行手写识别而不是 OCR。它需要单独的笔划信息并考虑笔划顺序和方向等属性。要使用它,您需要将指针信息传递给 InkManager,通常是在输入发生时,以便 InkManager 可以构建要识别的笔划。

查看 Simplified Ink Sample 中的示例。 JavaScript 版本使用 WinJS 而不是 Cordova,但转换起来应该不会太难。墨迹书写是 Windows 特定的,因此您需要将其放在应用的平台特定部分。