Generar y Leer Códigos QR con Python
Los códigos QR (Quick Response) son matrices 2D que almacenan texto, URLs, datos de contacto y más. Python ofrece librerías para generarlos, personalizarlos y decodificarlos.
Instalación
pip install qrcode[pil] pillow opencv-python
Generar un Código QR Básico
import qrcode
qr = qrcode.make("https://kaijuconverter.com")
qr.save("qr_basico.png")
print("QR generado: qr_basico.png")
Personalizar Tamaño y Corrección de Error
import qrcode
qr = qrcode.QRCode(
version=1, # 1-40, mayor = más datos
error_correction=qrcode.constants.ERROR_CORRECT_H, # L/M/Q/H
box_size=10, # píxeles por módulo
border=4, # módulos de borde
)
qr.add_data("https://mi-sitio.com/producto/123")
qr.make(fit=True)
imagen = qr.make_image(fill_color="black", back_color="white")
imagen.save("qr_personalizado.png")
QR con Colores y Logo
import qrcode
from qrcode.image.styledimage import StyledPilImage
from qrcode.image.styles.moduledrawers import RoundedModuleDrawer
from PIL import Image
def qr_con_logo(datos, ruta_logo, salida):
qr = qrcode.QRCode(
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10, border=4
)
qr.add_data(datos)
qr.make(fit=True)
# Módulos redondeados
img = qr.make_image(
image_factory=StyledPilImage,
module_drawer=RoundedModuleDrawer()
)
img = img.convert("RGB")
# Insertar logo en el centro
logo = Image.open(ruta_logo).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(salida)
print(f"QR con logo: {salida}")
qr_con_logo("https://mi-empresa.com", "logo.png", "qr_logo.png")
Leer/Decodificar Códigos QR
import cv2
def leer_qr(ruta_imagen):
img = cv2.imread(ruta_imagen)
detector = cv2.QRCodeDetector()
datos, puntos, _ = detector.detectAndDecode(img)
if datos:
print(f"Datos: {datos}")
print(f"Esquinas: {puntos}")
else:
print("No se detectó ningún QR")
return datos
leer_qr("qr_basico.png")
Leer QR desde Cámara en Tiempo Real
import cv2
cap = cv2.VideoCapture(0)
detector = cv2.QRCodeDetector()
print("Mostrando cámara - pulsa 'q' para salir")
while True:
ret, frame = cap.read()
if not ret: break
datos, puntos, _ = detector.detectAndDecode(frame)
if datos:
print(f"QR detectado: {datos}")
cv2.putText(frame, datos[:40], (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,255,0), 2)
cv2.imshow("Lector QR", frame)
if cv2.waitKey(1) & 0xFF == ord('q'): break
cap.release()
cv2.destroyAllWindows()
Generar QR por Lotes desde CSV
import qrcode
import csv
from pathlib import Path
def qr_desde_csv(csv_path, carpeta_salida="qrs"):
Path(carpeta_salida).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):
nombre = row.get('nombre', f'qr_{i}').replace(' ', '_')
url = row.get('url', row.get('datos', ''))
if not url: continue
qr = qrcode.make(url)
qr.save(f"{carpeta_salida}/{nombre}.png")
print(f" [{i}] {nombre}.png")
# CSV con columnas: nombre, url
qr_desde_csv("productos.csv")
Recurso Adicional
Para convertir imágenes entre PNG, JPG, WebP y otros formatos sin instalar nada, usa KaijuConverter — gratis y sin registro.
Conversiones relacionadas
Conversiones frecuentes del catálogo: