C# における OCR 処理のための System Drawing 画像の使用方法

C#でSystem.Drawingオブジェクトから読み取る方法#

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronOCRはBitmapImageのようなSystem.DrawingオブジェクトをOcrImageInputでラッピングすることにより、System.Drawingオブジェクトからテキストを読み取ることを可能にし、Windows、macOS、Linuxプラットフォーム上の.NETアプリケーションにシームレスなOCR機能を提供します。

System.Drawing.Bitmapは、ビットマップ イメージの操作に使用される .NET Framework のクラスです。 ビットマップ イメージを作成、操作、表示するためのメソッドとプロパティを提供します。

System.Drawing.Imageは、.NET Framework 内のすべての GDI+ イメージ オブジェクトの基本クラスです。 これは、 System.Drawing.Bitmapを含むさまざまな画像タイプの親クラスです。

IronSoftware.Drawing.AnyBitmapは、もともと Iron Software によって開発されたオープンソース ライブラリであるIronDrawingのビットマップ クラスです。 これは、C# ソフトウェア エンジニアが Windows、macOS、Linux プラットフォーム上の .NET プロジェクトでSystem.Drawing.Commonを置き換えるのに役立ちます。

クイックスタート: System.Drawing.Bitmap からテキストを読み取る

1つのステートメントで、IronTesseractを作成し、OcrImageInputでラップされたSystem.Drawing.Bitmapを送り、すべてのテキストを抽出します。 このクイックスタート例では、IronOCRが最小限のセットアップで画像を読みやすいテキストに変換する方法を示します。

```cs:title=テキストを1行で抽出する var result = new IronOcr.IronTesseract().Read(new IronOcr.OcrImageInput(new System.Drawing.Bitmap("image.png")));


<div class="hsg-featured-snippet">
    <h3>最小限のワークフロー(5ステップ)</h3>
    <ol>
        <li><a class="js-modal-open" data-modal-id="trial-license-after-download" href="https://nuget.org/packages/IronOcr/">System.Drawing オブジェクトを読み取るための C# ライブラリをダウンロードします。</a></li>
        <li>Obtain System.Drawing objects such as `Bitmap` and `Image`</li>
        <li>Construct the `OcrImageInput` class using the acquired data</li>
        <li>Utilize `AnyBitmap` from Iron Software for Linux and macOS</li>
        <li>切り抜き領域を指定して読み込みエリアを定義する</li>
    </ol>
</div>

<br class="clear">

## System.Drawing.Bitmapから読み取るには?

<!-- TODO: ここに画像を追加 -->
<!-- !![IronPDFでsystem.drawing.bitmapから読み込む方法を実演しているスクリーンショット](/static-assets/images/TODO/how-do-i-read-from-system-drawing-bitmap-step_screenshot.webp) --> <a href="/static-assets/images/TODO/how-do-i-read-from-system-drawing-bitmap-step_screenshot.webp">Screenshot demonsting how do i read from system.drawing.bitmap?
<!-- ステップバイステップのプロセスを示すスクリーンショット -->

まず、**`IronTesseract`**クラスをインスタンス化して、OCRを実行します。 さまざまなメソッドのいずれかから`System.Drawing.Bitmap`を作成します。 コード例では、ファイルパスが使用されています。

次に、 `using`ステートメントを使用して`OcrImageInput`オブジェクトを作成し、 `System.Drawing.Bitmap`オブジェクトからの画像を渡します。 最後に、 `Read`メソッドを使用して OCR を実行します。

```csharp
:path=/static-assets/ocr/content-code-examples/how-to/input-system-drawing-read-bitmap.cs

なぜOcrImageInputではusing文が重要なのですか?

usingステートメントは、OcrImageInputで作業するときに非常に重要です。OcrImageInputIDisposableを実装しており、管理されていないリソースを保持しています。 usingステートメントがないと、これらのリソースが速やかにリリースされず、メモリリークやファイルロックにつながる可能性があります。 これは、バッチ操作で複数の画像を処理する場合に特に重要です。 IronOCRにおける適切なリソース管理の詳細については、API Referenceドキュメントをご覧ください。

一般的なビットマップの読み込み方法は何ですか?

System.Drawing.Bitmapは、この例で使用したファイル パスのコンストラクタ以外にも、いくつかの読み込みメソッドを提供しています。 ストリーム (new Bitmap(stream)) や既存の Images (new Bitmap(image)) から Bitmap を作成したり、特定の寸法の空白のビットマップ (new Bitmap(width, height)) を作成することもできます。 Web アプリケーションを扱う場合、アップロードされたファイルを処理するために、ストリームからの読み込みが特に役立ちます。 埋め込みリソースについては、Assembly.GetManifestResourceStream()を使用できます。 IronOCRはOcrImageInputコンストラクタを通して、これらすべてのBitmapソースをシームレスに扱います。 さまざまな入力方法については、画像 (jpg, png, gif, tiff, bmp)ガイドをご覧ください。

いつ Bitmap オブジェクトを破棄すればよいですか?

ビットマップ廃棄のタイミングは、アプリケーションのワークフローに依存します。 OCR 用の Bitmap<//code> だけが必要な場合は、<code>OcrImageInput を作成した直後に破棄してください。 ただし、複数の操作を実行したり、画像を表示したりする必要がある場合は、すべての操作が完了するまで生かしてください。 常にusingステートメントまたはtry-finallyブロックを使用して、廃棄を確実にします。 OcrImageInputはそれ自身の内部コピーを作成するので、元のBitmapOcrImageInputの作成後に処分できることを覚えておいてください。 複数の画像操作を含む複雑なシナリオについては、OCR画像最適化フィルターの例をご検討ください。

System.Drawing.Imageから読み取るには?

System.Drawing.Imageからの読み取りは、ImageOcrImageInputオブジェクトを作成し、Readメソッドを使用して標準的なOCR処理を実行するのと同じくらい簡単です。

:path=/static-assets/ocr/content-code-examples/how-to/input-system-drawing-read-image.cs
using IronOcr;
using Image = System.Drawing.Image;

// Instantiate IronTesseract
IronTesseract ocrTesseract = new IronTesseract();

// Open image file as Image
Image image = Image.FromFile("Potter.tiff");

// Import System.Drawing.Image
using var imageInput = new OcrImageInput(image);
// Perform OCR
OcrResult ocrResult = ocrTesseract.Read(imageInput);
$vbLabelText   $csharpLabel

OCRのイメージとビットマップの違いは何ですか?

System.Drawing.Bitmapはビットマップ画像に特化した実装ですが、System.Drawing.ImageはJPEG、PNG、GIF、TIFFを含むさまざまな画像フォーマットを表現できる抽象ベースクラスです。 OCRの目的のために、IronOCRはOcrImageInputを通して両方を同じように扱いますが、Imageは異なるフォーマットを扱うときにより柔軟性を提供します。 Bitmapはピクセルレベルの操作機能を提供し、Imageは一般的な画像処理に適しています。 どちらもIronOCRの先進的なTesseract 5エンジンで同様に機能します。どちらを選ぶかはOCRの性能よりも幅広いアプリケーションのニーズによります。

なぜ他の読み込み方法ではなく Image.FromFile を使用するのですか?

Image.FromFileは、ディスクから画像を読み込むための最も単純で直接的な方法です。 画像形式を自動的に検出し、ファイルの読み込み処理を行います。 Image.FromStreamのような代替メソッドは、Webアプリケーションやメモリストリームを扱う場合に適しています。 Image.FromFileは、Imageが破棄されるまでファイルをロックします。 高いパフォーマンスや同時アクセスが必要な制作シナリオでは、まず画像をメモリストリームにロードすることを検討してください。Multithreaded Tesseract OCR の例は、同時画像処理のベスト プラクティスを示しています。

IronSoftware.Drawing.AnyBitmapから読み取るにはどうすればよいですか?

同様に、 AnyBitmapオブジェクトを作成または取得した後、 OcrImageInputクラスを構築できます。 コンストラクタは、データをインポートするために必要なすべてのステップを処理します。 以下のコード例でこれを示します。

:path=/static-assets/ocr/content-code-examples/how-to/input-system-drawing-read-anybitmap.cs
using IronOcr;
using IronSoftware.Drawing;

// Instantiate IronTesseract
IronTesseract ocrTesseract = new IronTesseract();

// Open image file as AnyBitmap
AnyBitmap anyBitmap = AnyBitmap.FromFile("Potter.tiff");

// Import IronSoftware.Drawing.AnyBitmap
using var imageInput = new OcrImageInput(anyBitmap);
// Perform OCR
OcrResult ocrResult = ocrTesseract.Read(imageInput);
$vbLabelText   $csharpLabel

なぜSystem.DrawingクラスではなくAnyBitmapを選択するのですか?

AnyBitmapは、System.Drawingクラスと比較して、優れたクロスプラットフォーム互換性を提供します。 System.Drawing.Commonは、.NET 6+ では Windows 以外のプラットフォームでのサポートが制限されていますが、AnyBitmapは Windows、Linux、および macOS 全体でシームレスに動作します。 プラットフォームに依存しない一貫したAPIを提供するため、クラウドのデプロイメントやコンテナ化されたアプリケーションに最適です。 AnyBitmapはまた、画像処理タスクのために特別に設計された、より優れたメモリ管理とパフォーマンスの最適化を提供します。 詳細な互換性情報については、互換性ドキュメントを参照してください。

AnyBitmapはどのプラットフォームをサポートしていますか?

AnyBitmapは、.NETが動作するすべての主要なプラットフォームをサポートしています:Windows(x86、x64、ARM)、Linux(Docker用のAlpine Linuxを含む)、macOS(IntelとApple Siliconの両方)です。 このように幅広いプラットフォームをサポートしているため、多様な環境で実行する必要がある最新の.NETアプリケーションに推奨される選択肢となっています。 特に、AWS LambdaやAzure Functionsのクラウドデプロイメントに役立ちます。 LinuxmacOSDocker環境のガイドでは、プラットフォーム固有のセットアップについて詳しく説明しています。

AnyBitmapはメモリ管理をどのように処理しますか?

AnyBitmapは、自動ガベージコレクション統合と明示的な廃棄パターンを通して、効率的なメモリ管理を実装しています。 頻繁に割り当てられるバッファにメモリプーリングを使用し、パフォーマンス向上のためにコピーオンライトセマンティクスを実装しています。 ファイル ロックを保持できる System.Drawing.Bitmap とは異なり、AnyBitmap は画像を完全にメモリにロードし、ファイル アクセスの問題を防ぎます。 また、高スループットのシナリオでメモリ使用量をより適切に制御できるようにします。 大量の画像を処理するアプリケーションでは、AnyBitmap のメモリ効率により、全体的なメモリ フットプリントを大幅に削減できます。 移行のヒントについては、System.Drawing.Common Alternatives ガイドを参照してください。

スキャン領域を指定するにはどうすればよいですか?

OcrImageInputクラスの構築では、スキャンする領域を指定できます。 これにより、OCR 用に画像ドキュメントの特定の領域を定義できます。 画像ドキュメントによっては、スキャン領域を指定することでパフォーマンスが大幅に向上することがあります。 提供されたコード例では、章番号とタイトルだけが抽出されています。

:path=/static-assets/ocr/content-code-examples/how-to/input-images-read-specific-region.cs
using IronOcr;
using IronSoftware.Drawing;
using System;

// Instantiate IronTesseract
IronTesseract ocrTesseract = new IronTesseract();

// Specify crop region
Rectangle scanRegion = new Rectangle(800, 200, 900, 400);

// Add image
using var imageInput = new OcrImageInput("Potter.tiff", ContentArea: scanRegion);
// Perform OCR
OcrResult ocrResult = ocrTesseract.Read(imageInput);

// Output the result to console
Console.WriteLine(ocrResult.Text);
$vbLabelText   $csharpLabel

より良いパフォーマンスを得るためには、いつリージョン スキャンを使用すべきですか?

リージョンスキャンは、一貫したドキュメントレイアウトの特定の領域のテキストだけが必要な場合に、パフォーマンスを劇的に向上させます。 一般的な使用例としては、ヘッダー、フォームフィールド、請求書の合計、IDカード情報の抽出などがあります。 パフォーマンスが最も向上するのは、テキストの占める割合が小さい大きな画像です。 3000x4000ピクセルの請求書の場合、総額の領域だけをスキャンすると、全ページOCRよりも10~20倍速くなります。 また、リージョンスキャンは、他の領域からの潜在的なノイズを除去することで、精度を向上させます。 リージョンベースの例については、Content Areas & Crop Regions with PDFsガイドをご覧ください。

自分の地域の正しい座標を決定するにはどうすればよいですか?

座標を決定するには、Rectangle が (X, Y, Width, Height) フォーマットを使用し、(0,0) が左上隅であることを理解する必要があります。 まず、カーソル座標を表示する画像エディタで画像を開いてください。 あるいは、IronOCRのデバッグ機能を使って、検出されたテキスト領域を視覚化してください。 ダイナミックレイアウトの場合、まずIronOCRを使ってフルスキャンを行い、OcrResultを解析してプログラム的にテキスト位置を見つけることを検討してください。 Highlight Texts for Debugging の例では、正確な座標決定のために OCR 領域を視覚化する方法を示しています。

領域が画像の境界を超えるとどうなりますか?

指定された領域が画像の境界を超えた場合、IronOCRは自動的に有効な画像領域にクリップします。 例えば、画像が1000x1000ピクセルで、矩形を(900, 900, 200, 200)で指定した場合、IronOCRは(900, 900)から(1000, 1000)までの領域のみを処理します。 この自動クリッピングはエラーを防ぎますが、座標が正しくない場合、テキストの抽出が不完全になる可能性があります。 常に、実際の画像寸法と照らし合わせて、リージョンを検証してください。 動的な画像サイズについては、固定ピクセルではなく、パーセンテージで領域を計算してください。 OCR Region of an Image ガイドでは、安全なリージョン処理の例をより多く提供しています。

OCR結果

フォトビューアでハリー・ポッターの章のテキストを表示するOCR抽出デモと、デバッグコンソールで抽出された出力

よくある質問

C#でOCRを使用してSystem.Drawing.Bitmapからテキストを抽出するにはどうすればよいですか?

IronOCRはSystem.Drawing.Bitmapオブジェクトからテキストを簡単に抽出することができます。まずIronTesseractクラスをインスタンス化し、Bitmapをusingステートメントを使ってOcrImageInputオブジェクトにラップし、最後にReadメソッドを呼び出します。最小限のコードは以下の通り: var result = new IronOcr.IronTesseract().Read(new IronOcr.OcrImageInput(bitmap));

なぜOcrImageInputを使用する際にusing文が重要なのですか?

OcrImageInputはIDisposableを実装しており、適切なクリーンアップが必要な管理されていないリソースを保持しているため、using文は非常に重要です。これがないと、特に複数の画像を処理する場合、メモリー・リークやファイル・ロックの危険性があります。IronOCRのOcrImageInputは、.NETアプリケーションの効率的なリソース管理のために適切な廃棄が必要です。

System.Drawing.ImageオブジェクトでOCRを実行できますか?

はい、IronOCRはSystem.Drawing.ImageオブジェクトのOCRをサポートしています。Imageオブジェクトをビットマップと同じようにOcrImageInputでラップするだけで、IronOCRはWindows、macOS、Linuxの各プラットフォームでシームレスにテキストを抽出します。

IronSoftware.Drawing.AnyBitmapとは何ですか?

IronSoftware.Drawing.AnyBitmapはIronDrawingのビットマップ・クラスで、.NETプロジェクトのSystem.Drawing.Commonを置き換えるオープンソース・ライブラリです。Windows、macOS、Linuxのクロスプラットフォーム互換性を提供し、異なるオペレーティングシステム間で一貫した画像処理が必要な場合にIronOCRで使用するのに理想的です。

テキスト抽出のために画像の特定の領域を指定できますか?

はい、IronOCRではクロップ領域を指定することで特定の読み取り領域を定義することができます。この機能により、System.Drawingオブジェクトの特定の部分にOCR処理を集中させることができ、画像の特定の部分からテキストを必要とする場合に、パフォーマンスと精度を向上させることができます。

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

レビュー済み
Jeff Fritz
Jeffrey T. Fritz
プリンシパルプログラムマネージャー - .NETコミュニティチーム
Jeffはまた、.NETとVisual Studioチームのプリンシパルプログラムマネージャーです。彼は.NET Conf仮想会議シリーズのエグゼクティブプロデューサーであり、週に二回放送される開発者向けライブストリーム『Fritz and Friends』のホストを務め、テクノロジーについて話すことや視聴者と一緒にコードを書くことをしています。Jeffはワークショップ、プレゼンテーション、およびMicrosoft Build、Microsoft Ignite、.NET Conf、Microsoft MVPサミットを含む最大のMicrosoft開発者イベントのコンテンツを企画しています。
準備はできましたか?
Nuget ダウンロード 5,299,091 | バージョン: 2025.12 リリース