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

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

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

IronOCR 通过将 BitmapImage 等对象封装在 OcrImageInput 中,可以从 System.Drawing 对象中读取文本,从而为 .NET 应用程序提供跨 Windows、macOS 和 Linux 平台的无缝 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 如何以最少的设置将图像转换为可读文本。

Nuget Icon立即开始使用 NuGet 创建 PDF 文件:

  1. 使用 NuGet 包管理器安装 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 读取数据?

<! -- 待办事项:在此处添加图片 --> <! -- Screenshot demonstrating how do i read from system.drawing.bitmap? in IronPdf --> <! <!-- 说明:显示逐步过程的截图 -->

首先,实例化 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);
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)
$vbLabelText   $csharpLabel

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

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

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

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

何时处置位图对象?

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

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

<! -- 待办事项:在此处添加图片 --> <!--!屏幕截图演示如何从 system.drawing.image 读取数据? 在 IronPDF 中 --> <!-- 说明:显示逐步过程的截图 -->

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);
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)
$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 是从磁盘加载图像的最简单、最直接的方法。 它能自动检测图像格式并处理文件读取过程。 对于网络应用程序或在使用内存流时,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);
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)
$vbLabelText   $csharpLabel

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

System.Drawing 类相比,AnyBitmap 提供了卓越的跨平台兼容性。 在 .NET 6+ 中,System.Drawing.Common 对非 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);
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)
$vbLabelText   $csharpLabel

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

当您只需要一致文档布局中特定区域的文本时,区域扫描可以显著提高性能。 常见用例包括提取页眉、表单字段、发票总额或身份证信息。 对于文本只占一小部分的大图片,性能提升最为显著。 对于 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结果

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,384,824 | 版本: 2026.2 刚刚发布