Cómo usar imágenes de System.Drawing para procesamiento de OCR en C#

Cómo leer de objetos System.Drawing en C

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

IronOCR permite leer texto de objetos System.Drawing como Bitmap y Image envolviéndolos en OcrImageInput, lo que proporciona una funcionalidad de OCR perfecta para aplicaciones .NET en plataformas Windows, macOS y Linux.

System.Drawing.Bitmap es una clase en .NET Framework utilizada para trabajar con imágenes de mapa de bits. Proporciona métodos y propiedades para crear, manipular y mostrar imágenes de mapa de bits.

System.Drawing.Image es una clase base para todos los objetos de imagen GDI+ en .NET Framework. Es la clase padre de varios tipos de imágenes, incluido System.Drawing.Bitmap.

IronSoftware.Drawing.AnyBitmap es una clase de mapa de bits en IronDrawing , una biblioteca de código abierto desarrollada originalmente por Iron Software. Ayuda a los ingenieros de software de C# a reemplazar System.Drawing.Common en proyectos .NET en plataformas Windows, macOS y Linux.

Inicio rápido: Leer texto desde un mapa de bits del sistema

Con una sola declaración, cree un IronTesseract y aliméntelo con un System.Drawing.Bitmap envuelto por OcrImageInput para extraer todo el texto. Este ejemplo de inicio rápido muestra cómo IronOCR convierte imágenes en texto legible con una configuración mínima.

  1. Instala IronOCR con el Administrador de Paquetes NuGet

    PM > Install-Package IronOcr
  2. Copie y ejecute este fragmento de código.

    var result = new IronOcr.IronTesseract().Read(new IronOcr.OcrImageInput(new System.Drawing.Bitmap("image.png")));
  3. Despliegue para probar en su entorno real

    Comienza a usar IronOCR en tu proyecto hoy mismo con una prueba gratuita

    arrow pointer


¿Cómo leer de System.Drawing.Bitmap?

Primero, cree una instancia de la clase IronTesseract para realizar el OCR. Crea un System.Drawing.Bitmap desde uno de los distintos métodos. En el ejemplo de código, se utiliza una ruta de archivo.

A continuación, utilice la declaración using para crear el objeto OcrImageInput y pasarle la imagen del objeto System.Drawing.Bitmap. Por último, utilice el método Read para realizar el 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

¿Por qué es importante la sentencia using para OcrImageInput?

La declaración using es crucial cuando se trabaja con OcrImageInput porque garantiza la administración adecuada de los recursos y la limpieza de la memoria. OcrImageInput implementa IDisposable, lo que significa que contiene recursos no administrados que deben liberarse cuando haya terminado con el objeto. Sin la declaración using, estos recursos podrían no liberarse rápidamente, lo que podría provocar pérdidas de memoria o bloqueos de archivos. Esto es especialmente importante cuando se procesan múltiples imágenes en operaciones por lotes. Para más detalles sobre la correcta gestión de recursos en IronOCR, consulte nuestra documentación API Reference.

¿Cuáles son los métodos habituales de carga de mapas de bits?

System.Drawing.Bitmap proporciona varios métodos de carga más allá del constructor de ruta de archivo utilizado en nuestro ejemplo. Puede crear Bitmaps a partir de secuencias (new Bitmap(stream)), a partir de Images (new Bitmap(image)) existentes, o incluso crear mapas de bits en blanco con dimensiones específicas (new Bitmap(width, height)). Cuando se trabaja con aplicaciones web, la carga desde secuencias es especialmente útil para procesar archivos cargados. Para recursos integrados, puede utilizar Assembly.GetManifestResourceStream(). IronOCR maneja todas estas fuentes Bitmap sin problemas a través del constructor OcrImageInput. Obtenga más información sobre los diferentes métodos de entrada en nuestra guía Imágenes (jpg, png, gif, tiff, bmp).

¿Cuándo debo deshacerme del objeto Bitmap?

El tiempo de eliminación de los mapas de bits depende del flujo de trabajo de su aplicación. Si solo necesita el Bitmap para OCR, deséchelo inmediatamente después de crear el OcrImageInput. Sin embargo, si necesita realizar varias operaciones o mostrar la imagen, manténgala viva hasta que se completen todas las operaciones. Utilice siempre declaraciones using o bloques try-finally para garantizar la eliminación. Recuerde que OcrImageInput crea su propia copia interna, por lo que el Bitmap original se puede eliminar después de la creación de OcrImageInput. Para situaciones complejas que impliquen múltiples operaciones de imagen, considere nuestros ejemplos de Filtros de optimización de imágenesOCR.

¿Cómo leer de System.Drawing.Image?

Leer desde un System.Drawing.Image es tan simple como crear el objeto OcrImageInput con el Image y luego realizar el proceso de OCR estándar utilizando el método Read.

: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

¿Cuál es la diferencia entre imagen y mapa de bits para OCR?

Mientras que System.Drawing.Bitmap es una implementación específica para imágenes de mapa de bits, System.Drawing.Image es una clase base abstracta que puede representar varios formatos de imagen, incluidos JPEG, PNG, GIF y TIFF. Para fines de OCR, IronOCR trata a ambos de manera idéntica a través de OcrImageInput, pero Image proporciona más flexibilidad al trabajar con diferentes formatos. Bitmap ofrece capacidades de manipulación a nivel de píxel, mientras que Image es mejor para el manejo general de imágenes. Ambas funcionan igual de bien con el avanzado motor Tesseract 5 de IronOCR. La elección depende de sus necesidades de aplicación más amplias que del rendimiento del OCR.

¿Por qué utilizar Image.FromFile en lugar de otros métodos de carga?

Image.FromFile es el método más simple y directo para cargar imágenes desde el disco. Detecta automáticamente el formato de la imagen y se encarga del proceso de lectura del archivo. Los métodos alternativos como Image.FromStream son mejores para aplicaciones web o cuando se trabaja con flujos de memoria. Image.FromFile bloquea el archivo hasta que se elimine Image, lo que puede ser un factor a considerar en aplicaciones multiproceso. Para escenarios de producción que requieran un alto rendimiento o acceso concurrente, considere cargar primero las imágenes en flujos de memoria. Nuestro ejemplo Multithreaded Tesseract OCR demuestra las mejores prácticas para el procesamiento concurrente de imágenes.

¿Cómo leer de IronSoftware.Drawing.AnyBitmap?

De manera similar, después de crear u obtener un objeto AnyBitmap, puede construir la clase OcrImageInput. El constructor se encargará de todos los pasos necesarios para importar los datos. El ejemplo de código a continuación demuestra esto.

: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

¿Por qué elegir AnyBitmap en lugar de las clases System.Drawing?

AnyBitmap ofrece una compatibilidad multiplataforma superior en comparación con las clases System.Drawing. Si bien System.Drawing.Common tiene soporte limitado en plataformas que no sean Windows en .NET 6+, AnyBitmap funciona sin problemas en Windows, Linux y macOS. Proporciona una API coherente sin dependencias específicas de la plataforma, por lo que es ideal para implementaciones en la nube y aplicaciones en contenedores. AnyBitmap también ofrece una mejor gestión de memoria y optimizaciones de rendimiento diseñadas específicamente para tareas de procesamiento de imágenes. Para obtener información detallada sobre compatibilidad, consulte nuestra documentación Compatibilidad.

¿Qué plataformas soporta AnyBitmap?

AnyBitmap es compatible con todas las plataformas principales donde se ejecuta .NET : Windows (x86, x64, ARM), Linux (incluido Alpine Linux para Docker) y macOS (tanto Intel como Apple Silicon). Esta amplia compatibilidad de plataformas lo convierte en la opción recomendada para aplicaciones .NET modernas que deban ejecutarse en diversos entornos. Es especialmente valioso para implementaciones en la nube en AWS Lambda o Azure Functions. Obtenga más información sobre la configuración específica de la plataforma en nuestras guías para Linux, macOS y entornos Docker.

¿Cómo gestiona AnyBitmap la memoria?

AnyBitmap implementa una gestión de memoria eficiente a través de la integración de recolección automática de basura y patrones de eliminación explícitos. Utiliza la agrupación de memoria para los búferes asignados con frecuencia e implementa la semántica de copia en escritura para mejorar el rendimiento. A diferencia de System.Drawing.Bitmap que puede contener bloqueos de archivos, AnyBitmap carga las imágenes completamente en la memoria, lo que evita problemas de acceso a archivos. También proporciona un mejor control sobre el uso de la memoria en escenarios de alto rendimiento. Para las aplicaciones que procesan grandes volúmenes de imágenes, la eficiencia de memoria de AnyBitmap puede reducir significativamente la huella de memoria general. Consulte nuestra guía System.Drawing.Common Alternatives para obtener consejos sobre la migración.

¿Cómo puedo especificar una región de exploración?

En la construcción de la clase OcrImageInput, puede especificar el área a escanear. Esto te permite definir la región específica del documento de imagen para OCR. Dependiendo del documento de imagen, especificar la región de escaneado puede mejorar significativamente el rendimiento. En el ejemplo de código proporcionado, solo se extraen el número de capítulo y el título.

: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

¿Cuándo debo utilizar la exploración de regiones para mejorar el rendimiento?

El escaneado por regiones mejora notablemente el rendimiento cuando sólo se necesita texto de áreas específicas de diseños de documentos coherentes. Los casos de uso más comunes incluyen la extracción de encabezados, campos de formularios, totales de facturas o información del DNI. Las mejoras de rendimiento son más significativas con imágenes grandes en las que el texto ocupa una pequeña parte. Para una factura de 3000x4000 píxeles, escanear sólo la región del importe total puede ser entre 10 y 20 veces más rápido que el OCR de página completa. El escaneado por regiones también mejora la precisión al eliminar el ruido potencial de otras áreas. Para ver más ejemplos basados en regiones, consulte nuestra guía Áreas de contenido y regiones de recorte con PDF.

¿Cómo puedo determinar las coordenadas correctas de mi región?

Para determinar las coordenadas es necesario comprender que Rectangle utiliza el formato (X, Y, Ancho, Alto), donde (0,0) es la esquina superior izquierda. Para empezar, abra la imagen en un editor de imágenes que muestre las coordenadas del cursor. Como alternativa, utilice las funciones de depuración de IronOCR para visualizar las regiones de texto detectadas. Para diseños dinámicos, considere usar IronOCR para realizar primero un escaneo completo y luego analizar el OcrResult para encontrar posiciones de texto mediante programación. Nuestro ejemplo Highlight Texts for Debugging muestra cómo visualizar regiones de OCR para determinar coordenadas con precisión.

¿Qué ocurre si la región supera los límites de la imagen?

Cuando una región especificada excede los límites de la imagen, IronOCR la recorta automáticamente en el área válida de la imagen. Por ejemplo, si su imagen tiene 1000x1000 píxeles y especifica un rectángulo en (900, 900, 200, 200), IronOCR sólo procesará el área comprendida entre (900, 900) y (1000, 1000). Este recorte automático evita errores, pero puede dar lugar a una extracción incompleta del texto si sus coordenadas son incorrectas. Valide siempre las regiones con las dimensiones reales de la imagen. Para tamaños de imagen dinámicos, calcule las regiones como porcentajes en lugar de píxeles fijos. La guía OCR Región de una imagen ofrece más ejemplos de manejo seguro de regiones.

Resultado OCR

Demostración de extracción de OCR que muestra el texto del capítulo de Harry Potter en Photo Viewer y la salida extraída en la consola de depuración

Preguntas Frecuentes

¿Cómo extraigo texto de un mapa de bits System.Drawing.Bitmap utilizando OCR en C#?

IronOCR simplifica la extracción de texto de objetos System.Drawing.Bitmap. Primero, instancie la clase IronTesseract, luego envuelva su Bitmap en un objeto OcrImageInput usando una sentencia using, y finalmente llame al método Read. El código mínimo es: var result = new IronOcr.IronTesseract().Read(new IronOcr.OcrImageInput(bitmap));

¿Por qué es importante la declaración "using" cuando se trabaja con OcrImageInput?

La sentencia using es crucial porque OcrImageInput implementa IDisposable y contiene recursos no gestionados que necesitan una limpieza adecuada. Sin ella, se corre el riesgo de fugas de memoria o bloqueos de archivos, especialmente cuando se procesan varias imágenes. OcrImageInput de IronOCR requiere una eliminación adecuada para garantizar una gestión eficaz de los recursos en sus aplicaciones .NET.

¿Puedo realizar OCR en objetos System.Drawing.Image?

Sí, IronOCR soporta OCR en objetos System.Drawing.Image ya que Image es la clase base para Bitmap. Simplemente envuelva su objeto Image en OcrImageInput de la misma manera que lo haría con un Bitmap, y IronOCR extraerá el texto sin problemas en las plataformas Windows, macOS y Linux.

¿Qué es IronSoftware.Drawing.AnyBitmap y cómo se relaciona con OCR?

IronSoftware.Drawing.AnyBitmap es una clase de mapa de bits de IronDrawing, una biblioteca de código abierto que ayuda a sustituir System.Drawing.Common en proyectos .NET. Proporciona compatibilidad multiplataforma para Windows, macOS y Linux, por lo que es ideal para su uso con IronOCR cuando se necesita un manejo coherente de imágenes en diferentes sistemas operativos.

¿Puedo especificar una zona concreta de una imagen para la extracción de texto?

Sí, IronOCR permite definir áreas de lectura específicas especificando regiones de recorte. Esta característica le permite centrar el procesamiento de OCR en secciones concretas de sus objetos System.Drawing, mejorando el rendimiento y la precisión cuando sólo necesita texto de partes específicas de una imagen.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más
Revisado por
Jeff Fritz
Jeffrey T. Fritz
Gerente Principal de Programas - Equipo de la Comunidad .NET
Jeff también es Gerente Principal de Programas para los equipos de .NET y Visual Studio. Es el productor ejecutivo de la serie de conferencias virtuales .NET Conf y anfitrión de 'Fritz and Friends', una transmisión en vivo para desarrolladores que se emite dos veces a la semana donde habla sobre tecnología y escribe código junto con la audiencia. Jeff escribe talleres, presentaciones, y planifica contenido para los eventos de desarrolladores más importantes de Microsoft, incluyendo Microsoft Build, Microsoft Ignite, .NET Conf y la Cumbre de Microsoft MVP.
¿Listo para empezar?
Nuget Descargas 5,525,971 | Versión: 2026.3 recién lanzado
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida? PM > Install-Package IronOcr
ejecuta una muestra y observa cómo tu imagen se convierte en texto buscable.