br_code/
qrcode.rs

1use std::fs;
2use image::{Luma};
3use qrcode::{QrCode};
4use qrcode::render::{svg};
5use image;
6
7/// 生成 svg 二维码
8pub fn qrcode_create(text: &str, mode: &str, filename: &str) -> bool {
9    let code = QrCode::new(text).unwrap();
10    match mode {
11        "svg" => {
12            let string = code.render()
13                .min_dimensions(200, 200)
14                .dark_color(svg::Color("#000000"))
15                .light_color(svg::Color("#ffffff"))
16                .build();
17            fs::write(filename, string).is_ok()
18        }
19        "png" => {
20            let image = code.render::<Luma<u8>>()
21                .min_dimensions(200, 200)
22                .build();
23            match image.save(filename) {
24                Ok(()) => true,
25                Err(_) => false
26            }
27        }
28        _ => {
29            let image = code.render::<Luma<u8>>()
30                .min_dimensions(200, 200)
31                .build();
32            match image.save(filename) {
33                Ok(()) => true,
34                Err(_) => false
35            }
36        }
37    }
38}
39
40pub fn qrcode_read(filename: &str) -> Vec<String> {
41    let mut qrcode = vec![];
42
43    let img = image::open(filename);
44    let img_gray = match img {
45        Ok(e) => e.into_luma8(),
46        Err(_) => {
47            return qrcode;
48        }
49    };
50
51    let mut decoder = quircs::Quirc::default();
52    let codes = decoder.identify(img_gray.width() as usize, img_gray.height() as usize, &img_gray);
53    for code in codes {
54        let code = match code {
55            Ok(e) => e,
56            Err(_) => {
57                return qrcode;
58            }
59        };
60        let decoded = match code.decode() {
61            Ok(e) => e,
62            Err(_) => {
63                return qrcode;
64            }
65        };
66        qrcode.push(std::str::from_utf8(&decoded.payload.clone()).unwrap().to_string());
67    }
68    qrcode
69}
70
71/// 生成 svg 二维码
72pub fn create_qrcode(code: &str) -> String {
73    let code = QrCode::new(code).unwrap();
74    let string = code.render()
75        .min_dimensions(200, 200)
76        .dark_color(svg::Color("#000000"))
77        .light_color(svg::Color("#ffffff"))
78        .build();
79    string.replace("width=\"203\"", "width=\"100%\"").replace("height=\"203\"", "height=\"100%\"")
80}