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

如何從 C# 中的串流讀取以進行 OCR。

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

IronOCR 在 C# 中透過將流傳給 OcrInputOcrImageInput 建構器來直接從流讀取影像資料,因此可以在不將檔案儲存到磁碟的情況下進行有效率的 OCR 處理。

流是可讀取或寫入的二進位資訊的連續流。 在程式設計中,串流能有效率地處理對記憶體而言過大的資料,並將其分成可管理的小塊。

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

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

本範例透過將一個 System.IO.Stream 輸入 IronOCR 來示範即時 OCR,跳過檔案路徑,以最少的程式碼擷取已識別的文字。

Nuget Icon立即開始使用 NuGet 建立 PDF 檔案:

  1. 使用 NuGet 套件管理器安裝 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 讀取資料流?

<! -- 截圖示範如何使用 IronOcr 讀取串流? in IronPdf --> <!--說明:顯示逐步過程的截圖 -->

首先,實體化 IronTesseract 類別以執行 OCR。 使用 AnyBitmapFromFile 方法匯入影像檔案。這個 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 物件 及其他影像處理函式庫無縫整合。

Why Use Streams for OCR?

對 .NET 開發人員而言,使用串流工作有幾項優點:

1.記憶體效率:分塊處理資料,而非將整個檔案載入記憶體 2.安全性:處理敏感性文件而不會在磁碟上建立暫存檔案 3.效能:消除檔案系統作業的 I/O 開銷 4.彈性:可處理網頁上傳、資料庫 BLOB 和記憶體內轉換

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

如何為 Stream OCR 指定掃描區域?

<! -- 螢幕截圖示範如何為串流ocr指定掃描區域? 在 IronPDF --> <!--說明:顯示逐步過程的截圖 -->

若要改善大型影像的效能,並從特定區域取得特定讀數,請利用 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示範:照片檢視器中的文件,並在除錯控制台顯示擷取的文字 'Chapter Eight The Deathday Party'

我可以使用哪些先進的串流處理技術?

在處理串流時,利用 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

若要加強影像處理,可考慮使用 Filter Wizard 自動決定特定文件類型的最佳預處理步驟。此外,當您處理串流中旋轉或傾斜的影像時,修正影像方向功能可大幅提升 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 檔案

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

在處理您的資料流之後,IronOCR 會提供豐富的結果物件,超越簡單的文字擷取。 OcrResult class 包含辨識文字的詳細資訊,包括置信分數、定位和結構:

// 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 格式的方法,讓您可以輕鬆地從您的串流輸入建立可搜尋的文件歸檔。 為了調試的目的,您可以使用 highlight texts 功能 來直觀顯示 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 bots,將他對技術的熱愛與創意結合。

審核人
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 等大型 Microsoft 開發人員活動撰寫工作坊、簡報和規劃內容。
準備好開始了嗎?
Nuget 下載 5,384,824 | 版本: 2026.2 剛剛發布