【rust】生成带白边的标准二维码

一、前言

我们要用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"] }
相关推荐
夏幻灵3 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码3 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
苍何3 小时前
开源微信流 Windows,微信聊天记录,可以直接给 Codex 和 Obsidan 了
后端
bkspiderx4 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
代码什么用5 小时前
Spring基础使用
java·后端·spring
程序员老陆5 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光5 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
明月_清风5 小时前
Deno 终局来了:从挑战 Node 到被 Cloudflare 收编
前端·后端·node.js
码云数智-园园5 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
蜗牛互联网5 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端