コードの癖からこちらを参考にされていると思います(参考コードは質問に明記してください)
【C#】Windows10のOCRを使用する - かくすけのいろいろ作るブログ
WinRTを呼び出すための準備はどのようになさっていますか?
このあたり変更が度々あり、Webの情報は古くなっていることが多いです。
.NET6以降であれば、TFMにバージョンを追加するだけですぐ使えます。
デスクトップ アプリで Windows ランタイム API を呼び出す - Windows apps | Microsoft Learn
.NET6より前または.NET Frameworkは、Microsoft.Windows.SDK.Contracts
をNuGetします。
デスクトップ アプリで Windows ランタイム API を呼び出す - Windows apps | Microsoft Learn
.NET7と.NET Framework4.8でやってみましたが、問題を再現できませんでした。
変換が目的であれば、そもそもファイルに書き出す必要もありません。
方法: .NET Framework ストリームと Windows ランタイム ストリームの間で変換を行う (Windows のみ) | Microsoft Learn
cs
1using System;
2using System.Diagnostics;
3using System.Drawing;
4using System.Drawing.Imaging;
5using System.IO;
6using System.Threading.Tasks;
7using System.Windows.Forms;
8using Windows.Graphics.Imaging;
9using Windows.Media.Ocr;
10using Windows.Storage;
11
12namespace Qsf9ytkqkypzrbp
13{
14 public partial class Form1 : Form
15 {
16 public Form1()
17 {
18 InitializeComponent();
19
20 var button1 = new Button
21 {
22 Parent = this,
23 Dock = DockStyle.Fill,
24 };
25 button1.Click += button1_Click;
26 }
27
28 private async void button1_Click(object sender, EventArgs e)
29 {
30 var softwareBitmap = await GetSoftwareBitmapAsync(CaptureScreen());
31 var ocrResult = await RecognizeTextAsync(softwareBitmap);
32 Debug.WriteLine(ocrResult.Text);
33
34 softwareBitmap = await GetSoftwareBitmapAsync2(CaptureScreen());
35 ocrResult = await RecognizeTextAsync(softwareBitmap);
36 Debug.WriteLine(ocrResult.Text);
37 }
38
39 private Bitmap CaptureScreen()
40 {
41 var size = Screen.PrimaryScreen.Bounds.Size;
42 var bitmap = new Bitmap(size.Width, size.Height);
43 using (var g = Graphics.FromImage(bitmap))
44 {
45 g.CopyFromScreen(new Point(), new Point(), bitmap.Size);
46 }
47 return bitmap;
48 }
49
50 private async Task<SoftwareBitmap> GetSoftwareBitmapAsync(Bitmap bitmap)
51 {
52 var folder = Directory.GetCurrentDirectory();
53 var name = "tmp.png";
54 bitmap.Save(Path.Combine(folder, name), ImageFormat.Png);
55
56 var appFolder = await StorageFolder.GetFolderFromPathAsync(folder);
57 var bmpFile = await appFolder.GetFileAsync(name);
58
59 SoftwareBitmap softwareBitmap;
60 using (var stream = await bmpFile.OpenAsync(FileAccessMode.Read))
61 {
62 var decoder = await BitmapDecoder.CreateAsync(stream);
63 softwareBitmap = await decoder.GetSoftwareBitmapAsync();
64 }
65
66 File.Delete(Path.Combine(folder, name));
67 return softwareBitmap;
68 }
69
70 private async Task<SoftwareBitmap> GetSoftwareBitmapAsync2(Bitmap bitmap)
71 {
72 using (var memoryStream = new MemoryStream())
73 {
74 bitmap.Save(memoryStream, ImageFormat.Png);
75 using (var stream = memoryStream.AsRandomAccessStream())
76 {
77 var decoder = await BitmapDecoder.CreateAsync(stream);
78 return await decoder.GetSoftwareBitmapAsync();
79 }
80 }
81 }
82
83 private async Task<OcrResult> RecognizeTextAsync(SoftwareBitmap snap)
84 {
85 var ocrEngine = OcrEngine.TryCreateFromUserProfileLanguages();
86 return await ocrEngine.RecognizeAsync(snap);
87 }
88 }
89}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/01/03 01:45