How to Extract Text from Images Using Aspose.OCR for .NET

How to Extract Text from Images Using Aspose.OCR for .NET

This guide shows a concise, practical workflow to extract text from images using Aspose.OCR for .NET, with code examples, configuration tips, and accuracy-improvement suggestions.

Prerequisites

  • .NET 6.0+ (or .NET Framework 4.7.2+)
  • NuGet package: Aspose.OCR (install via NuGet)
  • An input image (PNG, JPEG, TIFF, BMP)

Install the package:

bash

dotnet add package Aspose.OCR

Basic usage — single image

  1. Create a console or web project and add the Aspose.OCR reference.
  2. Use the following minimal example to recognize text from an image file:

csharp

using System; using Aspose.OCR; class Program { static void Main() { // Path to input image string imagePath = “input.jpg”; // Initialize engine using (var ocrEngine = new OcrEngine()) { // Load image ocrEngine.Image = ImageStream.FromFile(imagePath); // Process image if (ocrEngine.Process()) { // Extract recognized text Console.WriteLine(ocrEngine.Text); } else { Console.WriteLine(“No text recognized.”); } } } }

Recognizing multiple images or a folder

Use a loop to process many files and accumulate results:

csharp

var files = Directory.GetFiles(“images”, ., SearchOption.TopDirectoryOnly) .Where(f => new[] { ”.png”, ”.jpg”, ”.jpeg”, ”.tif”, ”.bmp” } .Contains(Path.GetExtension(f).ToLower())); foreach (var file in files) { using (var engine = new OcrEngine()) { engine.Image = ImageStream.FromFile(file); if (engine.Process()) { Console.WriteLine(\("</span><span class="token interpolation-string interpolation" style="color: rgb(57, 58, 52);">{</span><span class="token interpolation-string interpolation expression language-csharp">Path</span><span class="token interpolation-string interpolation expression language-csharp">.</span><span class="token interpolation-string interpolation expression language-csharp">GetFileName</span><span class="token interpolation-string interpolation expression language-csharp">(</span><span class="token interpolation-string interpolation expression language-csharp">file</span><span class="token interpolation-string interpolation expression language-csharp">)</span><span class="token interpolation-string interpolation" style="color: rgb(57, 58, 52);">}</span><span class="token interpolation-string" style="color: rgb(163, 21, 21);">: </span><span class="token interpolation-string interpolation" style="color: rgb(57, 58, 52);">{</span><span class="token interpolation-string interpolation expression language-csharp">engine</span><span class="token interpolation-string interpolation expression language-csharp">.</span><span class="token interpolation-string interpolation expression language-csharp">Text</span><span class="token interpolation-string interpolation" style="color: rgb(57, 58, 52);">}</span><span class="token interpolation-string" style="color: rgb(163, 21, 21);">"</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span> </span><span class="token" style="color: rgb(57, 58, 52);">}</span><span> </span><span> </span><span class="token" style="color: rgb(57, 58, 52);">}</span><span> </span><span></span><span class="token" style="color: rgb(57, 58, 52);">}</span><span> </span></code></div></div></pre> <h3>Processing multi-page TIFFs and PDFs</h3> <ul> <li>For multi-page TIFFs, Aspose.OCR can process pages by loading specific frames or converting to separate images.</li> <li>For PDFs, convert pages to images first (use Aspose.PDF or another library), then run OCR on each page.</li> </ul> <p>Example (multi-frame TIFF):</p> <pre><div class="XG2rBS5V967VhGTCEN1k"><div class="nHykNMmtaaTJMjgzStID"><div class="HsT0RHFbNELC00WicOi8"><i><svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M15.434 7.51c.137.137.212.311.212.49a.694.694 0 0 1-.212.5l-3.54 3.5a.893.893 0 0 1-.277.18 1.024 1.024 0 0 1-.684.038.945.945 0 0 1-.302-.148.787.787 0 0 1-.213-.234.652.652 0 0 1-.045-.58.74.74 0 0 1 .175-.256l3.045-3-3.045-3a.69.69 0 0 1-.22-.55.723.723 0 0 1 .303-.52 1 1 0 0 1 .648-.186.962.962 0 0 1 .614.256l3.541 3.51Zm-12.281 0A.695.695 0 0 0 2.94 8a.694.694 0 0 0 .213.5l3.54 3.5a.893.893 0 0 0 .277.18 1.024 1.024 0 0 0 .684.038.945.945 0 0 0 .302-.148.788.788 0 0 0 .213-.234.651.651 0 0 0 .045-.58.74.74 0 0 0-.175-.256L4.994 8l3.045-3a.69.69 0 0 0 .22-.55.723.723 0 0 0-.303-.52 1 1 0 0 0-.648-.186.962.962 0 0 0-.615.256l-3.54 3.51Z"></path></svg></i><p class="li3asHIMe05JPmtJCytG wZ4JdaHxSAhGy1HoNVja cPy9QU4brI7VQXFNPEvF">csharp</p></div><div class="CF2lgtGWtYUYmTULoX44"><button type="button" class="st68fcLUUT0dNcuLLB2_ ffON2NH02oMAcqyoh2UU MQCbz04ET5EljRmK3YpQ CPXAhl7VTkj2dHDyAYAf" data-copycode="true" role="button" aria-label="Copy Code"><svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M9.975 1h.09a3.2 3.2 0 0 1 3.202 3.201v1.924a.754.754 0 0 1-.017.16l1.23 1.353A2 2 0 0 1 15 8.983V14a2 2 0 0 1-2 2H8a2 2 0 0 1-1.733-1H4.183a3.201 3.201 0 0 1-3.2-3.201V4.201a3.2 3.2 0 0 1 3.04-3.197A1.25 1.25 0 0 1 5.25 0h3.5c.604 0 1.109.43 1.225 1ZM4.249 2.5h-.066a1.7 1.7 0 0 0-1.7 1.701v7.598c0 .94.761 1.701 1.7 1.701H6V7a2 2 0 0 1 2-2h3.197c.195 0 .387.028.57.083v-.882A1.7 1.7 0 0 0 10.066 2.5H9.75c-.228.304-.591.5-1 .5h-3.5c-.41 0-.772-.196-1-.5ZM5 1.75v-.5A.25.25 0 0 1 5.25 1h3.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-3.5A.25.25 0 0 1 5 1.75ZM7.5 7a.5.5 0 0 1 .5-.5h3V9a1 1 0 0 0 1 1h1.5v4a.5.5 0 0 1-.5.5H8a.5.5 0 0 1-.5-.5V7Zm6 2v-.017a.5.5 0 0 0-.13-.336L12 7.14V9h1.5Z"></path></svg>Copy Code</button><button type="button" class="st68fcLUUT0dNcuLLB2_ WtfzoAXPoZC2mMqcexgL ffON2NH02oMAcqyoh2UU MQCbz04ET5EljRmK3YpQ GnLX_jUB3Jn3idluie7R"><svg fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" d="M20.618 4.214a1 1 0 0 1 .168 1.404l-11 14a1 1 0 0 1-1.554.022l-5-6a1 1 0 0 1 1.536-1.28l4.21 5.05L19.213 4.382a1 1 0 0 1 1.404-.168Z" clip-rule="evenodd"></path></svg>Copied</button></div></div><div class="mtDfw7oSa1WexjXyzs9y" style="color: var(--sds-color-text-01); font-family: var(--sds-font-family-monospace); direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: var(--sds-font-size-label); line-height: 1.2em; tab-size: 4; hyphens: none; padding: var(--sds-space-x02, 8px) var(--sds-space-x04, 16px) var(--sds-space-x04, 16px); margin: 0px; overflow: auto; border: none; background: transparent;"><code class="language-csharp" style="color: rgb(57, 58, 52); font-family: Consolas, "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: 0.9em; line-height: 1.2em; tab-size: 4; hyphens: none;"><span class="token" style="color: rgb(0, 0, 255);">using</span><span> </span><span class="token">Aspose</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token">OCR</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token">Image</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span></span><span class="token" style="color: rgb(0, 0, 255);">using</span><span> </span><span class="token">System</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token">Drawing</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token">Imaging</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span> <span></span><span class="token" style="color: rgb(0, 0, 255);">using</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(0, 0, 255);">var</span><span> imgStream </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> ImageStream</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">FromFile</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(163, 21, 21);">"multi.tiff"</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span> </span><span></span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">for</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(0, 0, 255);">int</span><span> i </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">0</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> i </span><span class="token" style="color: rgb(57, 58, 52);"><</span><span> imgStream</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span>FramesCount</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> i</span><span class="token" style="color: rgb(57, 58, 52);">++</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span> </span><span> </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span> imgStream</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span>CurrentFrame </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> i</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">using</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(0, 0, 255);">var</span><span> engine </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">new</span><span> </span><span class="token constructor-invocation" style="color: rgb(43, 145, 175);">OcrEngine</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> Image </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> imgStream </span><span class="token" style="color: rgb(57, 58, 52);">}</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span> </span><span> </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">if</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span>engine</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">Process</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span> Console</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">WriteLine</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token interpolation-string" style="color: rgb(163, 21, 21);">\)“Page {i+1}: {engine.Text}); } } }

Improving recognition accuracy

  • Preprocess images: convert to grayscale, increase contrast, despeckle, deskew.
  • Resize small images (upscale with good interpolation) to improve character legibility.
  • Use appropriate DPI (300 DPI recommended for printed text).
  • Crop to regions of interest to avoid noisy backgrounds.
  • Use language/model settings if supported (training/custom dictionaries may be available in newer Aspose.OCR versions).

Example: simple preprocessing with System.Drawing

csharp

using (var bmp = new Bitmap(“input.jpg”)) { // Example: convert to grayscale for (int y = 0; y < bmp.Height; y++) for (int x = 0; x < bmp.Width; x++) { var c = bmp.GetPixel(x, y); int gray = (int)(0.3c.R + 0.59c.G + 0.11*c.B); bmp.SetPixel(x, y, Color.FromArgb(gray, gray, gray)); } bmp.Save(“preprocessed.png”, ImageFormat.Png); }

Handling non-Latin scripts and layouts

  • Check Aspose.OCR documentation for language support; apply language/model settings where available.
  • For right-to-left scripts, perform postprocessing to set proper text direction.
  • For complex layouts (columns, tables), consider region segmentation before OCR and reconstruct text order afterwards.

Error handling and performance tips

  • Wrap OCR calls in try/catch and log failures.
  • Reuse OcrEngine instances when processing many images to reduce initialization overhead.
  • Process images in parallel with care: limit concurrency to avoid high memory/CPU usage.
  • Monitor memory when handling large images or many concurrent tasks.

Output options

  • Plain text: engine.Text
  • Save to files:

csharp

File.WriteAllText(“output.txt”, engine.Text);
  • For structured output, detect and store bounding boxes, confidence scores, or export to formats supported by your pipeline.

Example: save results to CSV

csharp

var results = new List<string>(); // populate results with “filename,recognizedText” File.WriteAllLines(“results.csv”, results);

Troubleshooting checklist

  • Low accuracy: increase DPI, preprocess image, crop noisy areas.
  • No text detected: verify image path, ensure text contrast, try different file formats.
  • Performance issues: batch processing, reuse engine, limit parallelism.

Further reading

  • Aspose.OCR official docs and API reference for latest features and advanced configuration.
  • Image preprocessing libraries (OpenCV, ImageSharp) for advanced cleanup.

If you want, I can provide a ready-to-run sample project (complete csproj and source) or a preprocessing pipeline using ImageSharp/OpenCV — tell me which you prefer.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *