Last active
June 10, 2022 19:04
-
-
Save ksasao/43879bfead8d4308290b95d84effa693 to your computer and use it in GitHub Desktop.
Windows 10 組み込みのOCRを利用するサンプル。UWP の Windows.Media.Ocr が OCR に関するクラス。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Linq; | |
using System.Text; | |
using System.Threading.Tasks; | |
using Windows.Graphics.Imaging; | |
using Windows.Media.Ocr; | |
using Windows.Storage.Streams; | |
namespace OcrAPITest | |
{ | |
// コマンドプロンプトで UWP向け OCR API を利用するサンプルコード | |
// 多言語対応や縦書きへの対応などは下記を参照 | |
// http://www.moonmile.net/blog/archives/8584 | |
// https://github.com/Microsoft/Windows-universal-samples/blob/master/Samples/OCR/cs/OcrFileImage.xaml.cs | |
// ビルドする場合には、NuGet で UWPDesktop を追加する | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
if (args.Length > 0) | |
{ | |
try | |
{ | |
WindowsOcr ocr = new WindowsOcr(); | |
string path = args[0]; | |
var result = ocr.Recognize(path); | |
foreach(var l in result.Lines) | |
{ | |
Console.WriteLine(l.Text); | |
} | |
} | |
catch (Exception ex) | |
{ | |
Console.WriteLine(ex.Message); | |
} | |
} | |
} | |
} | |
public class WindowsOcr | |
{ | |
/// <summary> | |
/// 指定した画像内に含まれる文字情報を取得します | |
/// </summary> | |
/// <param name="filename">画像ファイル名</param> | |
/// <returns>OCR結果</returns> | |
public OcrResult Recognize(string filename) | |
{ | |
Task<OcrResult> result = OcrMain(filename); | |
result.Wait(); | |
return result.Result; | |
} | |
private async Task<OcrResult> OcrMain(string filename) | |
{ | |
OcrEngine ocrEngine = OcrEngine.TryCreateFromUserProfileLanguages(); | |
var bitmap = await LoadImage(filename); | |
var ocrResult = await ocrEngine.RecognizeAsync(bitmap); | |
return ocrResult; | |
} | |
private async Task<SoftwareBitmap> LoadImage(string path) | |
{ | |
var fs = System.IO.File.OpenRead(path); | |
var buf = new byte[fs.Length]; | |
fs.Read(buf, 0, (int)fs.Length); | |
var mem = new MemoryStream(buf); | |
mem.Position = 0; | |
var stream = await ConvertToRandomAccessStream(mem); | |
var bitmap = await LoadImage(stream); | |
return bitmap; | |
} | |
private async Task<SoftwareBitmap> LoadImage(IRandomAccessStream stream) | |
{ | |
var decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(stream); | |
var bitmap = await decoder.GetSoftwareBitmapAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied); | |
return bitmap; | |
} | |
private async Task<IRandomAccessStream> ConvertToRandomAccessStream(MemoryStream memoryStream) | |
{ | |
var randomAccessStream = new InMemoryRandomAccessStream(); | |
var outputStream = randomAccessStream.GetOutputStreamAt(0); | |
var dw = new DataWriter(outputStream); | |
var task = new Task(() => dw.WriteBytes(memoryStream.ToArray())); | |
task.Start(); | |
await task; | |
await dw.StoreAsync(); | |
await outputStream.FlushAsync(); | |
return randomAccessStream; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment