1use std::fs;
2use image::{Luma};
3use qrcode::{QrCode};
4use qrcode::render::{svg};
5use image;
6
7pub 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
71pub 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}