1 use crate::decode::decode::codestream_ecc; 2 use crate::decode::decode::decode_payload; 3 use crate::decode::decode::read_data; 4 use crate::decode::decode::read_format; 5 use crate::decode::BitGrid; 6 use bmp_monochrome::BmpError; 7 use std::io::Cursor; 8 9 impl BitGrid for &bmp_monochrome::Bmp { size(&self) -> usize10 fn size(&self) -> usize { 11 self.width() as usize 12 } 13 bit(&self, y: usize, x: usize) -> bool14 fn bit(&self, y: usize, x: usize) -> bool { 15 self.get(y as u16, x as u16) 16 } 17 } 18 19 /// Allows to decode the QR coded in a bmp file 20 pub trait BmpDecode { 21 /// Allows to decode the QR coded in a bmp file decode(&self) -> Result<Vec<u8>, BmpError>22 fn decode(&self) -> Result<Vec<u8>, BmpError>; 23 } 24 25 impl BmpDecode for bmp_monochrome::Bmp { decode(&self) -> Result<Vec<u8>, BmpError>26 fn decode(&self) -> Result<Vec<u8>, BmpError> { 27 let meta = read_format(&self).unwrap(); 28 let raw = read_data(&self, &meta); 29 let stream = codestream_ecc(&meta, raw).unwrap(); 30 let mut writer = Cursor::new(vec![]); 31 decode_payload(&meta, stream, &mut writer).unwrap(); 32 Ok(writer.into_inner()) 33 } 34 } 35 36 #[cfg(test)] 37 mod tests { 38 use crate::decode::decode::{ 39 codestream_ecc, decode_payload, read_data, read_format, MetaData, Version, 40 }; 41 use crate::decode::BitGrid; 42 use bmp_monochrome::Bmp; 43 use std::fs::File; 44 use std::io::Cursor; 45 46 #[test] test_decode()47 fn test_decode() { 48 let bmp = &Bmp::read(File::open("test_data/test.bmp").unwrap()).unwrap(); 49 let meta = read_format(&bmp).unwrap(); 50 let expected = MetaData { 51 version: Version(1), 52 ecc_level: 0, 53 mask: 2, 54 }; 55 assert_eq!(&expected, &meta); 56 57 let raw = read_data(&bmp, &meta); 58 let stream = codestream_ecc(&meta, raw).unwrap(); 59 let mut writer = Cursor::new(vec![]); 60 decode_payload(&meta, stream, &mut writer).unwrap(); 61 let out = String::from_utf8(writer.into_inner()).unwrap(); 62 assert_eq!("Hello", &out); 63 } 64 65 #[test] test_grid()66 fn test_grid() { 67 let expected = r#" 68 #######..####.####### 69 #.....#.....#.#.....# 70 #.###.#.#.#.#.#.###.# 71 #.###.#.#.#...#.###.# 72 #.###.#.##..#.#.###.# 73 #.....#.##.#..#.....# 74 #######.#.#.#.####### 75 ........#.#.......... 76 #.#####..#.#..#####.. 77 ...#....#..####..##.# 78 ..#####..##.#.##.###. 79 ..#..#.##.#####..##.. 80 .###..#####.#..#....# 81 ........#...#..#.#... 82 #######..#.#.#..#.##. 83 #.....#.#.#....#####. 84 #.###.#.#..#.#..#..#. 85 #.###.#.##.#####.#... 86 #.###.#.##..#.##..#.. 87 #.....#..#.####.###.. 88 #######.##..#...#..#. 89 "#; 90 let mut chars = expected.chars(); 91 let bmp = &Bmp::read(File::open("test_data/test.bmp").unwrap()).unwrap(); 92 for i in 0..bmp.size() { 93 for j in 0..bmp.size() { 94 let mut char = chars.next().unwrap(); 95 if char == '\n' { 96 char = chars.next().unwrap(); 97 } 98 assert_eq!(char == '#', bmp.bit(i, j)); 99 } 100 } 101 } 102 } 103