Windowsに標準で搭載されているOCR機能を使ってC#で簡単なOCRアプリを作ってみる

はじめに

C#でOCRアプリを作るにはTesseractが良いと思っていました。

その記事も書きました。

touch-sp.hatenablog.com

しかし、Windowsに標準で搭載されているOCR機能を使った方が精度が高かったです。

環境

Windows11
Visual Studio Community 2026
.NET 10.0

作り方

プロジェクトの新規作成

  • Visual Studioで 「新しいプロジェクトの作成」 を選択します。

  • 「Windows フォーム アプリ」 を選択します(「Windows フォーム アプリ (.NET Framework)」ではない方を選ぶ)。

  • プロジェクト名を入力し、フレームワークの選択で [.NET 10.0]を選択する。

プロジェクト設定の変更(最重要)

  • ソリューションエクスプローラーで プロジェクト名をダブルクリック します。

  • 設定ファイル(.csproj)が開くので、以下のように書き換えます。

修正前

<TargetFramework>net10.0-windows</TargetFramework>

修正後

<TargetFramework>net10.0-windows10.0.17763.0</TargetFramework>

使用しているのがWindows11ですがこれでいいみたいです。

GUIの作成

  • フォームにボタンとテキストボックスを配置してボタンにクリックイベントを追加します。

  • テキストボックスはマルチラインにチェックして下さい。

  • Form1.csのコードをこのようにします。

using Windows.Graphics.Imaging;
using Windows.Media.Ocr;

namespace ocr
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            try
            {
                // 1. クリップボード確認(ここにメッセージボックスを入れると動作確認になります)
                if (!Clipboard.ContainsImage())
                {
                    MessageBox.Show("画像がありません");
                    return;
                }

                using Bitmap? bitmap = (Bitmap?)Clipboard.GetImage();
                if (bitmap == null) return;

                // 2. OCRエンジンの作成
                // en-USがインストールされていない場合に備え、UserProfileLanguagesも検討してください
                var engine = OcrEngine.TryCreateFromUserProfileLanguages();
                if (engine == null)
                {
                    MessageBox.Show("OCRエンジンを起動できませんでした。Windowsの「設定 > 時刻と言語」で言語パックがインストールされているか確認してください。");
                    return;
                }

                // 3. BitmapSoftwareBitmapに変換
                using var stream = new MemoryStream();
                // ※ System.Drawing.Imaging.ImageFormat.Png と明示的に書く
                bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
                stream.Position = 0;

                var decoder = await BitmapDecoder.CreateAsync(stream.AsRandomAccessStream());
                using var softwareBitmap = await decoder.GetSoftwareBitmapAsync();

                // 4. OCR実行
                var result = await engine.RecognizeAsync(softwareBitmap);

                // 5. 結果表示
                if (result != null)
                {
                    // 確実に反映させるためにトリム
                    textBox1.Text = result.Text.Trim();
                }
            }
            catch (Exception ex)
            {
                // ここでエラーが出れば、原因が100%わかります
                MessageBox.Show($"エラーが発生しました: {ex.Message}");
            }
        }
    }
}

使い方

「Snipping Tool」または「切り取り&スケッチ」を使って画面の一部を選択しクリップボードにコピーして下さい。

その後フォーム上に配置したボタンをクリックするとテキストボックスに結果が表示されます。

実施の画面