[.Net6][WPF]Windows10のOCRを機能を使う


 Windows10はOCR機能が搭載されており各プログラムから使用することができます。.NetFramework 4.Xの場合は、 Microsoft.Windows.SDK.ContractsWindows.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;
        }
    }
}

完全なコードは以下にあります。

https://github.com/garakutanokiseki/SinpleOCRforWin10

0 件のコメント :

コメントを投稿