QR Code image generator with customizable image formats, error correction levels, and styling options
QR code error correction levels, encoding modes, and configuration constants that control QR code generation parameters and behavior.
QR codes support four levels of error correction, allowing different amounts of the code to be damaged while still remaining readable.
from qrcode import constants
ERROR_CORRECT_L = 1 # Low error correction (~7%)
ERROR_CORRECT_M = 0 # Medium error correction (~15%, default)
ERROR_CORRECT_Q = 3 # Quartile error correction (~25%)
ERROR_CORRECT_H = 2 # High error correction (~30%)Error Correction Level Details:
Usage Example:
import qrcode
from qrcode import constants
# Low error correction (smaller QR code)
qr_low = qrcode.QRCode(error_correction=constants.ERROR_CORRECT_L)
# High error correction (more robust, larger QR code)
qr_high = qrcode.QRCode(error_correction=constants.ERROR_CORRECT_H)
# Default (medium error correction)
qr_default = qrcode.QRCode() # Uses ERROR_CORRECT_M by defaultInternal constants for QR code data encoding modes. These are typically used internally but may be relevant for advanced usage.
from qrcode import util
MODE_NUMBER = 1 # Numeric mode (0-9)
MODE_ALPHA_NUM = 2 # Alphanumeric mode (0-9, A-Z, space, $%*+-./:)
MODE_8BIT_BYTE = 4 # Byte mode (any 8-bit data)
MODE_KANJI = 8 # Kanji mode (Japanese characters)Mode Characteristics:
Usage Example:
import qrcode
from qrcode import util
# The library automatically selects optimal encoding modes
# But you can create custom QRData objects for specific modes
# Numeric data (automatically uses MODE_NUMBER)
qr = qrcode.QRCode()
qr.add_data('1234567890')
# Mixed data (automatically uses optimal combination)
qr = qrcode.QRCode()
qr.add_data('Order #123: $45.67') # Uses different modes for different parts
# Force specific encoding (advanced usage)
numeric_data = util.QRData('1234567890', mode=util.MODE_NUMBER)
qr = qrcode.QRCode()
qr.add_data(numeric_data)QR code versions (sizes) range from 1 to 40, with each version having specific dimensions and data capacities.
# Version ranges
MIN_VERSION = 1 # Smallest QR code (21x21 modules)
MAX_VERSION = 40 # Largest QR code (177x177 modules)
# Version calculation:
# Size = (version * 4) + 17 modules per side
# Version 1: 21x21 modules
# Version 2: 25x25 modules
# ...
# Version 40: 177x177 modulesVersion Selection:
import qrcode
# Auto-version (recommended)
qr = qrcode.QRCode(version=None) # Will auto-size
qr.add_data('Some data')
qr.make(fit=True) # Determines optimal version
print(f"Selected version: {qr.version}")
# Fixed version
qr = qrcode.QRCode(version=5) # Always 37x37 modules
qr.add_data('Data')
qr.make()
# Check version capacity
try:
qr = qrcode.QRCode(version=1) # Very small
qr.add_data('Too much data for version 1' * 100)
qr.make()
except qrcode.exceptions.DataOverflowError:
print("Data too large for specified version")Default and recommended values for QR code configuration parameters.
# Default QRCode parameters
DEFAULT_VERSION = None # Auto-size
DEFAULT_ERROR_CORRECTION = 0 # ERROR_CORRECT_M
DEFAULT_BOX_SIZE = 10 # Pixels per module
DEFAULT_BORDER = 4 # Border thickness in modules (minimum per spec)
# Border constraints
MIN_BORDER = 4 # Minimum border per QR code specificationParameter Guidelines:
None for auto-sizing unless you need a specific sizeERROR_CORRECT_M for general use, ERROR_CORRECT_H for embedded imagesUsage Example:
import qrcode
# Recommended configuration for most uses
qr = qrcode.QRCode(
version=None, # Auto-size
error_correction=qrcode.constants.ERROR_CORRECT_M, # Standard error correction
box_size=10, # Standard pixel size
border=4, # Minimum border
)
# High-quality print configuration
qr_print = qrcode.QRCode(
version=None,
error_correction=qrcode.constants.ERROR_CORRECT_Q, # Higher error correction
box_size=20, # Larger pixels for print
border=6, # Extra border for safety
)
# Compact configuration (use with caution)
qr_compact = qrcode.QRCode(
version=None,
error_correction=qrcode.constants.ERROR_CORRECT_L, # Lower error correction
box_size=5, # Smaller pixels
border=4, # Minimum border
)QR codes use mask patterns to avoid problematic patterns in the final matrix. Usually auto-selected.
# Mask patterns (0-7)
MASK_PATTERN_AUTO = None # Automatic selection (recommended)
MASK_PATTERNS = list(range(8)) # [0, 1, 2, 3, 4, 5, 6, 7]Usage Example:
import qrcode
# Automatic mask selection (recommended)
qr = qrcode.QRCode(mask_pattern=None)
# Manual mask selection (advanced usage)
qr = qrcode.QRCode(mask_pattern=3) # Use specific pattern
# Test different masks
for pattern in range(8):
qr = qrcode.QRCode(mask_pattern=pattern)
qr.add_data('Test data')
qr.make()
img = qr.make_image()
img.save(f'qr_mask_{pattern}.png')qr = qrcode.QRCode(
version=None, # Auto-size
error_correction=qrcode.constants.ERROR_CORRECT_M, # Standard
box_size=10, # Standard
border=4 # Minimum safe border
)qr = qrcode.QRCode(
version=None,
error_correction=qrcode.constants.ERROR_CORRECT_H, # High for logo coverage
box_size=10,
border=4
)qr = qrcode.QRCode(
version=None, # Let it auto-size large
error_correction=qrcode.constants.ERROR_CORRECT_L, # Lower for more data
box_size=8, # Smaller for dense display
border=4
)qr = qrcode.QRCode(
version=None,
error_correction=qrcode.constants.ERROR_CORRECT_Q, # Higher for print quality
box_size=20, # Larger for print resolution
border=6 # Extra border for print tolerance
)evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10