如何在 C# 中使用輸入圖像進行 OCR 處理

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

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

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

流(stream)是一種可讀取或寫入的連續二進位資訊流。 在程式設計中,資料流透過將過大的資料分割成可處理的區塊,以高效的方式處理這些超出記憶體容量的資料。

IronOCR 的匯入方法可直接接受影像資料流。 將流資料傳入匯入方法,該方法會自動處理所有必要步驟。 針對進階情境,請探索 OcrInput 類別,該類別提供豐富的選項,可處理各種輸入格式。

快速入門:數秒內使用串流進行 OCR 輸入

此範例展示如何透過將 System.IO.Stream 輸入 IronOCR,跳過檔案路徑並以最少程式碼取得辨識出的文字,來實現即時 OCR。

  1. using 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。 請使用 FromFileAnyBitmap 方法來匯入影像檔案。此 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);
Imports IronOcr
Imports IronSoftware.Drawing

' Instantiate IronTesseract
Private ocrTesseract As New IronTesseract()

' Read image file to AnyBitmap
Private anyBitmap As AnyBitmap = AnyBitmap.FromFile("Potter.tiff")

' Import image stream
Private imageInput = New OcrImageInput(anyBitmap.GetStream())
' Perform OCR
Private ocrResult As OcrResult = ocrTesseract.Read(imageInput)
$vbLabelText   $csharpLabel

基於流的 OCR 技術能為接收圖片上傳、處理資料庫中的圖片,或處理不應寫入磁碟的臨時資料的網頁應用程式帶來效益。 此流式處理方法可與 System.Drawing 物件及其他影像處理函式庫無縫整合。

為何要使用流 (Streams) 進行 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);
Imports IronOcr
Imports IronSoftware.Drawing
Imports System

' Instantiate IronTesseract
Private ocrTesseract As New IronTesseract()

' Read image file to AnyBitmap
Private anyBitmap As AnyBitmap = AnyBitmap.FromFile("Potter.tiff")

' Specify crop region
Private scanRegion As New Rectangle(800, 200, 900, 400)

' Add image
Private imageInput = New OcrImageInput(anyBitmap.GetStream(), ContentArea:= scanRegion)
' Perform OCR
Private ocrResult As 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;
}
Imports IronOcr
Imports IronSoftware.Drawing
Imports System.IO

' Process stream with filters
Public Function ProcessStreamWithFilters(imageStream As Stream) As String
    Dim ocrTesseract As New IronTesseract()

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

    Using input As New OcrImageInput(imageStream)
        ' Apply preprocessing filters
        input.Deskew()
        input.DeNoise()
        input.Sharpen()

        Dim result = ocrTesseract.Read(input)
        Return result.Text
    End Using
End Function
$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);
Imports System.IO
Imports System.Net

' From MemoryStream
Dim imageBytes As Byte() = GetImageBytesFromDatabase()
Using memoryStream As New MemoryStream(imageBytes)
    Using input As New OcrImageInput(memoryStream)
        ' Process input
    End Using
End Using

' From FileStream
Using fileStream As New FileStream("document.png", FileMode.Open)
    Using input2 As New OcrImageInput(fileStream)
        ' Process input2
    End Using
End Using

' From network stream
Using webClient As New WebClient()
    Using networkStream As Stream = webClient.OpenRead("https://example.com/image.jpg")
        Using input3 As New OcrImageInput(networkStream)
            ' Process input3
        End Using
    End Using
End Using
$vbLabelText   $csharpLabel

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

如何處理來自 Streams 的 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");
Imports IronOcr

' Process stream and analyze results
Using input As New OcrImageInput(stream)
    Dim result = New IronTesseract().Read(input)

    ' Access detailed results
    For Each page In result.Pages
        Console.WriteLine($"Page {page.PageNumber} Confidence: {page.Confidence}%")

        For Each paragraph In page.Paragraphs
            Console.WriteLine($"Paragraph: {paragraph.Text}")
            Console.WriteLine($"Location: X={paragraph.X}, Y={paragraph.Y}")
        Next
    Next

    ' Export results
    Dim text As String = result.Text
    Dim searchablePdf As String = result.SaveAsSearchablePdf("output.pdf")
    Dim hocrHtml As String = result.SaveAsHocrHtml("output.html")
End Using
$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。這包括來自網頁上傳的記憶體串流、來自資料庫 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 與其他影像處理工作流程結合。

IronOCR 能否整合至現有應用程式中?

IronOCR 設計上可輕鬆透過 C# 整合至現有應用程式中,讓開發人員能以最少的努力,為其軟體增添 OCR 功能。

使用 IronOCR 進行文件管理有哪些好處?

使用 IronOCR 進行文件管理,可將掃描文件轉換為可搜尋且可編輯的文字,從而簡化工作流程,減少人工資料輸入的需求,並提升文件的可存取性。

IronOCR 如何提升資料準確性?

IronOCR 透過其先進的辨識演算法與影像校正功能來提升資料準確性,確保文字擷取過程既可靠又精確。

IronOCR 是否有提供免費試用版?

是的,Iron Software 提供 IronOCR 的免費試用版,讓使用者能在決定購買前測試其功能與效能。

Curtis Chau
技術撰稿人

Curtis Chau 擁有卡爾頓大學(Carleton University)的電腦科學學士學位,專精於前端開發,並精通 Node.js、TypeScript、JavaScript 及 React。他熱衷於打造直觀且美觀的用戶介面,喜歡運用現代框架,並創建結構完善、視覺上吸引人的手冊。

除了開發工作之外,Curtis 對物聯網(IoT)抱有濃厚興趣,致力於探索整合硬體與軟體的創新方法。閒暇時,他喜歡玩遊戲和開發 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 Summit 等微軟最大規模的開發者活動規劃內容。
準備開始了嗎?
Nuget 下載 5,888,303 | 版本: 2026.5 just released
Still Scrolling Icon

還在往下捲動嗎?

想要快速確認成果嗎? PM > Install-Package IronOcr
執行範例 觀看您的圖片轉為可搜尋文字。