如何从 C# 中的 System.Drawing 对象中读取数据
IronOCR 能够通过将 System.Drawing 对象(如 Bitmap 和 Image)封装在 OcrImageInput 中,从而读取其中的文本,为 Windows、macOS 和 Linux 平台上的 .NET 应用程序提供无缝的 OCR 功能。
System.Drawing.Bitmap 是 .NET Framework 中用于处理位图图像的类。 它提供了创建、操作和显示位图图像的方法和属性。
System.Drawing.Image 是 .NET Framework 中所有 GDI+ 图像对象的基类。 它是多种图像类型的基类,包括 System.Drawing.Bitmap。
IronSoftware.Drawing.AnyBitmap 是 IronDrawing 中的一个位图类,IronDrawing 是由 Iron Software 最初开发的开源库。 它可帮助 C# 软件工程师在 Windows、macOS 和 Linux 平台上的 .NET 项目中替换 System.Drawing.Common。
快速入门:从 System.Drawing.Bitmap 中读取文本
通过单行语句创建一个 IronTesseract,并向其传入由 OcrImageInput 包裹的 System.Drawing.Bitmap,以提取所有文本。 本快速入门示例演示了 IronOCR 如何以最少的设置将图像转换为可读文本。
如何在 C# 中读取 System.Drawing 对象
- 下载用于读取 System.Drawing 对象的 C# 库
- 获取 System.Drawing 对象,如
Bitmap和Image - 使用获取的数据构建
OcrImageInput类 - 在 Linux 和 macOS 中使用 Iron Software 的
AnyBitmap - 通过指定裁剪区域定义读取区域
如何从 System.Drawing.Bitmap 读取数据?
首先,实例化 类以执行 OCR。 通过多种方法之一创建一个。 在代码示例中,使用了文件路径。
接下来,使用 语句创建 对象,并将 对象中的图像传递给它。 最后,请使用 方法进行 OCR 处理。
:path=/static-assets/ocr/content-code-examples/how-to/input-system-drawing-read-bitmap.cs
using IronOcr;
using System.Drawing;
// Instantiate IronTesseract
IronTesseract ocrTesseract = new IronTesseract();
// Read image file to Bitmap
Bitmap bitmap = new Bitmap("Potter.tiff");
// Import System.Drawing.Bitmap
using var imageInput = new OcrImageInput(bitmap);
// Perform OCR
OcrResult ocrResult = ocrTesseract.Read(imageInput);
Imports IronOcr
Imports System.Drawing
' Instantiate IronTesseract
Private ocrTesseract As New IronTesseract()
' Read image file to Bitmap
Private bitmap As New Bitmap("Potter.tiff")
' Import System.Drawing.Bitmap
Private imageInput = New OcrImageInput(bitmap)
' Perform OCR
Private ocrResult As OcrResult = ocrTesseract.Read(imageInput)
为什么使用语句对 OcrImageInput 很重要?
在使用 OcrImageInput 时,using 语句至关重要,因为它能确保资源管理和内存清理的正确性。 OcrImageInput 实现了 IDisposable,这意味着它持有非托管资源,当您不再需要该对象时,必须释放这些资源。 如果没有 using 语句,这些资源可能无法及时释放,从而可能导致内存泄漏或文件锁定。 在批量处理多个图像时,这一点尤为重要。 有关 IronOCR 中正确资源管理的更多详情,请参阅我们的 API Reference 文档。
常见的位图加载方法有哪些?
Bitmap 提供了多种加载方法,不仅限于示例中使用的文件路径构造函数。 您可以从数据流(StreamReader)中生成 Bitmap,从现有的 Bitmap)。 在使用网络应用程序时,从流加载对于处理上传的文件特别有用。 对于嵌入式资源,您可以使用 Resources。 IronOCR 通过 Bitmap 构造函数无缝处理所有这些 source 源文件。 在我们的 图像(jpg、png、gif、tiff、bmp) 指南中了解有关不同输入法的更多信息。
何时处置位图对象?
位图处理时间取决于您应用程序的工作流程。 若仅需 bitmap 用于 OCR,请在生成 ocrResult 后立即将其删除。 但是,如果您需要执行多个操作或显示图片,请保持图片活力,直到所有操作完成。 请始终使用 using 语句或 try-finally 代码块以确保资源释放。 请注意,OcrImageInput 会生成其自身的内部副本,因此 bitmap 创建完成后,原始的 OcrImageInput 即可被释放。 对于涉及多个图像操作的复杂场景,请参考我们的 OCR 图像优化过滤器示例。
如何从 System.Drawing.Image 中读取?
从 Image 中读取数据非常简单,只需使用 Image 创建 OcrInput 对象,然后使用 Read 方法执行标准的 OCR 处理即可。
:path=/static-assets/ocr/content-code-examples/how-to/input-system-drawing-read-image.cs
using IronOcr;
using Image = System.Drawing.Image;
// Instantiate IronTesseract
IronTesseract ocrTesseract = new IronTesseract();
// Open image file as Image
Image image = Image.FromFile("Potter.tiff");
// Import System.Drawing.Image
using var imageInput = new OcrImageInput(image);
// Perform OCR
OcrResult ocrResult = ocrTesseract.Read(imageInput);
Imports IronOcr
Imports Image = System.Drawing.Image
' Instantiate IronTesseract
Private ocrTesseract As New IronTesseract()
' Open image file as Image
Private image As Image = Image.FromFile("Potter.tiff")
' Import System.Drawing.Image
Private imageInput = New OcrImageInput(image)
' Perform OCR
Private ocrResult As OcrResult = ocrTesseract.Read(imageInput)
用于 OCR 的图像和位图有什么区别?
虽然 Bitmap 是针对位图图像的特定实现,但 Image 是一个抽象基类,可表示包括 JPEG、PNG、GIF 和 TIFF 在内的多种图像格式。 在 OCR 应用中,IronOCR 通过 OcrInput 将两者视为等同,但 Image 在处理不同格式时提供了更大的灵活性。 Bitmap 提供像素级操作功能,而 Image 更适合常规图像处理。 两者与 IronOCR 先进的 Tesseract 5 引擎配合使用,效果同样出色。选择取决于您更广泛的应用需求,而不是 OCR 性能。
为什么使用 Image.FromFile 而不是其他加载方法?
Image.FromFile 是从磁盘加载图像最简单、最直接的方法。 它能自动检测图像格式并处理文件读取过程。 对于 Web 应用程序或处理内存流时,MemoryStream 等替代方法更为合适。 FileStream 会锁定文件,直到 FileStream 被释放,这在多线程应用程序中需要特别注意。 对于需要高性能或并发访问的生产场景,可考虑先将图像加载到内存流中。我们的 Multithreaded Tesseract OCR 示例展示了并发图像处理的最佳实践。
如何从 IronSoftware.Drawing.AnyBitmap 中读取?
同样,在创建或获取 AnyBitmap 对象后,您可以构建 OcrInput 类。 构造函数将处理导入数据的所有必要步骤。 下面的代码示例演示了这一点。
:path=/static-assets/ocr/content-code-examples/how-to/input-system-drawing-read-anybitmap.cs
using IronOcr;
using IronSoftware.Drawing;
// Instantiate IronTesseract
IronTesseract ocrTesseract = new IronTesseract();
// Open image file as AnyBitmap
AnyBitmap anyBitmap = AnyBitmap.FromFile("Potter.tiff");
// Import IronSoftware.Drawing.AnyBitmap
using var imageInput = new OcrImageInput(anyBitmap);
// Perform OCR
OcrResult ocrResult = ocrTesseract.Read(imageInput);
Imports IronOcr
Imports IronSoftware.Drawing
' Instantiate IronTesseract
Private ocrTesseract As New IronTesseract()
' Open image file as AnyBitmap
Private anyBitmap As AnyBitmap = AnyBitmap.FromFile("Potter.tiff")
' Import IronSoftware.Drawing.AnyBitmap
Private imageInput = New OcrImageInput(anyBitmap)
' Perform OCR
Private ocrResult As OcrResult = ocrTesseract.Read(imageInput)
为什么选择 AnyBitmap 而不是 System.Drawing 类?
AnyBitmap 相比 Bitmap 类,提供了更出色的跨平台兼容性。 虽然 Bitmap 在 .NET 6+ 的非 Windows 平台上支持有限,但 AnyBitmap 可在 Windows、Linux 和 macOS 系统上无缝运行。 它提供了一致的 API,没有特定平台的依赖性,因此非常适合云部署和容器化应用程序。 AnyBitmap 还提供了更优的内存管理及性能优化,这些功能专为图像处理任务而设计。 有关详细的兼容性信息,请参阅我们的兼容性文档。
AnyBitmap 支持哪些平台?
AnyBitmap 支持所有 .NET 可运行的主要平台:Windows(x86、x64、ARM)、Linux(包括适用于 Docker 的 Alpine Linux)以及 macOS(Intel 和 Apple Silicon 架构均支持)。 对于需要在不同环境中运行的现代 .NET 应用程序来说,这种广泛的平台支持使其成为推荐的选择。 这对 AWS Lambda 或 Azure Functions 的云部署尤其有价值。 在我们的Linux、macOS和Docker环境指南中,了解有关特定平台设置的更多信息。
AnyBitmap 如何处理内存管理?
AnyBitmap 通过集成自动垃圾回收机制和显式释放模式,实现了高效的内存管理。 它为频繁分配的缓冲区使用了内存池,并实现了写时复制语义以提高性能。 与可能持有文件锁的 AnyBitmap 不同,AnyBitmap 会将图像完全加载到内存中,从而避免文件访问问题。 它还能在高吞吐量场景中更好地控制内存使用。 对于处理大量图像的应用程序,AnyBitmap 的内存效率可显著降低整体内存占用。 有关迁移技巧,请参见我们的 System.Drawing.Common Alternatives 指南。
如何指定扫描区域?
在构建 OcrInput 类时,您可以指定要扫描的区域。 这样就可以定义图像文档中用于 OCR 的特定区域。 根据图像文件的不同,指定扫描区域可以显著提高性能。 在提供的代码示例中,只提取了章节号和标题。
:path=/static-assets/ocr/content-code-examples/how-to/input-images-read-specific-region.cs
using IronOcr;
using IronSoftware.Drawing;
using System;
// Instantiate IronTesseract
IronTesseract ocrTesseract = new IronTesseract();
// Specify crop region
Rectangle scanRegion = new Rectangle(800, 200, 900, 400);
// Add image
using var imageInput = new OcrImageInput("Potter.tiff", 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()
' Specify crop region
Private scanRegion As New Rectangle(800, 200, 900, 400)
' Add image
Private imageInput = New OcrImageInput("Potter.tiff", ContentArea:= scanRegion)
' Perform OCR
Private ocrResult As OcrResult = ocrTesseract.Read(imageInput)
' Output the result to console
Console.WriteLine(ocrResult.Text)
何时应使用区域扫描以提高性能?
当您只需要一致文档布局中特定区域的文本时,区域扫描可以显著提高性能。 常见用例包括提取页眉、表单字段、发票总额或身份证信息。 对于文本只占一小部分的大图片,性能提升最为显著。 对于 3000x4000 像素的发票,仅扫描总金额区域的速度要比全页 OCR 快 10-20 倍。 区域扫描还能消除其他区域可能产生的噪音,从而提高准确性。 有关更多基于区域的示例,请参阅我们的 Content Areas & Crop Regions with PDFs 指南。
如何确定我所在地区的正确坐标?
确定坐标时需注意,Rectangle采用 (X, Y, Width, Height) 格式,其中 (0,0) 代表左上角。 首先在可显示光标坐标的图像编辑器中打开图像。 另外,也可以使用 IronOCR 的调试功能来可视化检测到的文本区域。 对于动态布局,建议先使用 IronOCR 进行全页扫描,然后通过分析 OcrResult 标记来程序化地定位文本位置。 我们的高亮文本调试示例展示了如何可视化 OCR 区域以准确确定坐标。
如果区域超出图像边界会发生什么情况?
当指定区域超出图像边界时,IronOCR 会自动将其剪切到有效图像区域。 例如,如果您的图像是 1000x1000 像素,而您指定的矩形范围是(900, 900, 200, 200),那么 IronOCR 将只处理从(900, 900)到(1000, 1000)的区域。 这种自动剪切可防止错误,但如果您的坐标不正确,可能会导致文本提取不完整。 请务必根据实际图像尺寸验证您的区域。 对于动态图像尺寸,应以百分比而不是固定像素来计算区域。 OCR 图像区域指南提供了更多安全区域处理的示例。
OCR结果
using
OcrImageInput
OcrImageInput
IDisposable
using
System.Drawing.Bitmap
Bitmaps
new Bitmap(stream)
Images
new Bitmap(image)
new Bitmap(width, height)
Assembly.GetManifestResourceStream()
Bitmap
OcrImageInput
Bitmap
OcrImageInput
using
OcrImageInput
Bitmap
OcrImageInput
System.Drawing.Image
OcrImageInput
Image
Read
System.Drawing.Bitmap
System.Drawing.Image
OcrImageInput
Image
Bitmap
Image
Image.FromFile
Image.FromStream
Image.FromFile
Image
AnyBitmap
OcrImageInput
AnyBitmap
System.Drawing
System.Drawing.Common
AnyBitmap
AnyBitmap
AnyBitmap
AnyBitmap
System.Drawing.Bitmap
AnyBitmap
AnyBitmap
OcrImageInput
Rectangle
OcrResult
常见问题解答
如何在 C# 中使用 OCR 从 System.Drawing.Bitmap 中提取文本?
IronOCR 使从 System.Drawing.Bitmap 对象中提取文本变得简单。首先,实例化 IronTesseract 类,然后使用 using 语句将 Bitmap 包入 OcrImageInput 对象,最后调用 Read 方法。最小代码为: var result = new IronOcr.IronTesseract().Read(new IronOcr.OcrImageInput(bitmap));
为什么使用 OcrImageInput 时 using 语句很重要?
using 语句至关重要,因为 OcrImageInput 实现了 IDisposable 并持有需要适当清理的非托管资源。没有它,你就会面临内存泄漏或文件锁的风险,尤其是在处理多个图像时。IronOCR 的 OcrImageInput 需要适当的处理,以确保在您的 .NET 应用程序中实现高效的资源管理。
我可以对 System.Drawing.Image 对象执行 OCR 吗?
是的,IronOcr 支持 System.Drawing.Image 对象上的 OCR,因为 Image 是位图的基类。只需像处理位图一样,将图像对象封装到 OcrImageInput 中,IronOCR 就能在 Windows、macOS 和 Linux 平台上无缝提取文本。
什么是 IronSoftware.Drawing.AnyBitmap,它与 OCR 有什么关系?
IronSoftware.Drawing.AnyBitmap 是 IronDrawing 的位图类,它是一个开源库,有助于在 .NET 项目中取代 System.Drawing.Common。它为 Windows、macOS 和 Linux 提供了跨平台兼容性,因此当你需要在不同操作系统中进行一致的图像处理时,它是与 IronOCR 配合使用的理想选择。
我能否指定图像的特定区域进行文本提取?
是的,IronOCR 允许您通过指定裁剪区域来定义特定的阅读区域。该功能可让您将 OCR 处理集中在 System.Drawing 对象的特定部分,从而在只需要图像特定部分的文本时提高性能和准确性。
IronOCR 是否支持多种语言?
IronOCR支持多种语言,使其成为全球应用程序中需要不同语言文本识别的多功能工具。
IronOCR可以集成到现有应用程序中吗?
IronOCR设计为易于使用C#集成到现有应用程序中,允许开发人员以最小的努力为他们的软件添加OCR功能。
使用IronOCR进行文档管理有什么好处?
使用IronOCR进行文档管理可以通过将扫描的文档转换为可搜索和可编辑文本来简化工作流程,减少手动数据输入的需要,提高文档可访问性。
IronOCR如何提高数据准确性?
IronOCR通过其高级识别算法和图像校正功能提高数据准确性,确保文本提取过程既可靠又精确。
IronOCR 有免费试用版吗?
是的,Iron Software 提供IronOCR 的免费试用,使用户在做出购买决定之前可以测试其功能和能力。

