SWAPQR← Guía

Códigos QR con dithering: cómo una fotografía se convierte en un código escaneable

La mayoría de los códigos QR "artísticos" son una imagen con un código estampado encima. Un código QR con dithering es otra cosa: hay una sola imagen, y el código forma parte de su grano. Este artículo explica qué necesita realmente un código, cómo funciona el dithering por difusión de error, el único cambio que permite a los dos compartir un cuadrado, los dos ajustes que deciden el resultado y las tres formas en que falla.

Crea un código QR en el navegador →Imprime el cuadrado una vez. Decide después adónde lleva.

Empieza por lo que un código QR necesita de verdad

Un código QR es una cuadrícula de módulos — cuadraditos que son o bien oscuros o bien claros. Algunos son estructurales y no pueden moverse: los tres cuadrados grandes de las esquinas que permiten a un escáner localizar y orientar el código, la fina línea alternante entre ellos, los pequeños cuadrados de alineación y las franjas que codifican formato y versión. Todo lo demás son datos más bytes de corrección de errores. Esa corrección de errores es la puerta de entrada. En el nivel más alto, aproximadamente un 30% del código puede destruirse y un lector seguirá recuperando la carga útil. Así que un código no tiene que ser perfecto. Tiene que ser perfecto donde importa, y suficientemente aproximado en el resto. Quédate con esa distinción, porque toda la técnica descansa en ella: los módulos estructurales se tratan como intocables, y el área de datos se trata como algo que solo necesita estar bien en promedio, a la escala a la que la ve una cámara. Todo generador que mete una imagen en un código está gastando parte de ese presupuesto del 30%; la pregunta es solo con cuánto cuidado lo gasta, y si el ojo puede ver el coste.

El dithering, en un párrafo

El dithering de Floyd–Steinberg convierte una fotografía en escala de grises en blanco y negro puros. Recorres los píxeles en orden. Para cada uno eliges el más cercano entre negro y blanco, luego tomas el error que acabas de cometer — la diferencia entre el gris que querías y el valor que pusiste — y lo empujas hacia los vecinos que aún no has visitado, ponderado 7/16 al píxel de la derecha y 3/16, 5/16 y 1/16 a los tres píxeles de abajo. Cada uno de esos vecinos parte entonces de un valor ligeramente ajustado cuando le llega su turno, de modo que el error nunca se pierde, solo se desplaza. La imagen sale como un campo de moteado cuya densidad local coincide con el brillo original: una región de gris medio se convierte en aproximadamente la mitad de puntos negros, una luz alta en puntos dispersos sobre blanco, una sombra en puntos blancos dispersos sobre negro. Vista a distancia, el ojo promedia el moteado de vuelta a tono, y por eso una imagen con dithering se lee como una fotografía aunque cada píxel sea de solo uno de dos colores. Ese promediado es lo mismo que hace una cámara cuando mira una impresión pequeña, y es lo que la técnica explota.

El truco

Renderiza el código a un número fijo de píxeles por módulo — SWAPQR usa nueve, así que cada módulo es un bloque de 9×9. Luego aplica el dithering a la fotografía sobre todo el cuadrado, con un cambio: donde el código exige un valor concreto, no umbralices. Fuerza el píxel a lo que el código necesita, mide el error que ese forzado causó y difúndelo exactamente igual que cualquier otro error. Esa última cláusula es toda la idea. Los puntos forzados no se pintan encima de la imagen; los pagan los píxeles de alrededor, que se desplazan para compensar. Aterrizan dentro de la misma textura de sal y pimienta que todo lo demás, así que el ojo no tiene nada con que separarlos. Los módulos estructurales — localizadores, temporización, alineación, formato — se dibujan sólidos e intactos, porque un escáner tiene que encontrar el código antes de que la corrección de errores pueda ayudarle. La técnica aquí descrita sigue el enfoque publicado por Andrew T., que documentó la generación de QR con dithering en 2026; la implementación de SWAPQR se escribió a partir de la descripción y no se portó de su código fuente.

Dos controles que lo deciden todo

El primero es cuánto de cada módulo se fuerza. Fuerza solo el píxel central y la imagen queda casi intacta, pero el código es frágil: un píxel por módulo tiene que sobrevivir a cada paso de remuestreo entre la impresora y el sensor de la cámara. Fuerza un bloque de 7×7 de los 9×9 y el código es robusto y la imagen tenue, porque la mayor parte de cada módulo es ahora sólida. SWAPQR expone esto directamente como un balance Photo ↔ Code (foto ↔ código), con las posiciones Photo, Middle y Code, para que el intercambio sea una elección tuya y no una constante escondida en el generador. El segundo es cuánto se empuja cada módulo. Antes del dithering, cada píxel de un módulo oscuro se oscurece un poco y cada píxel de un módulo claro se aclara un poco. La imagen conserva su detalle, pero el tono medio del módulo se inclina hacia el lado correcto — que es lo que ve una cámara cuando mira un código impreso pequeño desde el otro lado de una sala. Entre ambos, los dos ajustes deciden si el resultado es una fotografía con un código tenue dentro o un código con una fotografía tenue dentro, y en qué punto de esa línea debe situarse una impresión concreta depende de cómo se vaya a escanear.

Dónde se rompe, y si merece la pena

Tres modos de fallo, todos reales, ninguno misterioso. Una fotografía plana: una imagen de iluminación uniforme y un solo tono se convierte con el dithering en un damero regular, que es exactamente la textura que compite con el código, así que las imágenes necesitan un rango real de claro a oscuro y el estudio avisa cuando una no lo tiene. Un enlace largo: más caracteres significan más módulos en el mismo cuadrado, así que cada módulo recibe menos imagen; más allá de la versión 8 aproximadamente — 49×49 módulos — la fotografía no tiene dónde vivir, y un enlace corto de redirección es la solución. Y el primer plano extremo en algunos lectores, que es lo bastante contraintuitivo como para tener su propio artículo en esta guía. Un código artístico es siempre un intercambio a costa de la fiabilidad. Se gana su sitio donde el código es parte del diseño y alguien va a escanearlo deliberadamente — un póster, una funda de disco, un embalaje, una tarjeta de visita. No tiene sitio en una señal de salida de emergencia. Sea cual sea el contexto, prueba la pieza impresa con un teléfono real antes de encargar mil; el estudio dice lo mismo junto al botón de exportar, y lo dice en serio.

Parte del códigoTratamiento en un código con ditheringPor qué
Patrones localizadores (tres cuadrados de esquina)Dibujados sólidos, nunca con ditheringEl escáner debe localizar y orientar el código antes que nada
Línea de temporización, cuadrados de alineación, franjas de formato y versiónDibujados sólidos, nunca con ditheringEstructurales; la corrección de errores no puede reparar un código que no se encuentra
Módulos de datos y de corrección de erroresUn bloque central de cada módulo forzado, el resto lleva la fotoEl tono medio del módulo es lo que ve una cámara a distancia de escaneo
Píxeles alrededor de un bloque forzadoDesplazados por difusión de error para compensarMantiene correcto el promedio local para que los puntos forzados se escondan en el moteado
Zona de silencioClara, intactaLos escáneres usan el margen vacío para encontrar el borde del código

Preguntas frecuentes

¿La foto simplemente se coloca detrás del código?

No. El código y la foto se producen en una sola pasada: la imagen recibe dithering, y donde el código necesita un valor el píxel se fuerza y su error se difunde a los vecinos. Hay una sola imagen, no una capa sobre otra.

¿Por qué nueve píxeles por módulo?

Da a cada módulo un bloque de 9×9, lo bastante grande para contener un núcleo forzado de tamaño variable y aun así dejar píxeles para la imagen. El ajuste de balance decide cuánto de ese bloque se fuerza.

¿Se escanea con teléfonos normales?

Sí, para las cargas útiles y las imágenes para las que está diseñado, y cada compilación se comprueba con dos decodificadores independientes a siete distancias de cámara simuladas. Sigue siendo un intercambio a costa de la fiabilidad, así que imprime uno y pruébalo con tu propio teléfono.

¿Por qué un enlace largo arruina la imagen?

Un texto más largo implica una versión superior, es decir, más módulos y más pequeños en el mismo cuadrado. Cada módulo tiene menos espacio para píxeles de foto, y más allá de unos 49×49 módulos la imagen desaparece. Usa un enlace corto de redirección.

Imprime el cuadrado una vez. Decide después adónde lleva. SWAPQR crea códigos QR estáticos gratis, con todas las opciones de estilo, sin cuenta y sin marca de agua. Un plan de pago convierte un código en dinámico: el cuadrado impreso sigue igual mientras tú cambias su destino, y ves cuántas veces se escaneó, por día y por dispositivo.

Crea un código QR en el navegador
Idioma: TR EN DE ES FR IT PT AR RU JA KO