Files
community/Ink Canvas/Helpers/InkRecognizeHelper.cs
T

112 lines
3.8 KiB
C#
Raw Normal View History

2026-03-28 18:30:40 +08:00
using System.Threading.Tasks;
2025-05-25 09:29:48 +08:00
using System.Windows.Ink;
namespace Ink_Canvas.Helpers
{
2026-05-01 23:54:24 +08:00
/// <summary>
/// 墨迹形状/手写识别的对外门面。
/// IACore 路径通过 IPC 调用 x86 辅助进程;WinRT 路径在主进程内直接调用。
/// 主进程 (.NET 6 x64) 不再直接引用 IAWinFX 类型。
/// </summary>
2025-05-25 09:29:48 +08:00
public class InkRecognizeHelper
{
2026-03-28 17:40:14 +08:00
public static InkShapeRecognitionResult RecognizeShapeUnified(
StrokeCollection strokes,
ShapeRecognitionEngineMode mode)
{
if (strokes == null || strokes.Count == 0)
return InkShapeRecognitionResult.Empty;
if (ShapeRecognitionRouter.ResolveUseWinRt(mode))
2026-03-28 18:30:40 +08:00
return InkShapeRecognitionResult.Empty;
2026-03-28 17:40:14 +08:00
2026-05-01 23:54:24 +08:00
return IpcIACoreClient.Instance.Recognize(strokes);
2026-03-28 17:40:14 +08:00
}
2026-03-28 18:30:40 +08:00
public static Task<InkShapeRecognitionResult> RecognizeShapeUnifiedAsync(
StrokeCollection strokes,
ShapeRecognitionEngineMode mode)
{
if (strokes == null || strokes.Count == 0)
return Task.FromResult(InkShapeRecognitionResult.Empty);
return InkRecognitionManager.Instance.RecognizeShapeAsync(strokes, mode);
}
2026-03-28 17:40:14 +08:00
public static void WarmupShapeRecognition(ShapeRecognitionEngineMode mode)
{
try
{
if (ShapeRecognitionRouter.ResolveUseWinRt(mode))
2026-03-29 12:24:13 +08:00
{
2026-03-28 17:40:14 +08:00
WinRtInkShapeRecognizer.Warmup();
2026-03-29 12:24:13 +08:00
WinRtHandwritingRecognizer.Warmup();
}
2026-03-28 17:40:14 +08:00
else
2026-05-01 23:54:24 +08:00
{
IpcIACoreClient.Instance.Start();
}
2026-03-28 17:40:14 +08:00
}
catch
{
// 预热失败不影响启动
}
}
2026-03-29 12:24:13 +08:00
public static Task<HandwritingRecognitionResult> RecognizeHandwritingUnifiedAsync(
StrokeCollection strokes,
ShapeRecognitionEngineMode mode) =>
InkRecognitionManager.Instance.RecognizeHandwritingAsync(strokes, mode);
public static Task<StrokeCollection> CorrectHandwritingStrokesUnifiedAsync(
StrokeCollection strokes,
ShapeRecognitionEngineMode mode) =>
InkRecognitionManager.Instance.CorrectInkAsync(
strokes,
mode,
MainWindow.Settings?.InkToShape?.EnableWinRtHandwritingStrokeBeautify ?? false,
MainWindow.Settings?.InkToShape?.HandwritingCorrectionFontFamily);
public static Task<StrokeCollection> CorrectHandwritingStrokesUnifiedAsync(
StrokeCollection strokes,
ShapeRecognitionEngineMode mode,
bool applyHandwritingBeautify) =>
InkRecognitionManager.Instance.CorrectInkAsync(
strokes,
mode,
applyHandwritingBeautify,
MainWindow.Settings?.InkToShape?.HandwritingCorrectionFontFamily);
2025-05-25 09:29:48 +08:00
public static bool IsContainShapeType(string name)
{
2026-04-19 08:10:45 +08:00
if (string.IsNullOrEmpty(name))
return false;
2026-05-01 23:54:24 +08:00
return name.Contains("Triangle") || name.Contains("Circle") ||
name.Contains("Rectangle") || name.Contains("Diamond") ||
name.Contains("Parallelogram") || name.Contains("Square") ||
name.Contains("Ellipse");
2025-05-25 09:29:48 +08:00
}
}
public enum RecognizeLanguage
{
SimplifiedChinese = 0x0804,
TraditionalChinese = 0x7c03,
English = 0x0809
}
public class Circle
{
2026-05-01 23:54:24 +08:00
public Circle(System.Windows.Point centroid, double r, Stroke stroke)
2025-05-25 09:29:48 +08:00
{
Centroid = centroid;
R = r;
Stroke = stroke;
}
2026-05-01 23:54:24 +08:00
public System.Windows.Point Centroid { get; set; }
2025-05-25 09:29:48 +08:00
public double R { get; set; }
public Stroke Stroke { get; set; }
}
2026-05-01 23:54:24 +08:00
}