📝
.NET 5, F# - Windows.Media.Ocr を使う
Windows.Media.Ocr
Windows.Media.Ocr [↗] は、画像からテキストを読み取る光学文字認識 (OCR: Optical character recognition) を行う Windows Runtime API です[1]。
環境
対象 | バージョン |
---|---|
Windows | 20H2 (19042.928) |
.NET SDK | 5.0.202 |
実装例
指定した画像ファイルからテキストを読み取り表示するサンプルです。
.fsproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0-windows10.0.19041.0</TargetFramework>
<RootNamespace>プロジェクト名</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Compile Include="Program.fs" />
</ItemGroup>
</Project>
Program.fs
let await (iAsync: Windows.Foundation.IAsyncOperation<'TResult>) =
System.WindowsRuntimeSystemExtensions.AsTask(iAsync).Result
let printOcrResult () =
let ocrEngine = Windows.Media.Ocr.OcrEngine.TryCreateFromUserProfileLanguages()
let storageFile = await <| Windows.Storage.StorageFile.GetFileFromPathAsync(@"画像ファイルの絶対パス")
let iRandomAccessStream = await <| storageFile.OpenAsync(Windows.Storage.FileAccessMode.Read)
let bitmapDecoder = await <| Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(iRandomAccessStream)
let softwareBitmap = await <| bitmapDecoder.GetSoftwareBitmapAsync()
let ocrResult = await <| ocrEngine.RecognizeAsync(softwareBitmap)
printfn "%s" ocrResult.Text
printOcrResult()
解説
Windows Runtime API の参照
.NET 5 の場合 は .fsproj
ファイル内、TargetFramework
の値に Windows のバージョンを示す下記の文字列を設定します。
ターゲット | 値 |
---|---|
Windows 10 Version 1809 | net5.0-windows10.0.17763.0 |
Windows 10 Version 1903 | net5.0-windows10.0.18362.0 |
Windows 10 Version 2004 | net5.0-windows10.0.19041.0 |
言語の設定
選択できる言語は Windows の言語パック [↗] に依存しています。
使用可能な言語の一覧を表示する
let languages = Windows.Media.Ocr.OcrEngine.AvailableRecognizerLanguages
for l in languages do
printfn "%s: %s" l.LanguageTag l.DisplayName
使用可能な言語を自動で設定する
let ocrEngine = Windows.Media.Ocr.OcrEngine.TryCreateFromUserProfileLanguages()
言語を明示的に設定する
言語タグ (BCP47) で指定します。
let language = new Windows.Globalization.Language("en")
let ocrEngine = Windows.Media.Ocr.OcrEngine.TryCreateFromLanguage(language)
非同期処理
Windows Runtime API の非同期メソッドが返す IAsyncOperation<TResult> [↗] の結果を取得するために Task<TResult> [↗] に変換します[2]。
let await (iAsync: Windows.Foundation.IAsyncOperation<'TResult>) =
System.WindowsRuntimeSystemExtensions.AsTask(iAsync).Result
または
open System
let await (iAsync: Windows.Foundation.IAsyncOperation<'TResult>) =
iAsync.AsTask().Result
end
-
Windows 10 にて標準搭載。
NuGet 版: Microsoft.Windows.Ocr [↗] ↩︎ -
意訳: .NET では IAsyncOperation<TResult> を Task<TResult> に変換すると便利。
https://docs.microsoft.com/ja-jp/uwp/api/windows.foundation.iasyncoperation-1#remarks ↩︎
Discussion