· 10 min

Cómo funciona un código QR por dentro: guía técnica

Anatomía de un QR: módulos, patrones de posicionamiento, máscaras, Reed-Solomon y máximo de información. Todo lo que un QR esconde detrás del cuadrado.

Un código QR parece un cuadrado al azar, pero cada píxel tiene una función. Esta guía abre el QR por dentro: qué es cada parte, cómo se codifica la información, por qué tolera tanto daño y qué decisiones técnicas tomaron Denso Wave en 1994 que siguen vigentes 30 años después.

Respuesta rápida

  • Un QR es una matriz cuadrada de módulos (pixels negros y blancos). El tamaño va de 21×21 (versión 1) a 177×177 (versión 40).
  • Tiene zonas funcionales fijas (las tres plazas de las esquinas, el patrón de alineamiento, la línea de tiempo) y zonas de datos.
  • Los datos se codifican con Reed-Solomon, el mismo algoritmo de CDs y satélites, lo que permite reconstruirlos si parte del QR está dañado.
  • Antes de imprimirse, el QR pasa por una máscara (uno de 8 patrones predefinidos) que evita zonas grandes uniformes que confunden al lector.
  • La capacidad máxima de un QR versión 40 con ECL bajo: ~4.296 caracteres alfanuméricos o ~7.089 numéricos.

Anatomía de un QR

Un QR es como un microchip impreso. Sus partes:

1. Patrones de posicionamiento (los tres "ojos")

Tres cuadrados grandes en las esquinas (excepto la inferior derecha). Son señales de orientación: el lector los detecta primero, calcula la rotación y escala del QR, y a partir de ahí lee el resto.

Por eso si tapas o dañas uno de estos tres "ojos", ningún nivel de corrección lo salva: el lector no sabe dónde está el QR.

2. Patrones de alineamiento

Cuadraditos más pequeños distribuidos por el cuerpo del QR (solo aparecen en QR de versión 2 o superior, es decir, más grandes que 21×21). Sirven para que el lector compense distorsiones: papel arrugado, foto en ángulo, lente mala.

A más versión (más grande el QR), más patrones de alineamiento.

3. Línea de tiempo

Una hilera de módulos blancos y negros alternados que conecta los "ojos". Permite al lector calcular el tamaño exacto de cada módulo cuando el QR está deformado o fotografiado en perspectiva.

4. Zonas de formato e información de versión

Pequeñas regiones cerca de los "ojos" que codifican:

  • Nivel ECL (L, M, Q o H — ver niveles de corrección de errores QR).
  • Máscara aplicada (cuál de los 8 patrones de máscara se usó).
  • Versión del QR (en QR versión 7 o superior).

5. Zona de datos (el resto)

Todo lo demás, llenándose desde la esquina inferior derecha hacia arriba en zigzag, es la información codificada más los bytes redundantes de Reed-Solomon.

6. Quiet zone

El margen blanco alrededor del QR. No es opcional: el estándar exige al menos 4 módulos de ancho. Si pegas el QR pegado a un borde sin margen, fallará en muchos lectores. Cobertura completa de este tema: Cómo añadir un QR a una imagen.

Versiones del QR

El estándar define 40 versiones, de la 1 (21×21 módulos) a la 40 (177×177).

Versión Tamaño en módulos Capacidad típica de URL (M)
1 21×21 ~17 caracteres
3 29×29 ~42 caracteres
5 37×37 ~84 caracteres
10 57×57 ~213 caracteres
20 97×97 ~666 caracteres
40 177×177 ~2.331 caracteres

Un mismo contenido se puede codificar en distintas versiones (con espacios "rellenados"). Pero usar la versión más pequeña posible es lo recomendado: menos módulos = más fácil de leer.

Por eso, si tu URL es muy larga (https://tuempresa.com/promo/?utm_source=instagram&utm_medium=story&utm_campaign=verano2026), el QR resultante necesitará una versión alta y será denso. Acórtala con un dominio corto o usa parámetros mínimos. Más sobre esto en QR estático vs QR dinámico.

Cómo se codifica la información

QR soporta cuatro modos de codificación, cada uno más eficiente para su tipo de dato:

  1. Numérico (0-9): 10 bits por 3 dígitos. El más compacto.
  2. *Alfanumérico (0-9, A-Z, espacio, símbolos `$%+-./:`)**: 11 bits por 2 caracteres.
  3. Byte (UTF-8 / Latin-1): 8 bits por carácter. El más flexible (acepta cualquier texto).
  4. Kanji (caracteres japoneses): 13 bits por carácter. Por algo el QR es japonés.

Un buen codificador elige automáticamente el modo más eficiente para tu contenido. URLs típicas usan alfanumérico o byte según los caracteres.

Ejemplo paso a paso

Vamos a codificar HELLO en modo alfanumérico:

  1. Cada carácter se convierte a su índice en la tabla alfanumérica:
    • H = 17, E = 14, L = 21, L = 21, O = 24.
  2. Se agrupan de dos en dos: (17, 14), (21, 21), (24).
  3. Cada par se combina como 45 × primero + segundo:
    • (17, 14) → 17×45 + 14 = 779.
    • (21, 21) → 21×45 + 21 = 966.
    • (24) → un solo carácter, se codifica con 6 bits = 011000.
  4. Los números se traducen a bits de 11 bits cada uno:
    • 779 → 01100001011
    • 966 → 01111000110
    • 24 → 011000
  5. Se anteponen cabeceras: modo (4 bits) y longitud (9 bits para alfanumérico hasta versión 9).
  6. Se rellena con padding hasta completar la capacidad de la versión elegida.
  7. Se aplica Reed-Solomon para añadir bytes redundantes.
  8. Todo se distribuye por la zona de datos en patrón zigzag.

El resultado es un bloque de bits que el lector descodifica al inverso.

El truco de las máscaras

Si dibujáramos los bits directamente, ciertos contenidos producirían grandes zonas uniformes (todo negro o todo blanco) que confunden al detector. Para evitarlo, el QR aplica una máscara: un patrón geométrico que se "XORea" con los datos.

Hay 8 máscaras predefinidas (numeradas 0-7). El codificador prueba las 8 y elige la que da el patrón "más legible" según una puntuación basada en:

  • Cuántos bloques uniformes hay.
  • Cuántos patrones similares al de posicionamiento podrían confundirse.
  • Cuántas filas/columnas tienen muchos módulos iguales seguidos.
  • Equilibrio entre módulos negros y blancos.

La máscara elegida se anota en la zona de formato, así el lector sabe cuál aplicar al revés para recuperar los datos originales.

Implicación visual: dos QR con el mismo contenido pueden verse muy distintos si el codificador eligió máscaras diferentes (o si el algoritmo de scoring difiere entre generadores).

Reed-Solomon: cómo se reconstruye el daño

Reed-Solomon es un algoritmo de corrección de errores publicado en 1960. La idea:

  • Tomas N bytes de datos.
  • Añades K bytes redundantes calculados a partir de los N originales.
  • Si pierdes hasta K/2 bytes, puedes reconstruirlos con los demás.

En QR:

Nivel ECL % bytes redundantes Máximo daño recuperable
L ~7% hasta 7%
M ~15% hasta 15%
Q ~25% hasta 25%
H ~30% hasta 30%

Si la suciedad, el logo o la rotura supera ese porcentaje, el QR falla. La corrección de errores no es magia: hay un límite duro.

Más detalle práctico de cuándo usar cada nivel: Corrección de errores QR explicada.

Por qué los tres "ojos" no son simétricos

Si te fijas: hay tres "ojos" — superior izquierda, superior derecha, inferior izquierda. No hay ojo en la inferior derecha. ¿Por qué?

Es deliberado. Esa asimetría permite al lector determinar la rotación del QR. Si los cuatro fueran iguales, no podrías saber si el QR está derecho o boca abajo. Con tres ojos en una "L", solo hay una rotación posible.

¿Y los QR de colores?

El estándar QR define un solo color para módulos oscuros y otro para módulos claros. La especificación habla de "oscuro" y "claro", no de "negro" y "blanco". Por eso:

  • Puedes usar cualquier color para los módulos siempre que el contraste con el fondo sea ≥ 3:1 (WCAG recomienda ≥ 4.5:1).
  • Los gradientes funcionan si el contraste mínimo en cualquier punto del gradiente supera ese umbral.
  • Invertir colores (módulos claros, fondo oscuro) funciona en lectores modernos, pero un 15-20% de móviles antiguos fallan.

Si quieres añadir tu marca con colores corporativos: Tutorial completo de QR con logo y colores.

Microversiones y rMQR

Hay dos formatos derivados del QR estándar:

Micro QR

QR mucho más pequeños (de 11×11 a 17×17 módulos). Capacidad limitada (~35 caracteres alfanuméricos), pero útiles cuando el espacio es crítico (joyería, componentes electrónicos pequeños).

Solo tiene un "ojo" en la esquina superior izquierda. Soportado por lectores especializados, no siempre por la cámara nativa de un móvil.

rMQR (rectangular)

Aprobado en 2022. Es un QR rectangular (no cuadrado), útil para espacios alargados (cintas, tarjetones estrechos). Capacidad similar al QR estándar para igual área.

QRcito genera QR cuadrado estándar versión 1-40, que es lo que la inmensa mayoría de lectores móviles entienden por defecto.

El estándar y su historia

  • 1994: Denso Wave (filial de Toyota) inventa el QR para trazabilidad de piezas de automóvil.
  • 2000: ISO/IEC 18004:2000, estándar internacional formal.
  • 2005: Llega a la telefonía móvil japonesa (los móviles de carcasa de Sharp incluían lector QR de fábrica).
  • 2010-2015: explosión en China e India (Alipay, WeChat Pay).
  • 2017: Apple integra el lector en la cámara nativa del iPhone. Adopción masiva en Occidente.
  • 2020: COVID dispara el uso (cartas digitales en restaurantes, certificados sanitarios).
  • 2024+: Pagos QR estandarizados, tickets de avión, identificación digital, salud, logística.

Denso Wave mantiene la patente pero renunció a los royalties. Eso es lo que ha permitido la adopción masiva: cualquiera puede generar y leer QR sin pagar licencias.

Algunas curiosidades

  • El QR más grande oficial medía 22.000 m² en China (2020), un sembrado de plantas que formaban un QR.
  • El QR más pequeño funcional lo hace Denso Wave a 0,9 mm × 0,9 mm para piezas industriales.
  • Algunos QR tienen "easter eggs": dejando ciertos bits "libres" después del padding, se pueden insertar mensajes ocultos para humanos que solo se ven con software especializado.
  • El primer QR escaneado en el espacio: 2009, ISS, etiqueta de un componente.
  • Por qué el patrón parece "random": porque la máscara optimiza la apariencia. Sin máscara, muchos QR tendrían rayas paralelas o bloques uniformes evidentes.

Para programadores: librerías recomendadas

Si quieres generar QR en código:

  • JavaScript: qrcode, qr-code-styling (la que usa QRcito), node-qrcode.
  • Python: qrcode, segno, python-qrcode-extended.
  • Java/Android: ZXing (la referencia).
  • Swift/iOS: CoreImage con filtro CIQRCodeGenerator integrado.
  • Go: github.com/skip2/go-qrcode.
  • Rust: qrcode crate.

Todas implementan el estándar ISO/IEC 18004 y son libres.

Preguntas frecuentes

¿Hay un QR "infinito" o algo así? No. La versión máxima es 40 (177×177 módulos) con ~7000 caracteres numéricos o ~4300 alfanuméricos. Por encima de eso, se usan otros formatos (PDF417, Data Matrix, Aztec).

¿Puede haber dos QR con el mismo contenido y patrón visual distinto? Sí. El codificador puede elegir distinta máscara (8 opciones), distinto modo (alfanumérico vs byte) y distinto nivel ECL. Para el lector, los tres son válidos.

¿Se puede "inyectar código malicioso" en un QR? El QR es solo texto. No ejecuta código por sí mismo. El riesgo está en a qué te dirige (una URL maliciosa, un comando WiFi a una red trampa). Más en Quishing, estafas con QR.

¿Por qué algunos QR tienen un cuadradito pequeño en la esquina inferior derecha? Es el patrón de alineamiento más cercano a la zona inferior derecha. Aparece automáticamente en QR de versión 2 o superior. Sirve para que el lector compense distorsiones en zonas alejadas de los tres "ojos" principales.

¿Por qué el QR es más rápido de leer que un código de barras? Porque el QR codifica en 2 dimensiones (horizontal + vertical), mientras que un código de barras lineal solo en una. La cámara del móvil ve los tres "ojos" del QR y se orienta inmediatamente, sin necesidad de barrer en una dirección concreta.

En resumen

Un QR no es un cuadrado al azar: es un microformato con anatomía precisa, codificación matemática y tolerancia a daño calculada. Saber cómo funciona por dentro te ayuda a tomar mejores decisiones cuando lo generas: nivel ECL adecuado, tamaño físico mínimo, posición del logo. La buena noticia: QRcito hace todas estas decisiones por ti automáticamente, salvo que quieras tocarlas.

Crea tu QR estándar ISO/IEC 18004 en segundos: qrcito.com

← Volver al blog