¿Qué es un lector de códigos QR?
Un código QR es un código de barras de matriz bidimensional definido por ISO/IEC 18004. Codifica texto, URL, tarjetas de contacto, credenciales Wi-Fi y otros payloads cortos como una cuadrícula de módulos cuadrados en blanco y negro, junto con datos de corrección de errores Reed-Solomon para que el símbolo siga decodificándose aunque sufra daños parciales o tenga un logotipo superpuesto. Un lector de códigos QR hace lo inverso: toma la imagen de un símbolo QR y recupera la cadena del payload original. Este lector ejecuta el proceso de decodificación directamente en tu navegador usando la librería de código abierto jsQR (unos 130 KB, licencia MIT). La imagen que sueltas, pegas o escaneas con la cámara nunca sale de la pestaña. No hay paso de subida. Abre DevTools mientras decodificas y el panel Network permanece en silencio — la página no realiza ninguna solicitud XHR, fetch ni baliza analítica vinculada al contenido de tu imagen.
¿Cómo funciona la decodificación QR?
La decodificación se ejecuta íntegramente en tu máquina. Cada imagen pasa por un proceso fijo antes de que se devuelva el texto del payload:
- El archivo de imagen (PNG, JPG, WebP o un fotograma de cámara) se dibuja en un
<canvas>HTML fuera de pantalla. La Canvas API devuelve los datos de píxeles en bruto como un array de bytes RGBA. - La librería jsQR convierte el array de píxeles a un mapa de bits en escala de grises y busca los tres cuadrados distintivos del patrón de búsqueda en las esquinas del símbolo QR.
- Una vez localizados los patrones de búsqueda, el decodificador calcula la transformación de perspectiva y extrae la cuadrícula completa de módulos, leyendo cada celda como un 0 o un 1 binario.
- La cuadrícula de módulos se analiza según la especificación QR: primero se leen la información de formato y versión, luego los módulos de datos se desinterlejan y se aplica la corrección de errores Reed-Solomon.
- Las palabras de código de datos corregidas se decodifican según el modo de segmento (numérico, alfanumérico, byte o kanji), dando como resultado la cadena del payload original.
- Después, esta herramienta analiza el payload con un pequeño conjunto de expresiones regulares para identificar el tipo de contenido (URL, credencial Wi-Fi, vCard, etc.) y muestra el resultado con un botón de acción apropiado.
¿Por qué usar un lector QR en el navegador?
- Los bytes de la imagen nunca salen de tu dispositivo. Pega un QR que oculte una contraseña Wi-Fi, una URL interna de staging o una vCard con el número personal de alguien, y ese contenido permanece en tu portátil. Otros lectores QR ejecutan la decodificación en un servidor remoto y te piden que subas la imagen primero — este no.
- Una vez cargada la página, la decodificación funciona sin conexión. La librería jsQR vive en tu pestaña. Puedes desconectar el Wi-Fi, soltar una imagen QR en la página y recuperar el payload igualmente — útil en vuelos, sótanos y cualquier lugar donde la red corporativa bloquee escáneres de terceros.
- Si tu ordenador tiene cámara web, puedes apuntarla a un código QR impreso y leerlo sin instalar ninguna aplicación ni desbloquear el móvil. La transmisión de la cámara permanece en el navegador y se detiene en el momento en que se decodifica un código.
- El lector reconoce URL, cadenas de conexión Wi-Fi, vCard, MeCard, mailto, SMS y payloads geo, y muestra un botón de acción acorde. Abre una URL, copia la contraseña Wi-Fi, guarda la tarjeta de contacto — lo que sea que contenga el QR.
Usos comunes de un lector de códigos QR
Siempre que necesites ver qué dice un código QR sin apuntar un móvil:
- Depurar códigos que acabas de generar. Pega el QR que produjo tu aplicación (o haz una captura de pantalla desde el Generador de Códigos QR del lado) y confirma que la URL o el payload codificado coincide con lo que pretendías antes de enviarlo a imprenta, embalaje o cartel.
- Recuperar credenciales Wi-Fi. Escanea el QR Wi-Fi de la página de configuración del router, de una tarjeta de bienvenida de hotel o de la foto de un anuncio de alquiler, y el lector devuelve el SSID, el tipo de seguridad y la contraseña como texto plano que puedes copiar en otro dispositivo.
- Auditoría y accesibilidad. Decodifica códigos QR en documentos escaneados, etiquetas de productos, tarjetas de congreso o capturas de pantalla de publicaciones en redes sociales para extraer su contenido a una hoja de cálculo, un registro de cumplimiento o software de accesibilidad — útil cuando la URL de destino es la afirmación real que se está auditando.
¿Cómo es la decodificación de un código QR real?
Toma un código QR Wi-Fi impreso en el escaparate de una cafetería. Detrás del símbolo, el payload en bruto sigue el esquema de URI WIFI:: WIFI:S:CafeGuest;T:WPA;P:espresso2026;H:false;;. Fotografía el símbolo, suelta la imagen en la zona de carga de arriba y el proceso se pone en marcha: el canvas lee los píxeles, jsQR localiza los tres patrones de búsqueda de las esquinas, la transformación de perspectiva endereza la cuadrícula, Reed-Solomon repara los daños por reflejos o compresión, y el segmento en modo byte produce la cadena URI. El lector detecta el prefijo WIFI:, etiqueta el tipo como Wi-Fi, analiza el nombre de red como CafeGuest, el tipo de seguridad como WPA y la contraseña como espresso2026. Un botón Copiar pone la contraseña en tu portapapeles para que puedas pegarla en el selector de redes del sistema operativo. Para un QR de URL plana que contiene https://tools.ultim8soft.com, el mismo proceso devuelve el indicador de tipo URL y un botón Abrir que navega al destino en una nueva pestaña. En cualquier caso, lo único que ocurrió en la red fue la carga inicial de la página — la decodificación es local.
Este lector de códigos QR fue construido para un solo trabajo: mostrarte exactamente qué codifica un código QR, en tu navegador, sin ningún servidor de por medio. Suelta una imagen, pega desde el portapapeles o deja correr la webcam, y el contenido decodificado más su tipo aparecen en pantalla en menos de un segundo. Los bytes de la imagen no se suben. Los fotogramas de la cámara no se graban. El payload decodificado no pasa por los registros de nadie más de vuelta a ti. Combínalo con el Generador de Códigos QR para confirmar de extremo a extremo que lo que codificaste es lo que otra persona verá.
¿Se sube la imagen a un servidor?
No. La imagen se dibuja en un canvas HTML en memoria y se decodifica íntegramente por JavaScript del lado del cliente que corre en tu pestaña. Ningún píxel de tu imagen se envía nunca a un servidor, se registra ni se almacena. Puedes confirmarlo abriendo DevTools y viendo el panel Network mientras sueltas una imagen: ninguna solicitud XHR, fetch ni baliza analítica está vinculada al contenido del archivo.
¿Cómo funciona el escaneo por cámara?
Cuando activas el modo cámara, el navegador solicita permiso para acceder a la cámara del dispositivo a través de la API estándar getUserMedia. Los fotogramas de vídeo se capturan en un canvas fuera de pantalla a una resolución máxima de 640×480 y se entregan a jsQR para decodificación. Cada fotograma se descarta en el momento en que llega el siguiente, y la transmisión de la cámara se detiene tras la primera decodificación exitosa. No se graba ningún fotograma, no se transmite ninguno, y la solicitud de permiso solo se activa cuando marcas el interruptor — no al cargar la página.
¿Por qué algunos contenidos QR se detectan automáticamente como Wi-Fi o vCard?
Los payloads QR de credenciales Wi-Fi siguen el formato WIFI:S:ssid;T:tipo;P:contraseña;;, y las vCard comienzan con BEGIN:VCARD. Este lector reconoce esos patrones junto con otros prefijos estándar (mailto:, geo:, smsto:, MECARD:, https://) e identifica el tipo de contenido automáticamente para que el botón de acción coincida con lo que querrías hacer con el payload.
¿Por qué no se escaneó mi código QR?
Causas habituales: la imagen es demasiado pequeña o tiene baja resolución (~100×100 px es el mínimo, 300×300+ escanea de forma fiable), el símbolo tiene daños graves o está parcialmente tapado por un logotipo sin suficiente corrección de errores, falta la zona de silencio (el borde en blanco alrededor de los módulos) o está recortada, o el contraste entre módulos oscuros y claros es demasiado bajo. En el modo cámara, mejora la iluminación o acerca el código a la lente — jsQR necesita resolver los módulos individuales con claridad para localizar los patrones de búsqueda.