如何从 C# 中的 System.Drawing 对象中读取数据
IronOCR 通过将它们包装在 OcrImageInput 中,为像 Bitmap 和 Image 这样的 System.Drawing 对象提供无缝的 OCR 功能,跨 Windows、macOS 和 Linux 平台的 .NET 应用程序。
System.Drawing.Bitmap 是 .NET Framework 中用于处理位图图像的类。 它提供了创建、操作和显示位图图像的方法和属性。
System.Drawing.Image 是 .NET Framework 中所有 GDI+ 图像对象的基类。 它是各种图像类型的父类,包括 System.Drawing.Bitmap。
IronSoftware.Drawing.AnyBitmap 是 IronDrawing 中的一个位图类,这是一个由 Iron Software 原开发的开源库。 它帮助 C# 软件工程师在 Windows、macOS 和 Linux 平台上的 .NET 项目中替换 System.Drawing.Common。
快速入门:从 System.Drawing.Bitmap 中读取文本
通过一条语句创建一个 IronTesseract 并将其输入 System.Drawing.Bitmap 包装的 OcrImageInput 以提取所有文本。 本快速入门示例演示了 IronOCR 如何以最少的设置将图像转换为可读文本。
如何在 C# 中读取 System.Drawing 对象
- 下载用于读取 System.Drawing 对象的 C# 库
- 获取 System.Drawing 对象,如
Bitmap和Image - 使用获取的数据构建
OcrImageInput类 - 在 Linux 和 macOS 中使用 Iron Software 的
AnyBitmap - 通过指定裁剪区域定义读取区域
如何从 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);
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 很重要?
using 语句在处理 OcrImageInput 时至关重要,因为它确保了正确的资源管理和内存释放。OcrImageInput 实现了 IDisposable,这意味着它持有需要在完成后释放的非托管资源。 没有 using 语句,这些资源可能不会及时释放,可能导致内存泄漏或文件锁定。 在批量处理多个图像时,这一点尤为重要。 有关 IronOCR 中正确资源管理的更多详情,请参阅我们的 API Reference 文档。
常见的位图加载方法有哪些?
Bitmap 提供了超过我们示例中使用的文件路径构造函数的多种加载方法。 您可以从流(StreamReader),从现有的 Image)创建 Bitmap)。 在使用网络应用程序时,从流加载对于处理上传的文件特别有用。 对于嵌入资源,您可以使用 Resources。 IronOCR 通过 Bitmap 构造函数无缝处理所有这些 source 源。 在我们的 图像(jpg、png、gif、tiff、bmp) 指南中了解有关不同输入法的更多信息。
何时处置位图对象?
位图处理时间取决于您应用程序的工作流程。 如果您只需 bitmap 进行 OCR,在创建 ocrResult 后立即处理掉它。 但是,如果您需要执行多个操作或显示图片,请保持图片活力,直到所有操作完成。 总是使用 using 语句或 try-finally 块确保处理。 请记住,OcrImageInput 创建了自己的内部副本,因此在 OcrImageInput 创建后,原始的 bitmap 可以进行处理。 对于涉及多个图像操作的复杂场景,请参考我们的 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 是从磁盘加载图像的最简单和直接的方法。 它能自动检测图像格式并处理文件读取过程。 像 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 的免费试用,使用户在做出购买决定之前可以测试其功能和能力。

