Generador de códigos QR en Rust: creación e integración en aplicaciones web

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Generador de códigos QR en Rust: una herramienta potente para tu proyecto

\n\n

Los códigos QR se han convertido en una parte esencial de la web moderna: enlaces, contactos, contraseñas de Wi-Fi, todo esto se puede codificar en una imagen cuadrada. Si estás desarrollando un sitio educativo o un servicio en Rust, la generación de códigos QR puede ser una función útil. En este artículo, exploraremos la librería qrcode para Rust, aprenderemos a crear códigos QR, personalizar su apariencia e integrarlos en aplicaciones web.

\n\n

Rust es un lenguaje de programación de sistemas valorado por su rendimiento y seguridad. La librería qrcode aprovecha todas las ventajas de Rust: es rápida, no requiere dependencias externas y se integra fácilmente en cualquier proyecto. Analicemos cómo generar códigos QR con ella.

\n\n

Instalación y configuración

\n\n

Para trabajar con códigos QR en Rust necesitaremos el crate qrcode y, si se necesita guardar imágenes, el crate image. Agrégalos al archivo Cargo.toml:

\n\n
[dependencies]\nqrcode = "0.14"\nimage = "0.24"
\n\n

Después de esto, ejecuta cargo build para descargar las dependencias.

\n\n

Ejemplo básico: generación de código QR en la consola

\n\n

El primer ejemplo es el más simple: mostraremos el código QR directamente en la terminal. Esto es útil para depuración o cuando no se necesita guardar la imagen.

\n\n
use qrcode::QrCode;\nuse qrcode::render::unicode;\n\nfn main() {\n    // Creamos un código QR a partir de una cadena\n    let code = QrCode::new("https://pythonlib.ru").unwrap();\n\n    // Renderizamos en caracteres Unicode\n    let image = code.render::<unicode::Dense1x2>()\n        .dark_color(unicode::Dense1x2::Dark)\n        .light_color(unicode::Dense1x2::Light)\n        .build();\n\n    println!("{}", image);\n}
\n\n

En este código:

\n
    \n
  • QrCode::new() — crea un código QR a partir de una cadena. Si la cadena es demasiado larga, el método devolverá un error; usa .unwrap() solo para ejemplos.
  • \n
  • render::<unicode::Dense1x2> — selecciona el renderizador Unicode. Muestra el código usando caracteres de pseudografía.
  • \n
  • dark_color y light_color — definen los caracteres para los módulos oscuros y claros.
  • \n
\n\n

Ejecuta el programa: en la terminal aparecerá un código QR que se puede escanear con el teléfono.

\n\n

Guardar el código QR en una imagen PNG

\n\n

Para proyectos reales, no se necesita texto, sino una imagen. La librería qrcode admite el renderizado en imágenes rasterizadas a través del crate image.

\n\n
use qrcode::QrCode;\nuse image::Luma;\n\nfn main() {\n    let code = QrCode::new("https://pythonlib.ru").unwrap();\n\n    // Renderizamos en una imagen (tamaño de módulo de 8 píxeles)\n    let image = code.render::<Luma<u8>>()\n        .min_dimensions(200, 200) // tamaño mínimo\n        .dark_color(Luma([0u8]))   // negro\n        .light_color(Luma([255u8])) // blanco\n        .build();\n\n    // Guardamos en un archivo\n    image.save("qrcode.png").unwrap();\n    println!("Código QR guardado en qrcode.png");\n}
\n\n

Aquí:

\n
    \n
  • Luma<u8> — tipo de píxel para imagen en blanco y negro.
  • \n
  • min_dimensions(200, 200) — define el ancho y alto mínimos. El código QR se escala automáticamente.
  • \n
  • dark_color y light_color — colores de los módulos (negro y blanco).
  • \n
\n\n

Después de ejecutar el programa, aparecerá un archivo qrcode.png en la raíz del proyecto.

\n\n

Personalización de color y tamaño

\n\n

Puedes cambiar los colores del código QR usando valores RGB. Por ejemplo, hagamos un código QR azul sobre fondo amarillo:

\n\n
use qrcode::QrCode;\nuse image::Rgb;\n\nfn main() {\n    let code = QrCode::new("https://pythonlib.ru").unwrap();\n\n    let image = code.render::<Rgb<u8>>()\n        .min_dimensions(300, 300)\n        .dark_color(Rgb([0, 100, 200]))   // azul                    

Recommendations