feat: works better

This commit is contained in:
2022-07-03 22:54:11 +08:00
parent 4359817513
commit e0b2b59858
8 changed files with 401 additions and 170 deletions

View File

@@ -14,6 +14,8 @@ opt-level = "z"
[dependencies]
wasm-bindgen = "=0.2.81"
bardecoder = "0.3.0"
image = "0.23"
rqrr = "0.5"
image = "0.24"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

View File

@@ -1,21 +1,58 @@
use serde::{Deserialize, Serialize};
use wasm_bindgen::prelude::*;
#[derive(Clone, Debug, Serialize, Deserialize)]
struct Response {
error_message: Option<String>,
qr_results: Option<Vec<QrResult>>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
struct QrResult {
qr: Option<Qr>,
error_message: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
struct Qr {
version: usize,
ecc_level: u16,
mask: u16,
content: String,
}
#[wasm_bindgen]
pub fn decode_qr(image_bytes: &[u8]) -> String {
let img = match image::load_from_memory(image_bytes) {
Ok(img) => img,
Err(e) => return format!("ERROR:{}", e),
Ok(img) => img.to_luma8(),
Err(e) => return serde_json::to_string(
&Response { qr_results: None, error_message: Some(format!("Parse image error: {}", e)) }
).unwrap(),
};
let decoder = bardecoder::default_decoder();
let results = decoder.decode(&img);
let mut img = rqrr::PreparedImage::prepare(img);
let grids = img.detect_grids();
let mut r = vec![];
for result in results {
match result {
Ok(s) => r.push(vec![s, "".to_string()]),
Err(e) => r.push(vec!["".to_string(), format!("error: {}", e)]),
let mut qr_results = vec![];
for grid in grids {
match grid.decode() {
Err(e) => {
qr_results.push(QrResult { qr: None, error_message: Some(format!("Parse qr error: {}", e)) })
}
Ok((meta, content)) => {
qr_results.push(QrResult {
qr: Some(Qr {
version: meta.version.0,
ecc_level: meta.ecc_level,
mask: meta.mask,
content,
}),
error_message: None,
})
}
}
}
format!("{:?}", r)
serde_json::to_string(
&Response { qr_results: Some(qr_results), error_message: None }
).unwrap()
}