如何在 C# 中使用系統繪圖影像進行 OCR 處理

如何在 C# 中讀取 System.Drawing 對象

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

IronOCR透過將 System.Drawing 物件(如 BitmapImage)包裝在 OcrImageInput 中,從而讀取其中的文本,為 Windows、macOS 和 Linux 平台上的.NET應用程式提供無縫的 OCR 功能。

System.Drawing.Bitmap 是.NET Framework中用來處理點陣圖映像的類別。 它提供了建立、操作和顯示點陣圖影像的方法和屬性。

System.Drawing.Image 是.NET Framework中所有 GDI+ 映像物件的基底類別。 它是各種圖像類型的父類,包括 System.Drawing.Bitmap

IronSoftware.Drawing.AnyBitmapIronDrawing中的一個點陣圖類,IronDrawing 是一個開源函式庫,最初由Iron Software開發。 它可以幫助 C# 軟體工程師在 Windows、macOS 和 Linux 平台上的.NET專案中取代 System.Drawing.Common

快速入門:從 System.Drawing.Bitmap 讀取文字

使用一條語句,建立一個 IronTesseract,並向其提供一個用 OcrImageInput 包裹的 System.Drawing.Bitmap,以提取所有文字。 本快速入門範例示範了IronOCR如何以最少的設定將圖像轉換為可讀文字。

  1. 使用NuGet套件管理器安裝https://www.nuget.org/packages/IronOcr

    PM > Install-Package IronOcr
  2. 複製並運行這段程式碼。

    var result = new IronOcr.IronTesseract().Read(new IronOcr.OcrImageInput(new System.Drawing.Bitmap("image.png")));
  3. 部署到您的生產環境進行測試

    今天就在您的專案中開始使用免費試用IronOCR

    arrow pointer


如何從 System.Drawing.Bitmap 中讀取資料?

首先,實例化IronTesseract類別以執行 OCR。 透過各種方法之一創建 System.Drawing.Bitmap。 在程式碼範例中,使用了檔案路徑。

接下來,使用 using 語句建立 OcrImageInput 對象,並將 System.Drawing.Bitmap 物件中的圖像傳遞給它。 最後,使用 Read 方法執行 OCR。

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

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

// Read image file to Bitmap
Bitmap bitmap = new Bitmap("Potter.tiff");

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

為什麼 OcrImageInput 的 using 語句很重要?

使用 using 時,語句 OcrImageInput 至關重要,因為它能確保正確的資源管理和記憶體清理。 OcrImageInput 實作了 IDisposable,這表示它持有非託管資源,這些資源需要在物件使用完畢後釋放。 如果沒有 using 語句,這些資源可能無法及時釋放,從而可能導致記憶體洩漏或檔案鎖定。 在批次處理多張影像時,這一點尤其重要。 有關IronOCR中正確資源管理的更多詳細信息,請參閱我們的API 參考文件。

常用的點陣圖載入方法有哪些?

除了我們範例中使用的檔案路徑建構函數之外,System.Drawing.Bitmap 還提供了幾種載入方法。 您可以從串流(Images)建立 new Bitmap(width, height))。 在使用 Web 應用程式時,從流程載入對於處理上傳的檔案特別有用。 對於嵌入式資源,您可以使用 Assembly.GetManifestResourceStream()。 IronOCR透過 OcrImageInput 構造函數無縫地處理所有這些 Bitmap 來源。 在我們的圖像(jpg、png、gif、tiff、bmp)指南中了解更多不同的輸入方法。

何時該釋放 Bitmap 物件?

點陣圖釋放時間取決於應用程式的工作流程。 如果您只需要 Bitmap 用於 OCR,請在建立 OcrImageInput 後立即丟棄。 但是,如果需要執行多個操作或顯示影像,請保持進程運行直到所有操作完成。 請務必使用 using 語句或 try-finally 區塊來確保資源釋放。 請記住,OcrImageInput 會建立自己的內部副本,因此在建立 OcrImageInput 之後,可以處置原始的 Bitmap。 對於涉及多個影像操作的複雜場景,請參考我們的OCR 影像最佳化濾鏡範例。

如何從 System.Drawing.Image 中讀取資料?

System.Drawing.Image 讀取資料就像使用 Image 建立 OcrImageInput 對象,然後使用 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 是從磁碟載入映像的最簡單、最直接的方法。 它能自動偵測影像格式並處理檔案讀取過程。 對於 Web 應用程式或處理記憶體流時,類似 Image.FromStream 的替代方法更好。 Image.FromFile 會鎖定文件,直到 Image 被釋放,這在多線程應用程式中可能是需要考慮的問題。 對於需要高效能或並發存取的生產場景,請考慮先將映像載入到記憶體流中。我們的 多執行緒 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

為什麼選擇 AnyBitmap 而不是 System.Drawing 類別?

System.Drawing 類別相比,AnyBitmap 具有更優異的跨平台相容性。 雖然 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

何時應該使用區域掃描以獲得更好的效能?

當您只需要來自一致文件佈局中特定區域的文字時,區域掃描可以顯著提高效能。 常見用例包括提取標題、表單欄位、發票總額或身分證資訊。 對於文字僅佔很小比例的大圖,效能提升最為顯著。 對於 3000x4000 像素的發票,僅掃描總金額區域比全頁 OCR 快 10-20 倍。 區域掃描還可以消除來自其他區域的潛在噪聲,從而提高準確性。 有關更多基於區域的範例,請參閱我們的《內容區域和作物區域(附 PDF)》指南。

如何確定我所在區域的正確座標?

確定座標需要了解 Rectangle 使用 (X, Y, 寬度, 高度) 格式,其中 (0,0) 是左上角。 首先,在能夠顯示遊標座標的圖像編輯器中開啟你的圖像。 或者,使用 IronOCR 的偵錯功能來視覺化偵測到的文字區域。 對於動態佈局,可以考慮先使用IronOCR執行完整掃描,然後分析 OcrResult 以透過程式設計方式尋找文字位置。 我們的"調試高亮文字"範例展示瞭如何視覺化 OCR 區域以進行精確的座標確定。

如果該區域超出影像邊界會發生什麼?

當指定區域超出影像邊界時, IronOCR自動將其裁切到有效的影像區域。 例如,如果您的影像是 1000x1000 像素,並且您指定一個矩形 (900, 900, 200, 200),則IronOCR將只處理從 (900, 900) 到 (1000, 1000) 的區域。 自動裁剪功能可以防止出錯,但如果座標不正確,可能會導致文字擷取不完整。 務必根據實際影像尺寸驗證您設定的區域。 對於動態影像尺寸,應以百分比而不是固定像素來計算區域。 影像的 OCR 區域指南提供了更多安全區域處理的範例。

OCR結果

OCR提取演示,在照片檢視器中顯示哈利波特章節文本,並在偵錯控制台中顯示提取的輸出。

常見問題解答

如何在 C# 中使用 OCR 從 System.Drawing.Bitmap 擷取文字?

IronOCR 使從 System.Drawing.Bitmap 物件中提取文字變得簡單。首先,實體化 IronTesseract 類別,然後使用 using 語句將您的 Bitmap 包裝成 OcrImageInput 物件,最後再呼叫 Read 方法。最小的程式碼是: var result = new IronOcr.IronTesseract().Read(new IronOcr.OcrImageInput(bitmap));

在使用 OcrImageInput 時,為什麼 using statement 非常重要?

using 語句非常重要,因為 OcrImageInput 實作 IDisposable 並持有需要適當清理的非管理資源。沒有它,您就有記憶體洩漏或檔案鎖定的風險,尤其是在處理多個影像時。IronOCR 的 OcrImageInput 需要適當的處理,以確保您的 .NET 應用程式中有效率的資源管理。

我可以在 System.Drawing.Image 物件上執行 OCR 嗎?

是的,IronOcr 支援 System.Drawing.Image 物件上的 OCR,因為 Image 是 Bitmap 的基類。只需將您的 Image 物件包裝在 OcrImageInput 中,就像使用 Bitmap 的方式一樣,IronOCR 就能在 Windows、macOS 和 Linux 平台上無縫擷取文字。

什麼是 IronSoftware.Drawing.AnyBitmap,它與 OCR 有何關聯?

IronSoftware.Drawing.AnyBitmap 是來自 IronDrawing 的位圖類,IronDrawing 是一個開放原始碼的函式庫,可協助取代 .NET 專案中的 System.Drawing.Common。它提供 Windows、macOS 和 Linux 的跨平台相容性,因此當您需要跨不同作業系統進行一致的影像處理時,非常適合與 IronOCR 搭配使用。

我可以指定影像的特定區域進行文字擷取嗎?

是的,IronOCR 允許您透過指定裁切區域來定義特定的閱讀區域。此功能可讓您將 OCR 處理集中在 System.Drawing 物件的特定區段,當您只需要影像特定部分的文字時,可提高效能與精確度。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。

審核人
Jeff Fritz
Jeffrey T. Fritz
首席程序经理 - .NET 社群团队
Jeff 也是 .NET 和 Visual Studio 团队的首席程序经理。他是 .NET Conf 虚拟会议系列的执行制作人,并主持“Fritz 和朋友”这一每周两次的開發者的直播节目,在节目上讨论技術并与观众一起编写代碼。Jeff 撰写研讨会、主持演讲,并计划大型 Microsoft 開發者活動(包括 Microsoft Build、Microsoft Ignite、.NET Conf 和 Microsoft MVP Summit)的內容。
準備好開始了嗎?
Nuget 下載 5,525,971 | 版本: 2026.3 剛剛發布
Still Scrolling Icon

還在捲動嗎?

想要快速證明? PM > Install-Package IronOcr
執行範例 觀看您的圖片變成可搜尋的文字。