一、前言
我们要用rust 生成二维码,但是rust 自带的库里面。没有手动设置白边的参数。遂有了下文
rust
use anyhow::{anyhow, Result};
use image::{DynamicImage, EncodableLayout, GenericImageView, ImageBuffer, Luma};
use qrcode::{EcLevel, QrCode, Version};
#[tokio::main]
pub async fn main() -> Result<()> {
// 生成二维码
const QUIET_ZONE_PIXELS: u32 = 8; // 留白像素
// 生成二维码
let qr_code = QrCode::new("fuckworld".as_bytes())?;
// 创建二维码裸图 不带白边
let qr_image = qr_code
.render::<image::Luma<u8>>()
.quiet_zone(false)
.build();
let qr_image = image::DynamicImage::ImageLuma8(qr_image);
let with_white_w = qr_image.width() + 2 * QUIET_ZONE_PIXELS;
let with_white_h = qr_image.height() + 2 * QUIET_ZONE_PIXELS;
// 手动创建一个画布
let mut padded = image::ImageBuffer::<image::Luma<u8>, Vec<u8>>::from_pixel(
with_white_w,
with_white_h,
image::Luma([255u8]),
);
image::imageops::replace(
&mut padded,
&qr_image.to_luma8(),
QUIET_ZONE_PIXELS as i64,
QUIET_ZONE_PIXELS as i64,
);
let (screen_width, screen_height) = (800, 1280);
// let (screen_width, screen_height) = (300, 1280);
// 根据屏幕大小调整
let min_len = screen_width.min(screen_height);
let width = (min_len * 5) / 16;
let padded_img = DynamicImage::ImageLuma8(padded);
// 调整大小
let qr_image = padded_img.resize_exact(
width + 30,
width + 30 ,
image::imageops::FilterType::Lanczos3,
);
let output_path = "device_qr.png";
qr_image
.save(output_path)
.map_err(|e| anyhow!("Failed to save QR image: {}", e))?;
Ok(())
}
bash
qrcode = "0.14.0"
image = { version = "0.25", features = ["png", "jpeg", "gif", "bmp"] }