如何在 C# 中讀取 System.Drawing 物件
IronOCR 透過將 System.Drawing 物件(例如 Bitmap 和 Image)封裝在 OcrImageInput 中,使其能夠讀取其中的文字,為 Windows、macOS 和 Linux 平台上的 .NET 應用程式提供無縫的 OCR 功能。
System.Drawing.Bitmap 是 .NET Framework 中用於處理位圖影像的類別。 它提供用於建立、操作及顯示位圖影像的方法與屬性。
System.Drawing.Image 是 .NET Framework 中所有 GDI+ 影像物件的基底類別。 它是各種影像類型的基類,包括 System.Drawing.Bitmap。
IronSoftware.Drawing.AnyBitmap 是 IronDrawing 中的位圖類別,IronDrawing 是由 Iron Software 最初開發的開源函式庫。 它能協助 C# 軟體工程師在 Windows、macOS 和 Linux 平台的 .NET 專案中替換 System.Drawing.Com/mon。
快速入門:從 System.Drawing.Bitmap 讀取文字
請使用單一語句建立 IronTesseract,並將由 System.Drawing.Bitmap 包覆的 OcrImageInput 傳入其中,以擷取所有文字。 此快速入門範例展示了 IronOCR 如何在極簡設定下,將圖像轉換為可讀文字。
如何在 C# 中讀取 System.Drawing 物件
- 下載用於讀取 System.Drawing 物件的 C# 函式庫
- 取得 System.Drawing 物件,例如
Bitmap以及Image - 利用獲取的資料建構
OcrImageInput類別 - 使用
AnyBitmapIron Software 為 Linux 和 macOS 提供的 - 透過指定裁切區域來定義閱讀範圍
如何從 System.Drawing.Bitmap 讀取資料?
首先,實例化 類別以執行 OCR。 透過多種方法之一建立。 在程式碼範例中,使用了檔案路徑。
接著,使用 語句建立 物件,並將 物件中的影像傳遞給該物件。 最後,請使用 方法執行 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);
Imports IronOcr
Imports System.Drawing
' Instantiate IronTesseract
Private ocrTesseract As New IronTesseract()
' Read image file to Bitmap
Private bitmap As New Bitmap("Potter.tiff")
' Import System.Drawing.Bitmap
Private imageInput = New OcrImageInput(bitmap)
' Perform OCR
Private ocrResult As OcrResult = ocrTesseract.Read(imageInput)
為什麼 using 語句對 OcrImageInput 如此重要?
在使用 OcrImageInput 時,using 語句至關重要,因為它能確保資源管理與記憶體清理的正確性。OcrImageInput 實作 IDisposable,這表示它持有非受管資源,當您完成對該物件的使用後,必須釋放這些資源。 若缺少 using 語句,這些資源可能無法及時釋放,進而導致記憶體洩漏或檔案鎖定。 這在批次處理多張圖片時尤為重要。 有關 IronOCR 中正確資源管理的更多詳細資訊,請參閱我們的 API 參考文件。
常見的位圖載入方法有哪些?
Bitmap 除了範例中使用的檔案路徑建構子外,還提供了多種載入方法。 您可以從資料流 (StreamReader)、現有的 Image (Image) 建立 Bitmap,甚至建立具有特定尺寸的空白位圖 (Bitmap)。 在處理網頁應用程式時,透過串流載入對於處理上傳檔案特別有用。 針對嵌入式資源,可使用 Resources。 IronOCR 透過 Bitmap 建構函式,能無縫處理所有這些 source 來源。 請參閱我們的《圖片(jpg、png、gif、tiff、bmp)指南》,進一步了解各種輸入格式。
我應該在何時釋放 Bitmap 物件?
位圖的釋放時機取決於您的應用程式工作流程。 若您僅需 bitmap 進行 OCR 處理,請在建立 ocrResult 後立即刪除前者。 然而,若需執行多項操作或顯示圖片,請保持其有效性,直至所有操作完成。 請務必使用 using 語句或 try-finally 區塊,以確保資源釋放。 請注意,OcrImageInput 會建立其自身的內部副本,因此原始的 bitmap 可在 OcrImageInput 建立後予以釋放。 若涉及包含多項影像操作的複雜情境,請參考我們的 OCR 影像優化濾鏡範例。
如何從 System.Drawing.Image 讀取資料?
讀取 Image 的方式非常簡單,只需使用 OcrInput 建立 Image 物件,然後透過 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);
Imports IronOcr
Imports Image = System.Drawing.Image
' Instantiate IronTesseract
Private ocrTesseract As New IronTesseract()
' Open image file as Image
Private image As Image = Image.FromFile("Potter.tiff")
' Import System.Drawing.Image
Private imageInput = New OcrImageInput(image)
' Perform OCR
Private ocrResult As OcrResult = ocrTesseract.Read(imageInput)
在 OCR 應用中,"Image"與"Bitmap"有何區別?
雖然 Bitmap 是針對位圖影像的特定實作,但 Image 是一個抽象基類,可代表各種影像格式,包括 JPEG、PNG、GIF 和 TIFF。 就 OCR 用途而言,IronOCR 會透過 OcrInput 將兩者視為相同,但 Image 在處理不同格式時能提供更大的靈活性。 Bitmap 提供像素級的影像處理能力,而 Image 則更適合一般性的影像處理。 兩者皆能與 IronOCR 的先進 Tesseract 5 引擎完美配合。選擇取決於您的整體應用需求,而非 OCR 效能。
為何要使用 Image.FromFile 而不是其他載入方法?
Image.FromFile 是從磁碟載入圖片最簡單且最直接的方法。 它能自動偵測圖片格式並處理檔案讀取流程。 對於網頁應用程式或處理記憶體流時,建議採用 MemoryStream 等替代方法。 FileStream 會鎖定檔案,直到 FileStream 被釋放為止,這在多執行緒應用程式中可能需要特別留意。 對於需要高效能或並發存取的生產環境,建議先將影像載入記憶體流中。我們的"多執行緒 Tesseract OCR 範例"展示了並發影像處理的最佳實務。
如何從 IronSoftware.Drawing.AnyBitmap 讀取資料?
同樣地,在建立或取得 AnyBitmap 物件後,您可以建立 OcrInput 類別。 建構函式將處理匯入資料所需的所有步驟。 以下程式碼範例將對此進行說明。
: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);
Imports IronOcr
Imports IronSoftware.Drawing
' Instantiate IronTesseract
Private ocrTesseract As New IronTesseract()
' Open image file as AnyBitmap
Private anyBitmap As AnyBitmap = AnyBitmap.FromFile("Potter.tiff")
' Import IronSoftware.Drawing.AnyBitmap
Private imageInput = New OcrImageInput(anyBitmap)
' Perform OCR
Private ocrResult As OcrResult = ocrTesseract.Read(imageInput)
為何選擇 AnyBitmap 而非 System.Drawing 類別?
AnyBitmap 相較於 Bitmap 類別,具備更優異的跨平台相容性。 雖然 Bitmap 在 .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 上的雲端部署而言,這尤其具有價值。 請參閱我們針對 Linux、macOS 及 Docker 環境的指南,進一步了解各平台的設定方法。
AnyBitmap 是如何處理記憶體管理的?
AnyBitmap 透過整合自動垃圾回收機制與顯式釋放模式,實現高效的記憶體管理。 它針對頻繁分配的緩衝區採用記憶體池機制,並實作"寫入時複製"語義以提升效能。 與可能持有檔案鎖定的 AnyBitmap 不同,AnyBitmap 會將圖片完全載入記憶體中,從而避免檔案存取問題。 它還能讓您在高吞吐量情境下,更有效地控制記憶體使用量。 對於處理大量影像的應用程式,AnyBitmap 的記憶體效率可顯著降低整體記憶體佔用量。 請參閱我們的《System.Drawing.Com/mon 替代方案指南》以獲取遷移建議。
如何指定掃描區域?
在建構 OcrInput 類別時,您可以指定要掃描的區域。 這讓您能夠定義圖像文件中要進行 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);
Imports IronOcr
Imports IronSoftware.Drawing
Imports System
' Instantiate IronTesseract
Private ocrTesseract As New IronTesseract()
' Specify crop region
Private scanRegion As New Rectangle(800, 200, 900, 400)
' Add image
Private imageInput = New OcrImageInput("Potter.tiff", ContentArea:= scanRegion)
' Perform OCR
Private ocrResult As OcrResult = ocrTesseract.Read(imageInput)
' Output the result to console
Console.WriteLine(ocrResult.Text)
何時應使用區域掃描以獲得更佳效能?
當您僅需擷取佈局一致之文件中特定區域的文字時,區域掃描功能能顯著提升效能。 常見的應用情境包括擷取頁首資訊、表單欄位、發票總額或身分證資訊。 在文字佔比較小的大型圖片中,效能提升最為顯著。 對於 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 結果
using
OcrImageInput
OcrImageInput
IDisposable
using
System.Drawing.Bitmap
Bitmaps
new Bitmap(stream)
Images
new Bitmap(image)
new Bitmap(width, height)
Assembly.GetManifestResourceStream()
Bitmap
OcrImageInput
Bitmap
OcrImageInput
using
OcrImageInput
Bitmap
OcrImageInput
System.Drawing.Image
OcrImageInput
Image
Read
System.Drawing.Bitmap
System.Drawing.Image
OcrImageInput
Image
Bitmap
Image
Image.FromFile
Image.FromStream
Image.FromFile
Image
AnyBitmap
OcrImageInput
AnyBitmap
System.Drawing
System.Drawing.Com/mon
AnyBitmap
AnyBitmap
AnyBitmap
AnyBitmap
System.Drawing.Bitmap
AnyBitmap
AnyBitmap
OcrImageInput
Rectangle
OcrResult
常見問題
如何在 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 語句如此重要?
using 語句至關重要,因為 OcrImageInput 實作了 IDisposable 介面,且持有需要妥善清理的非受管資源。若未使用此語句,可能會導致記憶體洩漏或檔案鎖定問題,特別是在處理多張圖片時。IronOCR 的 OcrImageInput 必須進行適當的資源釋放,以確保您的 .NET 應用程式能有效管理資源。
我可以對 System.Drawing.Image 物件執行 OCR 嗎?
是的,IronOCR 支援對 System.Drawing.Image 物件進行 OCR 處理,因為 Image 是 Bitmap 的基類。只需像處理 Bitmap 一樣,將您的 Image 物件封裝在 OcrImageInput 中,IronOCR 便能無縫地在 Windows、macOS 和 Linux 平台上提取文字。
什麼是 IronSoftware.Drawing.AnyBitmap,它與 OCR 有何關聯?
IronSoftware.Drawing.AnyBitmap 是 IronDrawing 中的位圖類別,IronDrawing 是一個開源函式庫,旨在協助取代 .NET 專案中的 System.Drawing.Com/mon。它提供 Windows、macOS 和 Linux 的跨平台相容性,因此當您需要在不同作業系統上進行一致的影像處理時,非常適合與 IronOCR 搭配使用。
我可以指定圖片中的特定區域來進行文字擷取嗎?
是的,IronOCR 允許您透過指定裁切區域來定義特定的讀取範圍。此功能讓您能將 OCR 處理集中於 System.Drawing 物件的特定區段,當您僅需擷取影像中特定部分的文字時,可提升效能與準確度。
IronOCR 是否支援多種語言?
IronOCR 支援多種語言,使其成為適用於需要識別不同語言文字的全球應用程式的多功能工具。
IronOCR 能否整合至現有應用程式中?
IronOCR 設計上可輕鬆透過 C# 整合至現有應用程式中,讓開發人員能以最少的努力,為其軟體增添 OCR 功能。
使用 IronOCR 進行文件管理有哪些好處?
使用 IronOCR 進行文件管理,可將掃描文件轉換為可搜尋且可編輯的文字,從而簡化工作流程,減少人工資料輸入的需求,並提升文件的可存取性。
IronOCR 如何提升資料準確性?
IronOCR 透過其先進的辨識演算法與影像校正功能來提升資料準確性,確保文字擷取過程既可靠又精確。
IronOCR 是否有提供免費試用版?
是的,Iron Software 提供 IronOCR 的免費試用版,讓使用者能在決定購買前測試其功能與效能。

