如何在 C# 中使用影像進行 OCR 處理

如何在 C# 中從流中讀取資料以進行 OCR

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

IronOCR透過將流傳遞給 OcrInputOcrImageInput 建構函數,直接從 C# 中的流讀取影像數據,從而實現高效的 OCR 處理,而無需將檔案儲存到磁碟。

資料流是指可以讀取或寫入的連續二進位資訊流。 在程式設計中,串流透過將資料分成可管理的小塊來有效地處理記憶體無法容納的大量資料。

IronOCR的導入方法可以直接接受影像資料流。 將流資料傳遞給導入方法,該方法會自動處理所有必要的步驟。 對於進階場景,請探索OcrInput,該類別提供了準備各種輸入格式的豐富選項。

快速入門:使用串流進行 OCR 輸入(秒速)

本範例示範了透過將 System.IO.Stream 輸入IronOCR來實現即時 OCR,跳過檔案路徑,並以最少的程式碼檢索識別的文字。

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

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

    using var input = new IronOcr.OcrInput(stream);
    var result = new IronOcr.IronTesseract().Read(input);
  3. 部署到您的生產環境進行測試

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

    arrow pointer


如何使用IronOCR讀取文字流?

首先,實例化IronTesseract類別以執行 OCR。 使用 FromFile 方法匯入影像檔案。此 AnyBitmap 物件將影像資料轉換為流。 接下來,使用 using 語句,透過 GetStream 方法傳遞圖像流來建立 OcrImageInput 物件。 最後,使用 Read 方法執行 OCR。

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

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

// Read image file to AnyBitmap
AnyBitmap anyBitmap = AnyBitmap.FromFile("Potter.tiff");

// Import image stream
using var imageInput = new OcrImageInput(anyBitmap.GetStream());
// Perform OCR
OcrResult ocrResult = ocrTesseract.Read(imageInput);
$vbLabelText   $csharpLabel

基於流的 OCR 技術有利於接收映像上傳、處理資料庫中的映像或處理不應寫入磁碟的臨時資料的 Web 應用程式。 流式方法與System.Drawing 物件和其他影像處理庫無縫整合。

為什麼要使用流進行 OCR?

使用流可以為.NET開發人員帶來以下幾個優勢:

1.記憶體效率:分塊處理數據,而不是將整個檔案載入記憶體。
2.安全性:處理敏感文件時無需在磁碟上建立臨時文件
3.效能:消除檔案系統操作的 I/O 開銷
4.靈活性:支援網頁上傳、資料庫 BLOB 和記憶體轉換

對於處理多頁文件或處理PDF 流, IronOCR保持了相同的簡單 API,同時提供了強大的效能。 處理掃描文件時,您還可以利用 IronOCR 的功能,透過串流處理有效率地讀取掃描文件

如何為流式OCR指定掃描區域?

為了提高處理大型影像的效能並從特定區域取得特定讀數,請使用 CropRectangle 類別。 OcrImageInput 建構子接受一個 CropRectangle 物件作​​為第二個參數,可讓您指定要讀取影像文件的哪個區域。 下面的程式碼範例指定只讀取章節編號和標題區域。

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

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

// Read image file to AnyBitmap
AnyBitmap anyBitmap = AnyBitmap.FromFile("Potter.tiff");

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

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

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

當您需要對影像的特定區域進行 OCR 識別,或處理文字出現在可預測位置的結構化文件時,此技術特別有用。 對於涉及表格或結構化資料的更複雜場景,請探索如何在文件中讀取表格

輸出結果中的掃描區域是什麼樣子的?

OCR演示:在偵錯控制台中,照片檢視器中的文件顯示了提取的文字

我可以使用哪些高階流處理技術?

處理資料流時,利用IronOCR 的其他功能來提高辨識準確率。 影像優化濾波器可以直接應用於串流數據,然後再進行 OCR 處理:

using IronOcr;
using IronSoftware.Drawing;
using System.IO;

// Process stream with filters
public string ProcessStreamWithFilters(Stream imageStream)
{
    IronTesseract ocrTesseract = new IronTesseract();

    // Configure for better accuracy
    ocrTesseract.Configuration.BlackListCharacters = "~`$#^*_}{][|\\";
    ocrTesseract.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.AutoOsd;

    using var input = new OcrImageInput(imageStream);

    // Apply preprocessing filters
    input.Deskew();
    input.DeNoise();
    input.Sharpen();

    var result = ocrTesseract.Read(input);
    return result.Text;
}
using IronOcr;
using IronSoftware.Drawing;
using System.IO;

// Process stream with filters
public string ProcessStreamWithFilters(Stream imageStream)
{
    IronTesseract ocrTesseract = new IronTesseract();

    // Configure for better accuracy
    ocrTesseract.Configuration.BlackListCharacters = "~`$#^*_}{][|\\";
    ocrTesseract.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.AutoOsd;

    using var input = new OcrImageInput(imageStream);

    // Apply preprocessing filters
    input.Deskew();
    input.DeNoise();
    input.Sharpen();

    var result = ocrTesseract.Read(input);
    return result.Text;
}
$vbLabelText   $csharpLabel

為了提升影像處理效果,您可以考慮使用"篩選精靈"來自動確定針對特定文件類型的最佳預處理步驟。此外,當處理流程中旋轉或傾斜的影像時, "修復影像方向"功能可以顯著提高 OCR 的準確率。

如何處理不同的串流媒體來源?

IronOCR可以無縫處理各種流源。 無論是處理來自網頁表單的上傳內容、從資料庫擷取影像,或是在不同格式之間進行轉換,API 都保持一致:

// From MemoryStream
byte[] imageBytes = GetImageBytesFromDatabase();
using var memoryStream = new MemoryStream(imageBytes);
using var input = new OcrImageInput(memoryStream);

// From FileStream
using var fileStream = new FileStream("document.png", FileMode.Open);
using var input2 = new OcrImageInput(fileStream);

// From network stream
using var webClient = new WebClient();
using var networkStream = webClient.OpenRead("https://example.com/image.jpg");
using var input3 = new OcrImageInput(networkStream);
// From MemoryStream
byte[] imageBytes = GetImageBytesFromDatabase();
using var memoryStream = new MemoryStream(imageBytes);
using var input = new OcrImageInput(memoryStream);

// From FileStream
using var fileStream = new FileStream("document.png", FileMode.Open);
using var input2 = new OcrImageInput(fileStream);

// From network stream
using var webClient = new WebClient();
using var networkStream = webClient.OpenRead("https://example.com/image.jpg");
using var input3 = new OcrImageInput(networkStream);
$vbLabelText   $csharpLabel

為了獲得最佳效果,處理低解析度視訊串流時,請考慮調整DPI 設定。 IronOCR可自動處理 DPI 偵測,但手動設定可提高特定使用情境下的準確性。 處理多頁文件時,可以探索透過串流處理來處理多頁 TIFF 和 GIF 檔案

如何處理來自串流媒體的 OCR 結果?

IronOCR處理完您的資料流後,會提供豐富的結果對象,而不僅僅是簡單的文字擷取。 OcrResult 類別包含有關已識別文字的詳細信息,包括置信度分數、位置和結構:

// Process stream and analyze results
using var input = new OcrImageInput(stream);
var result = new IronTesseract().Read(input);

// Access detailed results
foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber} Confidence: {page.Confidence}%");

    foreach (var paragraph in page.Paragraphs)
    {
        Console.WriteLine($"Paragraph: {paragraph.Text}");
        Console.WriteLine($"Location: X={paragraph.X}, Y={paragraph.Y}");
    }
}

// Export results
string text = result.Text;
string searchablePdf = result.SaveAsSearchablePdf("output.pdf");
string hocrHtml = result.SaveAsHocrHtml("output.html");
// Process stream and analyze results
using var input = new OcrImageInput(stream);
var result = new IronTesseract().Read(input);

// Access detailed results
foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber} Confidence: {page.Confidence}%");

    foreach (var paragraph in page.Paragraphs)
    {
        Console.WriteLine($"Paragraph: {paragraph.Text}");
        Console.WriteLine($"Location: X={paragraph.X}, Y={paragraph.Y}");
    }
}

// Export results
string text = result.Text;
string searchablePdf = result.SaveAsSearchablePdf("output.pdf");
string hocrHtml = result.SaveAsHocrHtml("output.html");
$vbLabelText   $csharpLabel

結果物件還提供了匯出為可搜尋 PDFhOCR HTML 格式的方法,從而可以輕鬆地從串流輸入建立可搜尋的文件存檔。 為了進行偵錯,您可以使用高亮文字功能來視覺化IronOCR在影像中偵測到的內容。

我應該了解哪些性能方面的注意事項?

在處理多個資料流或實施高吞吐量 OCR 解決方案時,請考慮以下最佳化策略:

1.重複使用 IronTesseract 實例:建立單一實例並在多個操作中重複使用它
2.實施進度追蹤:對於大型資料流,使用進度追蹤來監控處理狀態
3.並行處理IronOCR 支援對多個流進行並行處理
4.優化影像品質:預處理視訊串流以確保最佳解析度和清晰度

為了獲得最佳效能,請探索快速 OCR 配置選項,並考慮對批次操作實作多執行緒處理。 在處理對時間要求較高的應用程式時,了解逾時機制可以幫助您有效管理長時間運行的 OCR 操作。

如何排除常見的串流問題?

在使用串流媒體時,您可能會遇到一些特定的挑戰。 以下是一些常見情況的解決方案:

-流位置:在傳遞給 IronOCR 之前,始終將流位置重設為 0
-處置:使用 using 語句來確保正確清理資源
-格式支援: IronOCR透過資料流支援多種影像格式,包括 JPEG、PNG、TIFF 和 BMP。
-記憶體管理:對於大型資料流,請考慮分塊處理或串流處理方法。

對於複雜的文件或標準 OCR 無法提供令人滿意的結果時,電腦視覺功能可以幫助更準確地定位和提取文字。 此外,在處理低品質流時,請參考修復低品質掃描的指南,以了解可顯著提高辨識率的預處理技術。

有關使用流和其他輸入方法的更多詳細信息,請瀏覽我們全面的操作指南程式碼範例

常見問題解答

如何在不先將影像資料儲存到磁碟的情況下對其執行 OCR?

IronOCR 允許您直接處理影像串流,只要將影像串流傳送至 OcrInput 或 OcrImageInput 構建程式即可。這可讓您在不建立臨時檔案的情況下進行有效率的 OCR 處理,非常適合處理網頁上傳、資料庫 BLOB 或不應碰觸磁碟的敏感文件。

哪些類型的串流可作為 OCR 處理的輸入?

IronOCR 接受任何包含影像資料的 System.IO.Stream。這包括來自 Web 上傳的記憶體串流、來自資料庫 BLOB 欄位的串流,或來自影像處理函式庫所建立的串流。當您將串流傳送到 OcrInput 或 OcrImageInput 時,程式庫會自動處理所有必要的轉換步驟。

在 C# 中對資料流執行 OCR 的最簡單方法是什麼?

最快速的方法是使用您的串流建立一個 OcrInput 物件,並呼叫 Read 方法:'using var input = new IronOcr.OcrInput(stream); var result = new IronOcr.IronTesseract().Read(input);'.這個最小的程式碼會執行 OCR 並立即傳回辨識的文字。

為何 OCR 應使用串流而非檔案路徑?

IronOCR 基於串流的 OCR 具備多項優勢:以塊狀處理資料可提高記憶體效率、避免磁碟上的臨時檔案可增強安全性、消除檔案 I/O 開銷可改善效能,以及在處理網頁上傳或資料庫 BLOB 時具有更大的靈活性。

我可以指定要讀取影像串流的特定區域嗎?

是的,IronOCR 允許您在處理資料流時,透過指定裁切區域來定義讀取區域。此功能可讓您在不處理整個文件的情況下,將 OCR 的重點放在影像的特定部分,從而提高速度和精確度。

流處理如何與其他影像處理函式庫整合?

IronOCR 的流方法可與 System.Drawing 物件和其他 .NET 圖像處理函式庫無縫整合。您可以使用 AnyBitmap 類別,利用 GetStream 方法將影像轉換成流,讓 OCR 與其他影像處理工作流程輕鬆結合。

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
執行範例 觀看您的圖片變成可搜尋的文字。