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 件のコメント :
コメントを投稿