Windows10はOCR機能が搭載されており各プログラムから使用することができます。.NetFramework 4.Xの場合は、 Microsoft.Windows.SDK.ContractsやWindows.Media.Ocrを使てOCRライブラリを呼び出す必要がありました。しかし、.Net6以降は追加ライブラリなしで使用することができます。
WPFでのOCRの使い方のサンプルコードを記載しますので参考ください。
1. WPFのプロジェクト作成する
2.プロジェクトのターゲットOSバージョンをWindows10以降にする
3.MainWindow.xmlにコントロールを配置する
<Window x:Class="SimpleOCR.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SimpleOCR"
mc:Ignorable="d"
Title="MainWindow" Height="800" Width="400">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="400" />
<RowDefinition Height="2" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Label
x:Name="lblPath"
Grid.Row="0"
Width="92"
Margin="10,18,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
HorizontalContentAlignment="Right"
Content="ファイルパス:" />
<TextBox
x:Name="txtPath"
Grid.Row="0"
Margin="110,18,175,0"
VerticalAlignment="Top" />
<Button
Name="btnPath"
Grid.Row="0"
Width="70"
Margin="0,18,100,0"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Click="btnPath_Click"
Content="参照..."
FontSize="12" />
<Button
Name="btnOcr"
Grid.Row="0"
Width="85"
Margin="0,18,10,0"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Click="btnOcr_Click"
Content="OCR実行"
FontSize="12" />
<Image
x:Name="ImgTarget"
Grid.Row="0"
Margin="10,55,10,10" />
<GridSplitter Grid.Row="1" Height="4" HorizontalAlignment="Stretch" />
<TextBox
Name="txtOcrResult"
Grid.Row="2"
Margin="10,10,10,10"
AcceptsReturn="True"
TextWrapping="Wrap"
VerticalScrollBarVisibility="Auto" />
</Grid>
</Window>
4. MainWindowcsにコード実装
using Microsoft.Win32; using System; using System.Diagnostics; using System.IO; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media.Imaging; using Windows.Graphics.Imaging; using Windows.Media.Ocr; namespace SimpleOCR { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private async Task<SoftwareBitmap> ConvertSoftwareBitmap(Image image) { SoftwareBitmap? sbitmap = null; using (MemoryStream stream = new MemoryStream()) { //BmpBitmapEncoderに画像を書きこむ var encoder = new BmpBitmapEncoder(); encoder.Frames.Add((System.Windows.Media.Imaging.BitmapFrame)image.Source); encoder.Save(stream); //メモリストリームを変換 var irstream = WindowsRuntimeStreamExtensions.AsRandomAccessStream(stream); //画像データをSoftwareBitmapに変換 var decorder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(irstream); sbitmap = await decorder.GetSoftwareBitmapAsync(); } return sbitmap; } private async Task<OcrResult> RunOcr(SoftwareBitmap sbitmap) { //OCRを実行する OcrEngine engine = OcrEngine.TryCreateFromLanguage(new Windows.Globalization.Language("ja-JP")); var result = await engine.RecognizeAsync(sbitmap); return result; } private async void btnPath_Click(object sender, RoutedEventArgs e) { ImgTarget.Source = null; txtPath.Text = ""; await Task.Delay(10); //画像ファイルのパスを取得 txtPath.Text = SelectPath(); if (txtPath.Text != "") { //画像ファイルの読み込み ImgTarget.Source = System.Windows.Media.Imaging.BitmapFrame.Create(new Uri(txtPath.Text, UriKind.Absolute), BitmapCreateOptions.None, BitmapCacheOption.OnLoad); } } private string SelectPath() { var path = ""; // ダイアログのインスタンスを生成 var dialog = new OpenFileDialog(); // ファイルの種類を設定 dialog.Filter = "Image File(*.bmp, *.jpg, *.png, *.tif) | *.bmp; *.jpg; *.png; *.tif | Bitmap(*.bmp) | *.bmp | Jpeg(*.jpg) | *.jpg | PNG(*.png) | *.png"; // ダイアログを表示する if (dialog.ShowDialog() == true) { // 選択されたファイル名を取得 path = dialog.FileName; } return path; } private async void btnOcr_Click(object sender, RoutedEventArgs e) { //OCRの実行処理 var sbitmap = await ConvertSoftwareBitmap(ImgTarget); txtOcrResult.Text = (await RunOcr(sbitmap)).Text; } } }
0 件のコメント :
コメントを投稿