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

如何在C#中使用IronOCR從流中讀取

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

IronOCR在C#中通過將流傳遞到OcrImageInput構造函式來直接從流中讀取影像資料,使其無需將文件保存到磁碟便可進行高效的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。 使用AnyBitmap物件將影像資料轉換為流。 接下來,使用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物件及其他影像操作程式庫無縫整合。

為什麼使用流進行OCR?

使用流為.NET開發人員提供了多項優勢:

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

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

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

為改善大影像上的性能並從特定區域獲得讀數,請使用CropRectangle類。 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文件

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

在處理您的流後,IronOCR提供了超出簡單文字提取的豐富結果物件。 OcrResult包含有關識別文字的詳細資訊,包括信心水準、定位和結構:

:path=/static-assets/ocr/content-code-examples/how-to/input-streams-6.cs
// 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.SaveAsHocrFile("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.SaveAsHocrFile("output.html")
End Using
$vbLabelText   $csharpLabel

結果物件還提供方法來匯出為可搜尋的PDFhOCR HTML格式,使從流輸入建立可搜尋的文件檔案更為容易。 為除錯用途,您可以使用高亮文字功能來視覺化IronOCR在您的影像中檢測到的內容。

我應該知道哪些性能考量?

處理多個流或實現高吞吐量OCR解決方案時,請考慮以下優化策略:

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

為獲得最佳性能,探索快速OCR配置選項,並考慮在批次操作中實施多執行緒處理。 處理時間敏感的應用程式時,理解超時有助於有效管理長時間運行的OCR操作。

如何排除常見流問題?

當處理流時,您可能會遇到具體挑戰。 以下是常見情境的解決方案:

  • 流位置:在傳遞給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大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,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 下載 6,136,090 | 版本: 2026.7 剛剛發布
Still Scrolling Icon

還在滾動?

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