如何从 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 有利于网络应用程序接收上传的图像、处理数据库中的图像或处理不应写入磁盘的临时数据。 流式方法与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
要增强图像处理能力,请考虑使用 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
为获得最佳效果,请考虑在处理低分辨率流时调整 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 流。这包括来自网络上传的内存流、来自数据库 BLOB 字段的流或来自图像处理库的流。当你将数据流传递给 OcrInput 或 OcrImageInput 时,该库会自动处理所有必要的转换步骤。
在 C# 中对数据流执行 OCR 的最简单方法是什么?
最快捷的方法是用您的数据流创建一个 OcrInput 对象,然后调用读取方法:"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 与其他图像处理工作流结合起来。

