如何在 C# 中使用 System.Drawing 图像进行 OCR 处理

如何从 C# 中的 System.Drawing 对象中读取数据

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

IronOCR通过将 System.Drawing 对象(如 BitmapImage)包装在 OcrImageInput 中,从而读取其中的文本,为 Windows、macOS 和 Linux 平台上的.NET应用程序提供无缝的 OCR 功能。

System.Drawing.Bitmap 是.NET Framework中用于处理位图图像的类。 它提供了创建、操作和显示位图图像的方法和属性。

System.Drawing.Image 是.NET Framework中所有 GDI+ 图像对象的基类。 它是各种图像类型的父类,包括 System.Drawing.Bitmap

IronSoftware.Drawing.AnyBitmapIronDrawing中的一个位图类,IronDrawing 是一个开源库,最初由Iron Software开发。 它可以帮助 C# 软件工程师在 Windows、macOS 和 Linux 平台上的.NET项目中替换 System.Drawing.Common

快速入门:从 System.Drawing.Bitmap 读取文本

使用一条语句,创建一个 IronTesseract,并向其提供一个用 OcrImageInput 包裹的 System.Drawing.Bitmap,以提取所有文本。 本快速入门示例演示了 IronOCR 如何以最少的设置将图像转换为可读文本。

  1. 使用 NuGet 包管理器安装 https://www.nuget.org/packages/IronOcr

    PM > Install-Package IronOcr
  2. 复制并运行这段代码。

    var result = new IronOcr.IronTesseract().Read(new IronOcr.OcrImageInput(new System.Drawing.Bitmap("image.png")));
  3. 部署到您的生产环境中进行测试

    通过免费试用立即在您的项目中开始使用IronOCR

    arrow pointer


如何从 System.Drawing.Bitmap 读取数据?

首先,实例化IronTesseract类以执行 OCR。 通过各种方法之一创建 System.Drawing.Bitmap。 在代码示例中,使用了文件路径。

接下来,使用 using 语句创建 OcrImageInput 对象,并将 System.Drawing.Bitmap 对象中的图像传递给它。 最后,使用 Read 方法执行 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);
$vbLabelText   $csharpLabel

为什么使用语句对 OcrImageInput 很重要?

使用 using 时,语句 OcrImageInput 至关重要,因为它能确保正确的资源管理和内存清理。OcrImageInput 实现了 IDisposable,这意味着它持有非托管资源,这些资源需要在对象使用完毕后释放。 如果没有 using 语句,这些资源可能无法及时释放,从而可能导致内存泄漏或文件锁定。 在批量处理多个图像时,这一点尤为重要。 有关 IronOCR 中正确资源管理的更多详情,请参阅我们的 API Reference 文档。

常见的位图加载方法有哪些?

除了我们示例中使用的文件路径构造函数之外,System.Drawing.Bitmap 还提供了几种加载方法。 您可以从流(Images)创建 new Bitmap(width, height))。 在使用网络应用程序时,从流加载对于处理上传的文件特别有用。 对于嵌入式资源,您可以使用 Assembly.GetManifestResourceStream()。 IronOCR通过 OcrImageInput 构造函数无缝地处理所有这些 Bitmap 源。 在我们的 图像(jpg、png、gif、tiff、bmp) 指南中了解有关不同输入法的更多信息。

何时处置位图对象?

位图处理时间取决于您应用程序的工作流程。 如果您只需要 Bitmap 用于 OCR,请在创建 OcrImageInput 后立即将其丢弃。 但是,如果您需要执行多个操作或显示图片,请保持图片活力,直到所有操作完成。 始终使用 using 语句或 try-finally 块来确保资源释放。 请记住,OcrImageInput 会创建自己的内部副本,因此在创建 OcrImageInput 之后,可以处置原始的 Bitmap。 对于涉及多个图像操作的复杂场景,请参考我们的 OCR 图像优化过滤器示例。

如何从 System.Drawing.Image 中读取?

System.Drawing.Image 读取数据就像使用 Image 创建 OcrImageInput 对象,然后使用 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);
$vbLabelText   $csharpLabel

用于 OCR 的图像和位图有什么区别?

虽然 System.Drawing.Bitmap 是位图图像的特定实现,但 System.Drawing.Image 是一个抽象基类,可以表示各种图像格式,包括 JPEG、PNG、GIF 和 TIFF。 就 OCR 而言, IronOCR通过 OcrImageInput 将两者视为相同,但 Image 在处理不同格式时提供了更大的灵活性。 Bitmap 提供像素级操作功能,而 Image 更适合一般图像处理。 两者与 IronOCR 先进的 Tesseract 5 引擎配合使用,效果同样出色。选择取决于您更广泛的应用需求,而不是 OCR 性能。

为什么使用 Image.FromFile 而不是其他加载方法?

Image.FromFile 是从磁盘加载图像的最简单、最直接的方法。 它能自动检测图像格式并处理文件读取过程。 对于 Web 应用程序或处理内存流时,类似 Image.FromStream 的替代方法更好。 Image.FromFile 会锁定文件,直到 Image 被释放,这在多线程应用程序中可能是一个需要考虑的问题。 对于需要高性能或并发访问的生产场景,可考虑先将图像加载到内存流中。我们的 Multithreaded Tesseract OCR 示例展示了并发图像处理的最佳实践。

如何从 IronSoftware.Drawing.AnyBitmap 中读取?

同样地,在创建或获取 AnyBitmap 对象之后,您可以构造 OcrImageInput 类。 构造函数将处理导入数据的所有必要步骤。 下面的代码示例演示了这一点。

: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);
$vbLabelText   $csharpLabel

为什么选择 AnyBitmap 而不是 System.Drawing 类?

System.Drawing 类相比,AnyBitmap 具有更优异的跨平台兼容性。 虽然 System.Drawing.Common 在.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 的云部署尤其有价值。 在我们的LinuxmacOSDocker环境指南中,了解有关特定平台设置的更多信息。

AnyBitmap 如何处理内存管理?

AnyBitmap 通过自动垃圾回收集成和显式释放模式实现高效的内存管理。 它为频繁分配的缓冲区使用了内存池,并实现了写时复制语义以提高性能。 与可以持有文件锁的 System.Drawing.Bitmap 不同,AnyBitmap 将图像完全加载到内存中,从而防止文件访问问题。 它还能在高吞吐量场景中更好地控制内存使用。 对于处理大量图像的应用程序,AnyBitmap 的内存效率可以显著降低整体内存占用。 有关迁移技巧,请参见我们的 System.Drawing.Common Alternatives 指南。

如何指定扫描区域?

在构造 OcrImageInput 类时,您可以指定要扫描的区域。 这样就可以定义图像文档中用于 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);
$vbLabelText   $csharpLabel

何时应使用区域扫描以提高性能?

当您只需要一致文档布局中特定区域的文本时,区域扫描可以显著提高性能。 常见用例包括提取页眉、表单字段、发票总额或身份证信息。 对于文本只占一小部分的大图片,性能提升最为显著。 对于 3000x4000 像素的发票,仅扫描总金额区域的速度要比全页 OCR 快 10-20 倍。 区域扫描还能消除其他区域可能产生的噪音,从而提高准确性。 有关更多基于区域的示例,请参阅我们的 Content Areas & Crop Regions with PDFs 指南。

如何确定我所在地区的正确坐标?

确定坐标需要了解 Rectangle 使用 (X, Y, 宽度, 高度) 格式,其中 (0,0) 是左上角。 首先在可显示光标坐标的图像编辑器中打开图像。 另外,也可以使用 IronOCR 的调试功能来可视化检测到的文本区域。 对于动态布局,可以考虑先使用IronOCR执行完整扫描,然后分析 OcrResult 以通过编程方式查找文本位置。 我们的高亮文本调试示例展示了如何可视化 OCR 区域以准确确定坐标。

如果区域超出图像边界会发生什么情况?

当指定区域超出图像边界时,IronOCR 会自动将其剪切到有效图像区域。 例如,如果您的图像是 1000x1000 像素,而您指定的矩形范围是(900, 900, 200, 200),那么 IronOCR 将只处理从(900, 900)到(1000, 1000)的区域。 这种自动剪切可防止错误,但如果您的坐标不正确,可能会导致文本提取不完整。 请务必根据实际图像尺寸验证您的区域。 对于动态图像尺寸,应以百分比而不是固定像素来计算区域。 OCR 图像区域指南提供了更多安全区域处理的示例。

OCR结果

OCR 提取演示,显示照片查看器中的哈利波特章节文本和调试控制台中的提取输出

常见问题解答

如何在 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 对象的特定部分,从而在只需要图像特定部分的文本时提高性能和准确性。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,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 峰会在内的最大型微软开发者活动的内容。
准备开始了吗?
Nuget 下载 5,556,263 | 版本: 2026.3 刚刚发布
Still Scrolling Icon

还在滚动吗?

想快速获得证据? PM > Install-Package IronOcr
运行示例 观看您的图像变成可搜索文本。