Генератор QR-кодов на Rust: библиотека qr_code
QR-коды стали неотъемлемой частью современного веба и мобильных приложений. Они используются для быстрого обмена ссылками, контактами, платежными данными и другой информацией. Если вы разрабатываете на Rust и хотите добавить в свой проект генерацию QR-кодов, библиотека qr_code — одно из лучших решений. В этой статье мы подробно разберем, как установить, настроить и использовать эту библиотеку для создания QR-кодов прямо в коде на Rust.
Что такое библиотека qr_code?
qr_code — это чистая Rust-библиотека для генерации QR-кодов (версия 2) без внешних зависимостей. Она позволяет создавать QR-коды из строковых данных, настраивать уровень коррекции ошибок, размер модуля и цвет. Библиотека поддерживает вывод в формате SVG, PNG (через image) и в виде ASCII-графики для терминала. Основные преимущества:
- Высокая производительность (Rust без GC).
- Минимальное потребление памяти.
- Поддержка всех четырех уровней коррекции ошибок (L, M, Q, H).
- Гибкая настройка внешнего вида QR-кода.
Установка
Добавьте зависимость в ваш Cargo.toml:
[dependencies]
qr_code = "0.2.0"
Если вам нужен вывод в PNG, дополнительно установите крейт image:
image = "0.24"
После этого выполните cargo build, чтобы скачать и скомпилировать библиотеку.
Базовый пример: генерация QR-кода в SVG
Самый простой способ получить QR-код — сохранить его в векторном формате SVG. Ниже приведен минимальный рабочий пример:
use qr_code::QrCode;
fn main() {
// Создаем QR-код из строки
let code = QrCode::new("https://pythonlib.ru").unwrap();
// Генерируем SVG-строку с размером модуля 8 пикселей
let svg = code.to_svg().with_width(8).to_string();
// Сохраняем в файл
std::fs::write("qrcode.svg", svg).unwrap();
println!("QR-код сохранен в qrcode.svg");
}
После запуска вы получите файл qrcode.svg, который можно открыть в браузере или вставить в HTML-страницу.
Настройка уровня коррекции ошибок
Уровень коррекции определяет, насколько сильно QR-код может быть поврежден, но при этом оставаться читаемым. Библиотека поддерживает четыре уровня:
ErrorCorrection::Low— 7% данных могут быть восстановлены.ErrorCorrection::Medium— 15%.ErrorCorrection::Quartile— 25%.ErrorCorrection::High— 30%.
Пример использования:
use qr_code::{QrCode, ErrorCorrection};
let code = QrCode::with_error_correction(
"Секретный код",
ErrorCorrection::High
).unwrap();
let svg = code.to_svg().with_width(10).to_string();
std::fs::write("secret_qr.svg", svg).unwrap();
Генерация QR-кода в PNG (растровое изображение)
Для вывода в PNG потребуется крейт image. Сначала добавьте его в Cargo.toml, затем используйте следующий код:
use qr_code::QrCode;
use image::{Luma, ImageBuffer};
fn main() {
let code = QrCode::new("Rust is awesome!").unwrap();
// Создаем изображение: каждый модуль = 10 пикселей
let size = code.width() * 10;
let mut img = ImageBuffer::new(size as u32, size as u32);
// Заливаем белым фоном
for pixel in img.pixels_mut() {
*pixel = Luma([255u8]);
}
// Рисуем черные модули
for y in 0..code.width() {
for x in 0..code.width() {
if code[(x, y)] {
let px = x as u32 * 10;
let py = y as u32 * 10;
for dy in 0..10 {
for dx in 0..10 {
img.put_pixel(px + dx, py + dy, Luma([0u8]));
}
}
}
}
}
img.save("qrcode.png").unwrap();
println!("PNG сохранен!");
}
Настройка цвета и размера модуля
При генерации SVG можно из