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

如何从 C# 中的 System.Drawing 对象中读取数据 IronOCR 通过将 `Bitmap` 和 `Image` 等对象封装在 `OcrImageInput` 中,可以从 `System.Drawing` 对象中读取文本,从而为 .NET 应用程序提供跨 Windows、macOS 和 Linux 平台的无缝 OCR 功能。 `System.Drawing.Bitmap`是 .NET Framework 中的一个类,用于处理位图图像。 它提供了创建、操作和显示位图图像的方法和属性。 `System.Drawing.Image`是 .NET Framework 中所有 GDI+ 图像对象的基类。 它是各种图像类型的父类,包括`System.Drawing.Bitmap` 。 `IronSoftware.Drawing.AnyBitmap`是[IronDrawing](/open-source/csharp/drawing/docs/)中的一个位图类,IronDrawing 是一个开源库,最初由 Iron Software 开发。 它可以帮助 C# 软件工程师在 Windows、macOS 和 Linux 平台上的 .NET 项目中替换`System.Drawing.Common` 。 *as-heading:2(快速入门:从 System.Drawing.Bitmap 读取文本)* 只需一条语句,即可创建一个 `IronTesseract` 并向其输入一个由 `OcrImageInput` 封装的 `System.Drawing.Bitmap` 以提取所有文本。 本快速入门示例演示了 IronOCR 如何以最少的设置将图像转换为可读文本。 ```cs:title= 在一行中提取文本 var result = new IronOcr.IronTesseract().Read(new IronOcr.OcrImageInput(new System.Drawing.Bitmap("image.png")); ```

如何从 System.Drawing.Bitmap 读取数据? 首先,实例化 **`IronTesseract`** 类以执行 OCR。 使用各种方法之一创建`System.Drawing.Bitmap` 。 在代码示例中,使用了文件路径。 接下来,使用`using`语句创建`OcrImageInput`对象,并将`System.Drawing.Bitmap`对象中的图像传递给它。 最后,使用`Read`方法执行 OCR。 ```csharp :path=/static-assets/ocr/content-code-examples/how-to/input-system-drawing-read-bitmap.cs ```

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

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

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

如何从 System.Drawing.Image 中读取? <!--![屏幕截图演示如何从 system.drawing.image 读取数据? in IronPDF](/static-assets/images/TODO/how-do-i-read-from-system.drawing.image-step_screenshot.webp) --> <!-- 说明:显示逐步过程的截图 --> 从`System.Drawing.Image`中读取数据非常简单,只需使用`Image`创建`OcrImageInput`对象,然后使用`Read`方法执行标准 OCR 过程即可。 ```csharp :path=/static-assets/ocr/content-code-examples/how-to/input-system-drawing-read-image.cs ```

用于 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](https://ironsoftware.com/csharp/ocr/examples/csharp-tesseract-multithreading-for-speed/) 示例展示了并发图像处理的最佳实践。

如何从 IronSoftware.Drawing.AnyBitmap 中读取? 同样地,在创建或获取`AnyBitmap`对象之后,您可以构造`OcrImageInput`类。 构造函数将处理导入数据的所有必要步骤。 下面的代码示例演示了这一点。 ```csharp :path=/static-assets/ocr/content-code-examples/how-to/input-system-drawing-read-anybitmap.cs ```

为什么选择 AnyBitmap 而不是 System.Drawing 类? 与 `System.Drawing` 类相比,`AnyBitmap` 提供了卓越的跨平台兼容性。 在 .NET 6+ 中,`System.Drawing.Common` 对非 Windows 平台的支持有限,而 `AnyBitmap` 可在 Windows、Linux 和 macOS 中无缝运行。 它提供了一致的 API,没有特定平台的依赖性,因此非常适合云部署和容器化应用程序。 `AnyBitmap`还提供更好的内存管理和性能优化,专为图像处理任务而设计。 有关详细的兼容性信息,请参阅我们的[兼容性](https://ironsoftware.com/csharp/ocr/docs/)文档。

AnyBitmap 支持哪些平台? `AnyBitmap` 支持 .NET 运行的所有主要平台:Windows(x86、x64、ARM)、Linux(包括用于 Docker 的 Alpine Linux)和 macOS(包括 Intel 和 Apple Silicon)。 对于需要在不同环境中运行的现代 .NET 应用程序来说,这种广泛的平台支持使其成为推荐的选择。 这对 AWS Lambda 或 Azure Functions 的云部署尤其有价值。 在我们的[Linux](https://ironsoftware.com/csharp/ocr/get-started/linux/)、[macOS](https://ironsoftware.com/csharp/ocr/get-started/mac/)和[Docker](https://ironsoftware.com/csharp/ocr/get-started/docker/)环境指南中,了解有关特定平台设置的更多信息。

AnyBitmap 如何处理内存管理? `AnyBitmap`通过自动垃圾回收集成和显式处置模式实现了高效的内存管理。 它为频繁分配的缓冲区使用了内存池,并实现了写时复制语义以提高性能。 与`System.Drawing.Bitmap`不同的是,`AnyBitmap`可将图像完全加载到内存中,从而避免了文件访问问题。 它还能在高吞吐量场景中更好地控制内存使用。 对于处理大量图像的应用程序,`AnyBitmap` 的内存效率可显著减少总体内存占用。 有关迁移技巧,请参见我们的 [System.Drawing.Common Alternatives](https://ironsoftware.com/csharp/ocr/troubleshooting/system-drawing-common-ironocr/) 指南。

如何指定扫描区域? 在`OcrImageInput`类的构造中,您可以指定要扫描的区域。 这样就可以定义图像文档中用于 OCR 的特定区域。 根据图像文件的不同,指定扫描区域可以显著提高性能。 在提供的代码示例中,只提取了章节号和标题。 ```csharp :path=/static-assets/ocr/content-code-examples/how-to/input-images-read-specific-region.cs ```

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

如何确定我所在地区的正确坐标? 确定坐标需要了解 `Rectangle` 使用(X、Y、Width、Height)格式,其中(0,0)为左上角。 首先在可显示光标坐标的图像编辑器中打开图像。 另外,也可以使用 IronOCR 的调试功能来可视化检测到的文本区域。 对于动态布局,可考虑使用 IronOCR 先进行全面扫描,然后分析 `OcrResult` 以编程方式查找文本位置。 我们的[高亮文本调试](https://ironsoftware.com/csharp/ocr/examples/highlight-texts-for-debugging/)示例展示了如何可视化 OCR 区域以准确确定坐标。

如果区域超出图像边界会发生什么情况? 当指定区域超出图像边界时,IronOCR 会自动将其剪切到有效图像区域。 例如,如果您的图像是 1000x1000 像素,而您指定的矩形范围是(900, 900, 200, 200),那么 IronOCR 将只处理从(900, 900)到(1000, 1000)的区域。 这种自动剪切可防止错误,但如果您的坐标不正确,可能会导致文本提取不完整。 请务必根据实际图像尺寸验证您的区域。 对于动态图像尺寸,应以百分比而不是固定像素来计算区域。 [OCR 图像区域](https://ironsoftware.com/csharp/ocr/how-to/ocr-region-of-an-image/)指南提供了更多安全区域处理的示例。 ### 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,246,844 | 版本: 2025.12 刚刚发布