Generate and Read QR Codes with Python
QR codes (Quick Response) are 2D matrices that store text, URLs, contact data, and more. Python provides libraries to generate, customize, and decode them.
Installation
pip install qrcode[pil] pillow opencv-python
Generate a Basic QR Code
import qrcode
qr = qrcode.make("https://kaijuconverter.com")
qr.save("basic_qr.png")
print("QR generated: basic_qr.png")
Customize Size and Error Correction
import qrcode
qr = qrcode.QRCode(
version=1, # 1-40, higher = more data
error_correction=qrcode.constants.ERROR_CORRECT_H, # L/M/Q/H
box_size=10, # pixels per module
border=4, # border modules
)
qr.add_data("https://my-site.com/product/123")
qr.make(fit=True)
image = qr.make_image(fill_color="black", back_color="white")
image.save("custom_qr.png")
QR with Colors and Logo
import qrcode
from qrcode.image.styledimage import StyledPilImage
from qrcode.image.styles.moduledrawers import RoundedModuleDrawer
from PIL import Image
def qr_with_logo(data, logo_path, output):
qr = qrcode.QRCode(
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10, border=4
)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(
image_factory=StyledPilImage,
module_drawer=RoundedModuleDrawer()
)
img = img.convert("RGB")
logo = Image.open(logo_path).resize((80, 80))
pos = ((img.size[0] - 80) // 2, (img.size[1] - 80) // 2)
img.paste(logo, pos, mask=logo.convert("RGBA").split()[-1])
img.save(output)
print(f"QR with logo: {output}")
qr_with_logo("https://my-company.com", "logo.png", "branded_qr.png")
Read / Decode QR Codes
import cv2
def read_qr(image_path):
img = cv2.imread(image_path)
detector = cv2.QRCodeDetector()
data, points, _ = detector.detectAndDecode(img)
if data:
print(f"Data: {data}")
print(f"Corners: {points}")
else:
print("No QR code detected")
return data
read_qr("basic_qr.png")
Real-Time QR Reader from Camera
import cv2
cap = cv2.VideoCapture(0)
detector = cv2.QRCodeDetector()
print("Camera active — press 'q' to quit")
while True:
ret, frame = cap.read()
if not ret: break
data, points, _ = detector.detectAndDecode(frame)
if data:
print(f"QR detected: {data}")
cv2.putText(frame, data[:40], (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,255,0), 2)
cv2.imshow("QR Reader", frame)
if cv2.waitKey(1) & 0xFF == ord('q'): break
cap.release()
cv2.destroyAllWindows()
Batch QR Generation from CSV
import qrcode
import csv
from pathlib import Path
def qr_from_csv(csv_path, output_dir="qrs"):
Path(output_dir).mkdir(exist_ok=True)
with open(csv_path, newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for i, row in enumerate(reader, 1):
name = row.get('name', f'qr_{i}').replace(' ', '_')
url = row.get('url', row.get('data', ''))
if not url: continue
qrcode.make(url).save(f"{output_dir}/{name}.png")
print(f" [{i}] {name}.png")
# CSV with columns: name, url
qr_from_csv("products.csv")
Additional Resource
For converting images between PNG, JPG, WebP and other formats without any coding, use KaijuConverter — free and no registration required.
Related conversions
Frequent conversions across the catalogue: