如何在 C# 中從流中讀取資料進行 OCR辨識與圖片轉文字
IronOCR透過將流傳遞給 OcrInput 或 OcrImageInput 建構函數,直接從 C# 中的流讀取影像數據,從而實現高效的 OCR辨識處理,而無需將檔案儲存到磁碟,輕鬆完成圖片轉文字功能。
資料流是指可以讀取或寫入的連續二進位資訊流。 在程式設計中,串流透過將資料分成可管理的小塊來有效地處理記憶體無法容納的大量資料。
IronOCR的導入方法可以直接接受影像資料流。 將流資料傳遞給導入方法,該方法會自動處理所有必要的步驟。 對於進階場景,請探索OcrInput 類,該類別提供了準備各種輸入格式的豐富選項。
快速入門:使用串流進行 OCR 輸入(秒速)
本範例示範了透過將 System.IO.Stream 輸入IronOCR來實現即時 OCR,跳過檔案路徑,並以最少的程式碼檢索識別的文字。
最簡工作流程(5個步驟)
- 下載一個用於從流中讀取資料的 C# 庫。
- 取得並準備影像流數據
- 將影像流傳遞給**`OcrImageInput`**建構函數以匯入影像
- 使用`Read`方法執行 OCR
- 透過指定作物區域來定義閱讀區域
如何使用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);
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 技術有利於接收映像上傳、處理資料庫中的映像或處理不應寫入磁碟的臨時資料的 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);
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 檔案。
如何處理來自串流媒體的 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 解決方案時,請考慮以下最佳化策略:
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 與其他影像處理工作流程輕鬆結合。

