如何在 C# 中從串流讀取資料以進行 OCR
IronOCR 可透過將資料串流傳遞給 OcrInput 或 OcrImageInput 建構函式,直接從 C# 中的資料串流讀取影像資料,從而實現高效能的 OCR 處理,無需將檔案儲存至磁碟。
流(stream)是一種可讀取或寫入的連續二進位資訊流。 在程式設計中,資料流透過將過大的資料分割成可處理的區塊,以高效的方式處理這些超出記憶體容量的資料。
IronOCR 的匯入方法可直接接受影像資料流。 將流資料傳入匯入方法,該方法會自動處理所有必要步驟。 針對進階情境,請探索 OcrInput 類別,該類別提供豐富的選項,可處理各種輸入格式。
快速入門:數秒內使用串流進行 OCR 輸入
此範例展示如何透過將 System.IO.Stream 輸入 IronOCR,跳過檔案路徑並以最少程式碼取得辨識出的文字,來實現即時 OCR。
簡化工作流程(5 個步驟)
- 下載用於從串流讀取資料的 C# 函式庫
- 取得並準備影像串流資料
- 將影像串流傳遞給 OcrImageInput 建構函式以匯入影像
- 使用
Read方法執行 OCR - 透過指定裁切區域來定義閱讀範圍
如何使用 IronOCR 讀取資料流?
首先,建立 IronTesseract 類別的實例以執行 OCR。 請使用 FromFile 的 AnyBitmap 方法來匯入影像檔案。此 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)
基於流的 OCR 技術能為接收圖片上傳、處理資料庫中的圖片,或處理不應寫入磁碟的臨時資料的網頁應用程式帶來效益。 此流式處理方法可與 System.Drawing 物件及其他影像處理函式庫無縫整合。
為何要使用流 (Streams) 進行 OCR?
使用資料流能為 .NET 開發人員帶來多項優勢:
- 記憶體效率:以區塊為單位處理資料,而非將整個檔案載入記憶體
- 安全性:處理敏感文件時,不會在磁碟上建立臨時檔案
- 效能:消除檔案系統操作中的 I/O 開銷
- 靈活性:支援網頁上傳、資料庫 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)
此技術特別適用於需要對圖片的特定區域進行 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
若需進階影像處理,建議使用"濾鏡精靈"自動為特定文件類型決定最佳的前置處理步驟。此外,當處理資料流中旋轉或傾斜的影像時,"修正影像方向"功能可顯著提升 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
為獲得最佳效果,處理低解析度串流時,請考慮調整 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
結果物件還提供方法,可匯出為可搜尋的 PDF 或 hOCR HTML 格式,讓您能輕鬆地從串流輸入中建立可搜尋的文件檔案庫。 為進行除錯,您可以使用文字標示功能,以視覺化方式檢視 IronOCR 在您的影像中偵測到的內容。
我應了解哪些效能考量?
在處理多重資料流或實作高吞吐量 OCR 解決方案時,請考慮以下優化策略:
- 重複使用
IronTesseract實例:建立單一實例並在多個操作中重複使用 - 實作進度追蹤:對於大型資料流,請使用進度追蹤功能來監控處理狀態
- 並行處理:
IronOCR支援多重資料流的並行處理 - 優化影像品質:對影像串流進行預處理,以確保最佳解析度與清晰度
為獲得最佳效能,請探索快速 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 的免費試用版,讓使用者能在決定購買前測試其功能與效能。

