IronBarcode Tutorials Reading Barcodes in .NET C# Barcode Scanner: Read Barcodes & QR Codes in .NET Applications ByJacob Mellor November 4, 2018 Updated July 13, 2025 Share: Need to quickly scan barcodes or QR codes in your .NET application? IronBarcode makes barcode reading simple and reliable, whether you're processing perfect digital images or challenging real-world photos. This guide shows you exactly how to implement barcode scanning in C# with practical examples you can use immediately. View the IronBarcode YouTube Playlist Need to quickly scan barcodes or QR codes in your .NET application? IronBarcode makes barcode reading simple and reliable, whether you're processing perfect digital images or challenging real-world photos. This guide shows you exactly how to implement barcode scanning in C# with practical examples you can use immediately. How to Read Barcodes in C# and VB.NET Install IronBarcode from NuGet or via DLL download Use the BarcodeReader.Read method to scan any barcode or QR code Read multiple barcodes or QR codes in a single scan, PDF, or multiframe TIFF file Enable IronBarcode to decode imperfect scans and photos with advanced filters Download the tutorial project and start scanning immediately How do I install IronBarcode in my .NET project? IronBarcode installs easily through NuGet Package Manager or by downloading the DLL directly. The NuGet installation is the recommended approach as it automatically manages dependencies and updates. Start using IronBarcode in your project today with a free trial. First Step: Start for Free Install-Package BarCode After installation, add using IronBarCode; to your C# files to access the barcode scanning functionality. For detailed installation instructions across different development environments, check our installation guide. How can I read my first barcode using C#? Reading barcodes with IronBarcode requires just one line of code. The library automatically detects barcode formats and extracts all encoded data. A standard Code128 barcode that IronBarcode can read instantly using IronBarCode; using System; // Read barcodes from the image file - supports PNG, JPG, BMP, GIF, and more BarcodeResults results = BarcodeReader.Read("GetStarted.png"); // Check if any barcodes were detected if (results != null && results.Count > 0) { // Process each barcode found in the image foreach (BarcodeResult result in results) { // Extract the text value from the barcode Console.WriteLine("Barcode detected! Value: " + result.Text); // Additional properties available: // result.BarcodeType - The format (Code128, QR, etc.) // result.BinaryValue - Raw binary data if applicable // result.Confidence - Detection confidence score } } else { Console.WriteLine("No barcodes detected in the image."); } using IronBarCode; using System; // Read barcodes from the image file - supports PNG, JPG, BMP, GIF, and more BarcodeResults results = BarcodeReader.Read("GetStarted.png"); // Check if any barcodes were detected if (results != null && results.Count > 0) { // Process each barcode found in the image foreach (BarcodeResult result in results) { // Extract the text value from the barcode Console.WriteLine("Barcode detected! Value: " + result.Text); // Additional properties available: // result.BarcodeType - The format (Code128, QR, etc.) // result.BinaryValue - Raw binary data if applicable // result.Confidence - Detection confidence score } } else { Console.WriteLine("No barcodes detected in the image."); } IRON VB CONVERTER ERROR developers@ironsoftware.com $vbLabelText $csharpLabel The BarcodeReader.Read method returns a BarcodeResults collection containing all detected barcodes. Each BarcodeResult provides access to the barcode's text value, format type, position coordinates, and binary data. This approach works seamlessly with common barcode formats including Code128, Code39, QR codes, and Data Matrix codes. What options help read challenging or damaged barcodes? Real-world barcode scanning often involves imperfect images - skewed angles, poor lighting, or partial damage. IronBarcode's advanced options handle these challenges effectively. using IronBarCode; // Configure advanced reading options for difficult barcodes BarcodeReaderOptions options = new BarcodeReaderOptions { // Speed settings: Faster, Balanced, Detailed, ExtremeDetail // ExtremeDetail performs deep analysis for challenging images Speed = ReadingSpeed.ExtremeDetail, // Specify expected formats to improve performance // Use bitwise OR ( ) to combine multiple formats ExpectBarcodeTypes = BarcodeEncoding.QRCode BarcodeEncoding.Code128, // Maximum number of barcodes to find (0 = unlimited) MaxParallelThreads = 4, // Crop region for faster processing of specific areas CropArea = null // Or specify a Rectangle }; // Apply options when reading BarcodeResults results = BarcodeReader.Read("TryHarderQR.png", options); // Process detected barcodes foreach (var barcode in results) { Console.WriteLine($"Format: {barcode.BarcodeType}, Value: {barcode.Text}"); } using IronBarCode; // Configure advanced reading options for difficult barcodes BarcodeReaderOptions options = new BarcodeReaderOptions { // Speed settings: Faster, Balanced, Detailed, ExtremeDetail // ExtremeDetail performs deep analysis for challenging images Speed = ReadingSpeed.ExtremeDetail, // Specify expected formats to improve performance // Use bitwise OR ( ) to combine multiple formats ExpectBarcodeTypes = BarcodeEncoding.QRCode BarcodeEncoding.Code128, // Maximum number of barcodes to find (0 = unlimited) MaxParallelThreads = 4, // Crop region for faster processing of specific areas CropArea = null // Or specify a Rectangle }; // Apply options when reading BarcodeResults results = BarcodeReader.Read("TryHarderQR.png", options); // Process detected barcodes foreach (var barcode in results) { Console.WriteLine($"Format: {barcode.BarcodeType}, Value: {barcode.Text}"); } Imports IronBarCode ' Configure advanced reading options for difficult barcodes Private options As New BarcodeReaderOptions With { .Speed = ReadingSpeed.ExtremeDetail, .ExpectBarcodeTypes = BarcodeEncoding.QRCode Or BarcodeEncoding.Code128, .MaxParallelThreads = 4, .CropArea = Nothing } ' Apply options when reading Private results As BarcodeResults = BarcodeReader.Read("TryHarderQR.png", options) ' Process detected barcodes For Each barcode In results Console.WriteLine($"Format: {barcode.BarcodeType}, Value: {barcode.Text}") Next barcode $vbLabelText $csharpLabel A rotated QR code that IronBarcode successfully reads using advanced options The ExpectBarcodeTypes property significantly improves performance by limiting the search to specific formats. For maximum accuracy with problematic images, combine image filters with automatic rotation: using IronBarCode; BarcodeReaderOptions options = new BarcodeReaderOptions { // Apply image processing filters to enhance readability ImageFilters = new ImageFilterCollection { new AdaptiveThresholdFilter(9, 0.01f), // Handles varying lighting new ContrastFilter(2.0f), // Increases contrast new SharpenFilter() // Reduces blur }, // Automatically rotate to find barcodes at any angle AutoRotate = true, // Use multiple CPU cores for faster processing Multithreaded = true }; BarcodeResults results = BarcodeReader.Read("TryHarderQR.png", options); foreach (var result in results) { Console.WriteLine($"Detected {result.BarcodeType}: {result.Text}"); Console.WriteLine($"Confidence: {result.Confidence}%"); Console.WriteLine($"Position: X={result.X}, Y={result.Y}"); } using IronBarCode; BarcodeReaderOptions options = new BarcodeReaderOptions { // Apply image processing filters to enhance readability ImageFilters = new ImageFilterCollection { new AdaptiveThresholdFilter(9, 0.01f), // Handles varying lighting new ContrastFilter(2.0f), // Increases contrast new SharpenFilter() // Reduces blur }, // Automatically rotate to find barcodes at any angle AutoRotate = true, // Use multiple CPU cores for faster processing Multithreaded = true }; BarcodeResults results = BarcodeReader.Read("TryHarderQR.png", options); foreach (var result in results) { Console.WriteLine($"Detected {result.BarcodeType}: {result.Text}"); Console.WriteLine($"Confidence: {result.Confidence}%"); Console.WriteLine($"Position: X={result.X}, Y={result.Y}"); } Imports IronBarCode Private options As New BarcodeReaderOptions With { .ImageFilters = New ImageFilterCollection From { New AdaptiveThresholdFilter(9, 0.01F), New ContrastFilter(2.0F), New SharpenFilter() }, .AutoRotate = True, .Multithreaded = True } Private results As BarcodeResults = BarcodeReader.Read("TryHarderQR.png", options) For Each result In results Console.WriteLine($"Detected {result.BarcodeType}: {result.Text}") Console.WriteLine($"Confidence: {result.Confidence}%") Console.WriteLine($"Position: X={result.X}, Y={result.Y}") Next result $vbLabelText $csharpLabel These advanced features make IronBarcode ideal for scanning barcodes from photos, security cameras, or mobile device captures where image quality varies significantly. How do I scan multiple barcodes from PDF documents? PDF barcode scanning is essential for processing invoices, shipping labels, and inventory documents. IronBarcode reads all barcodes across every page efficiently. Reading barcodes from PDF files using System; using IronBarCode; try { // Scan all pages of a PDF for barcodes BarcodeResults results = BarcodeReader.ReadPdf("MultipleBarcodes.pdf"); if (results != null && results.Count > 0) { foreach (var barcode in results) { // Access barcode data and metadata string value = barcode.Text; int pageNumber = barcode.PageNumber; BarcodeEncoding format = barcode.BarcodeType; byte[] binaryData = barcode.BinaryValue; // Extract barcode image if needed System.Drawing.Bitmap barcodeImage = barcode.BarcodeImage; Console.WriteLine($"Found {format} on page {pageNumber}: {value}"); } } else { Console.WriteLine("No barcodes found in the PDF."); } } catch (Exception ex) { Console.WriteLine($"Error reading PDF: {ex.Message}"); } using System; using IronBarCode; try { // Scan all pages of a PDF for barcodes BarcodeResults results = BarcodeReader.ReadPdf("MultipleBarcodes.pdf"); if (results != null && results.Count > 0) { foreach (var barcode in results) { // Access barcode data and metadata string value = barcode.Text; int pageNumber = barcode.PageNumber; BarcodeEncoding format = barcode.BarcodeType; byte[] binaryData = barcode.BinaryValue; // Extract barcode image if needed System.Drawing.Bitmap barcodeImage = barcode.BarcodeImage; Console.WriteLine($"Found {format} on page {pageNumber}: {value}"); } } else { Console.WriteLine("No barcodes found in the PDF."); } } catch (Exception ex) { Console.WriteLine($"Error reading PDF: {ex.Message}"); } Imports System Imports IronBarCode Try ' Scan all pages of a PDF for barcodes Dim results As BarcodeResults = BarcodeReader.ReadPdf("MultipleBarcodes.pdf") If results IsNot Nothing AndAlso results.Count > 0 Then For Each barcode In results ' Access barcode data and metadata Dim value As String = barcode.Text Dim pageNumber As Integer = barcode.PageNumber Dim format As BarcodeEncoding = barcode.BarcodeType Dim binaryData() As Byte = barcode.BinaryValue ' Extract barcode image if needed Dim barcodeImage As System.Drawing.Bitmap = barcode.BarcodeImage Console.WriteLine($"Found {format} on page {pageNumber}: {value}") Next barcode Else Console.WriteLine("No barcodes found in the PDF.") End If Catch ex As Exception Console.WriteLine($"Error reading PDF: {ex.Message}") End Try $vbLabelText $csharpLabel Console output showing multiple barcodes found across different PDF pages For specific page ranges or advanced PDF processing, use BarcodeReaderOptions: // Read only specific pages to improve performance BarcodeReaderOptions pdfOptions = new BarcodeReaderOptions { // Scan pages 1-5 only PageNumbers = new[] { 1, 2, 3, 4, 5 }, // PDF-specific settings PdfDpi = 300, // Higher DPI for better accuracy ReadBehindVectorGraphics = true }; BarcodeResults results = BarcodeReader.ReadPdf("document.pdf", pdfOptions); // Read only specific pages to improve performance BarcodeReaderOptions pdfOptions = new BarcodeReaderOptions { // Scan pages 1-5 only PageNumbers = new[] { 1, 2, 3, 4, 5 }, // PDF-specific settings PdfDpi = 300, // Higher DPI for better accuracy ReadBehindVectorGraphics = true }; BarcodeResults results = BarcodeReader.ReadPdf("document.pdf", pdfOptions); ' Read only specific pages to improve performance Dim pdfOptions As New BarcodeReaderOptions With { .PageNumbers = { 1, 2, 3, 4, 5 }, .PdfDpi = 300, .ReadBehindVectorGraphics = True } Dim results As BarcodeResults = BarcodeReader.ReadPdf("document.pdf", pdfOptions) $vbLabelText $csharpLabel Learn more about PDF barcode extraction techniques in our detailed examples. How can I process multiframe TIFF images? Multiframe TIFF files, common in document scanning and fax systems, receive the same comprehensive support as PDFs. A multiframe TIFF file with barcodes on different frames using IronBarCode; // TIFF files are processed similarly to regular images // Each frame is scanned automatically BarcodeResults multiFrameResults = BarcodeReader.Read("Multiframe.tiff"); foreach (var result in multiFrameResults) { // Access frame-specific information int frameNumber = result.PageNumber; // Frame number in TIFF string barcodeValue = result.Text; Console.WriteLine($"Frame {frameNumber}: {barcodeValue}"); // Save individual barcode images if needed result.BarcodeImage?.Save($"barcode_frame_{frameNumber}.png"); } using IronBarCode; // TIFF files are processed similarly to regular images // Each frame is scanned automatically BarcodeResults multiFrameResults = BarcodeReader.Read("Multiframe.tiff"); foreach (var result in multiFrameResults) { // Access frame-specific information int frameNumber = result.PageNumber; // Frame number in TIFF string barcodeValue = result.Text; Console.WriteLine($"Frame {frameNumber}: {barcodeValue}"); // Save individual barcode images if needed result.BarcodeImage?.Save($"barcode_frame_{frameNumber}.png"); } Imports IronBarCode ' TIFF files are processed similarly to regular images ' Each frame is scanned automatically Private multiFrameResults As BarcodeResults = BarcodeReader.Read("Multiframe.tiff") For Each result In multiFrameResults ' Access frame-specific information Dim frameNumber As Integer = result.PageNumber ' Frame number in TIFF Dim barcodeValue As String = result.Text Console.WriteLine($"Frame {frameNumber}: {barcodeValue}") ' Save individual barcode images if needed If result.BarcodeImage IsNot Nothing Then result.BarcodeImage.Save($"barcode_frame_{frameNumber}.png") End If Next result $vbLabelText $csharpLabel The same BarcodeReaderOptions apply to TIFF processing, including image filters and rotation settings. For detailed TIFF handling scenarios, see our image processing tutorials. Can I speed up processing with multithreading? Processing multiple documents benefits dramatically from parallel processing. IronBarcode automatically utilizes available CPU cores for optimal performance. using IronBarCode; // List of documents to process - mix of formats supported var documentBatch = new[] { "invoice1.pdf", "shipping_label.png", "inventory_sheet.tiff", "product_catalog.pdf" }; // Configure for batch processing BarcodeReaderOptions batchOptions = new BarcodeReaderOptions { // Enable parallel processing across documents Multithreaded = true, // Limit threads if needed (0 = use all cores) MaxParallelThreads = Environment.ProcessorCount, // Apply consistent settings to all documents Speed = ReadingSpeed.Balanced, ExpectBarcodeTypes = BarcodeEncoding.All }; // Process all documents in parallel BarcodeResults batchResults = BarcodeReader.Read(documentBatch, batchOptions); // Group results by source document var resultsByDocument = batchResults.GroupBy(r => r.Filename); foreach (var docGroup in resultsByDocument) { Console.WriteLine($"\nDocument: {docGroup.Key}"); foreach (var barcode in docGroup) { Console.WriteLine($" - {barcode.BarcodeType}: {barcode.Text}"); } } using IronBarCode; // List of documents to process - mix of formats supported var documentBatch = new[] { "invoice1.pdf", "shipping_label.png", "inventory_sheet.tiff", "product_catalog.pdf" }; // Configure for batch processing BarcodeReaderOptions batchOptions = new BarcodeReaderOptions { // Enable parallel processing across documents Multithreaded = true, // Limit threads if needed (0 = use all cores) MaxParallelThreads = Environment.ProcessorCount, // Apply consistent settings to all documents Speed = ReadingSpeed.Balanced, ExpectBarcodeTypes = BarcodeEncoding.All }; // Process all documents in parallel BarcodeResults batchResults = BarcodeReader.Read(documentBatch, batchOptions); // Group results by source document var resultsByDocument = batchResults.GroupBy(r => r.Filename); foreach (var docGroup in resultsByDocument) { Console.WriteLine($"\nDocument: {docGroup.Key}"); foreach (var barcode in docGroup) { Console.WriteLine($" - {barcode.BarcodeType}: {barcode.Text}"); } } Imports Microsoft.VisualBasic Imports IronBarCode ' List of documents to process - mix of formats supported Private documentBatch = { "invoice1.pdf", "shipping_label.png", "inventory_sheet.tiff", "product_catalog.pdf" } ' Configure for batch processing Private batchOptions As New BarcodeReaderOptions With { .Multithreaded = True, .MaxParallelThreads = Environment.ProcessorCount, .Speed = ReadingSpeed.Balanced, .ExpectBarcodeTypes = BarcodeEncoding.All } ' Process all documents in parallel Private batchResults As BarcodeResults = BarcodeReader.Read(documentBatch, batchOptions) ' Group results by source document Private resultsByDocument = batchResults.GroupBy(Function(r) r.Filename) For Each docGroup In resultsByDocument Console.WriteLine($vbLf & "Document: {docGroup.Key}") For Each barcode In docGroup Console.WriteLine($" - {barcode.BarcodeType}: {barcode.Text}") Next barcode Next docGroup $vbLabelText $csharpLabel This parallel approach processes documents simultaneously, reducing total scanning time by up to 75% on multicore systems. For enterprise-scale barcode processing, explore our performance optimization guide. Summary IronBarcode transforms complex barcode scanning into straightforward C# code. Whether you're building inventory systems, document processors, or mobile applications, the library handles everything from pristine digital barcodes to challenging real-world captures. Key capabilities covered: Single-line barcode reading from images Advanced options for damaged or rotated barcodes Comprehensive PDF and TIFF document scanning High-performance batch processing with multithreading Support for all major barcode formats Further Reading Expand your barcode processing capabilities with these resources: Barcode Generation Tutorial - Create custom barcodes QR Code Guide - Specialized QR code features BarcodeReader Class Reference - Complete API documentation Troubleshooting Guide - Common issues and solutions Source Code Downloads Run these examples yourself: Tutorial GitHub Repository C# Source Code in a Zip File Ready to implement barcode scanning in your application? Start your free trial and add professional barcode reading to your .NET project today. Get stated with IronBarcode now. Start for Free Frequently Asked Questions How do I install a barcode reading library in .NET? IronBarcode installs via NuGet Package Manager with the command dotnet add package BarCode or through Visual Studio's NuGet interface. You can also download the DLL directly for manual installation. What's the simplest way to read a barcode from an image in C#? Use IronBarcode's BarcodeReader.Read method with just one line: var results = BarcodeReader.Read('image.png'); This automatically detects and reads all barcode formats in the image. Can I read multiple barcodes from a single image or document? Yes, IronBarcode automatically detects and reads all barcodes in an image, PDF, or multiframe TIFF. The BarcodeResults collection contains every barcode found with its value, type, and position. How do I scan barcodes from PDF documents in C#? Use the BarcodeReader.ReadPdf method to scan all pages: var results = BarcodeReader.ReadPdf('document.pdf'); Each result includes the page number where the barcode was found. What should I do if my barcode images are blurry or rotated? Configure BarcodeReaderOptions with AutoRotate = true and add image filters like SharpenFilter or AdaptiveThresholdFilter. Set Speed to ExtremeDetail for challenging images. Which barcode formats can be read in .NET applications? IronBarcode supports all major formats including QR Code, Code 128, Code 39, EAN-13, UPC-A, Data Matrix, PDF417, and many more. Use BarcodeEncoding.All to scan for any format. How can I improve barcode scanning performance in C#? Specify expected barcode types with ExpectBarcodeTypes, enable Multithreaded processing, and use appropriate Speed settings. For batch processing, use BarcodeReader.Read with an array of file paths. What's the best way to handle barcode reading errors? Wrap barcode reading in try-catch blocks and check if results are null or empty. IronBarcode provides detailed error messages for troubleshooting. The Confidence property indicates detection reliability. Can I extract barcode images after scanning? Yes, each BarcodeResult includes a BarcodeImage property containing a Bitmap of the detected barcode. You can save or process these images separately using result.BarcodeImage.Save(). How do I read barcodes from specific pages in a PDF? Set the PageNumbers property in BarcodeReaderOptions: options.PageNumbers = new[] {1, 2, 3}; This scans only the specified pages, improving performance for large documents. What image formats are supported for barcode scanning? IronBarcode supports PNG, JPEG, BMP, GIF, TIFF (including multiframe), and PDF formats. Images can be loaded from file paths, streams, or byte arrays. How do I access binary data from scanned barcodes? Use the BinaryValue property of BarcodeResult to access raw binary data. This is useful for barcodes encoding non-text data like compressed information or binary protocols. Jacob Mellor Chat with engineering team now Chief Technology Officer Jacob Mellor is Chief Technology Officer at Iron Software and a visionary engineer pioneering C# PDF technology. As the original developer behind Iron Software's core codebase, he has shaped the company's product architecture since its inception, transforming it alongside CEO Cameron Rimington into a 50+ person company serving NASA, Tesla, and global government agencies.Jacob holds a First-Class Honours Bachelor of Engineering (BEng) in Civil Engineering from the University of Manchester (1998–2001). After opening his first software business in London in 1999 and creating his first .NET components in 2005, he specialized in solving complex problems across the Microsoft ecosystem.His flagship IronPDF & IronSuite .NET libraries have achieved over 30 million NuGet installations globally, with his foundational code continuing to power developer tools used worldwide. With 25 years of commercial experience and 41 years of coding expertise, Jacob remains focused on driving innovation in enterprise-grade C#, Java, and Python PDF technologies while mentoring the next generation of technical leaders. Ready to Get Started? Free NuGet Download Total downloads: 1,737,581 View Licenses