diff --git a/Cargo.toml b/Cargo.toml index 5d3bd2a..44c79c9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rxing" -version = "0.1.3" +version = "0.1.4" description="A rust port of the zxing barcode library." license="Apache-2.0" repository="https://github.com/hschimke/rxing" @@ -20,8 +20,8 @@ encoding = "0.2" rand = "0.8.5" urlencoding = "2.1.2" uriparse = "0.6.4" -chrono = "0.4" -chrono-tz = "0.4" +chrono = "0.4.23" +chrono-tz = "0.8" image = {version = "0.24", optional = true} imageproc = {version = "0.23.0", optional = true} unicode-segmentation = "1.10.0" diff --git a/README.md b/README.md index 6217f76..826290b 100644 --- a/README.md +++ b/README.md @@ -60,4 +60,7 @@ fn main() { println!("{} -> {}",result.getBarcodeFormat(), result.getText()) } } -``` \ No newline at end of file +``` + +## Latest Release Notes +v0.1.4 -> Dramatically improve performance for MultiFormatReader and for multiple barcode detection. \ No newline at end of file diff --git a/src/buffered_image_luminance_source.rs b/src/buffered_image_luminance_source.rs index c269a88..c2efa6b 100644 --- a/src/buffered_image_luminance_source.rs +++ b/src/buffered_image_luminance_source.rs @@ -221,14 +221,23 @@ impl LuminanceSource for BufferedImageLuminanceSource { width: usize, height: usize, ) -> Result, crate::exceptions::Exceptions> { - return Ok(Box::new(BufferedImageLuminanceSource::with_details( - self.image + // Ok(Box::new(BufferedImageLuminanceSource::with_details( + // self.image + // .crop_imm(left as u32, top as u32, width as u32, height as u32), + // self.left + left as u32, + // self.top + top as u32, + // width, + // height, + // ))) + Ok(Box::new(Self { + image: self + .image .crop_imm(left as u32, top as u32, width as u32, height as u32), - self.left + left as u32, - self.top + top as u32, width, height, - ))); + left: self.left + left as u32, + top: self.top + top as u32, + })) } fn isRotateSupported(&self) -> bool { @@ -238,9 +247,17 @@ impl LuminanceSource for BufferedImageLuminanceSource { fn rotateCounterClockwise( &self, ) -> Result, crate::exceptions::Exceptions> { - Ok(Box::new(BufferedImageLuminanceSource::new( - self.image.rotate270(), - ))) + // Ok(Box::new(BufferedImageLuminanceSource::new( + // self.image.rotate270(), + // ))) + let img = self.image.rotate270(); + Ok(Box::new(Self { + width: img.width() as usize, + height: img.height() as usize, + image: img, + left: 0, + top: 0, + })) } fn rotateCounterClockwise45( @@ -255,6 +272,13 @@ impl LuminanceSource for BufferedImageLuminanceSource { let new_img = DynamicImage::from(img); - Ok(Box::new(BufferedImageLuminanceSource::new(new_img))) + // Ok(Box::new(BufferedImageLuminanceSource::new(new_img))) + Ok(Box::new(Self { + width: new_img.width() as usize, + height: new_img.height() as usize, + image: new_img, + left: 0, + top: 0, + })) } } diff --git a/src/common/bit_array.rs b/src/common/bit_array.rs index 3834730..f478a72 100644 --- a/src/common/bit_array.rs +++ b/src/common/bit_array.rs @@ -196,11 +196,12 @@ impl BitArray { * Clears all bits (sets to false). */ pub fn clear(&mut self) { - let max = self.bits.len(); - for i in 0..max { - //for (int i = 0; i < max; i++) { - self.bits[i] = 0; - } + // let max = self.bits.len(); + // for i in 0..max { + // //for (int i = 0; i < max; i++) { + // self.bits[i] = 0; + // } + self.bits.fill(0); } /** diff --git a/src/common/bit_matrix.rs b/src/common/bit_matrix.rs index ce3de26..754a06e 100644 --- a/src/common/bit_matrix.rs +++ b/src/common/bit_matrix.rs @@ -212,6 +212,10 @@ impl BitMatrix { return Ok(((self.bits[offset] >> (x & 0x1f)) & 1) != 0); } + pub fn check_in_bounds(&self, x: u32, y: u32) -> bool { + (y as usize * self.row_size + (x as usize / 32)) > self.bits.len() + } + /** *

Sets the given bit to true.

* @@ -281,11 +285,12 @@ impl BitMatrix { * Clears all bits (sets to false). */ pub fn clear(&mut self) { - let max = self.bits.len(); - for i in 0..max { - //for (int i = 0; i < max; i++) { - self.bits[i] = 0; - } + // let max = self.bits.len(); + // for i in 0..max { + // //for (int i = 0; i < max; i++) { + // self.bits[i] = 0; + // } + self.bits.fill(0); } /** diff --git a/src/multi/qrcode/qr_code_multi_reader.rs b/src/multi/qrcode/qr_code_multi_reader.rs index 44c0522..ca9bfdb 100644 --- a/src/multi/qrcode/qr_code_multi_reader.rs +++ b/src/multi/qrcode/qr_code_multi_reader.rs @@ -49,8 +49,7 @@ impl MultipleBarcodeReader for QRCodeMultiReader { hints: &crate::DecodingHintDictionary, ) -> Result, crate::Exceptions> { let mut results = Vec::new(); - let detectorRXingResults = - MultiDetector::new(image.getBlackMatrix()).detectMulti(hints)?; + let detectorRXingResults = MultiDetector::new(image.getBlackMatrix()).detectMulti(hints)?; for detectorRXingResult in detectorRXingResults { let mut proc = || -> Result<(), Exceptions> { let decoderRXingResult = decoder::decoder::decode_bitmatrix_with_hints( diff --git a/src/pdf417/decoder/pdf_417_scanning_decoder.rs b/src/pdf417/decoder/pdf_417_scanning_decoder.rs index aeb0572..fc84fc0 100644 --- a/src/pdf417/decoder/pdf_417_scanning_decoder.rs +++ b/src/pdf417/decoder/pdf_417_scanning_decoder.rs @@ -817,7 +817,7 @@ fn adjustCodewordStartColumn( return codewordStartColumn; } correctedStartColumn = (correctedStartColumn as i32 + increment) as u32; - if let Err(_) = image.try_get(correctedStartColumn, imageRow) { + if image.check_in_bounds(correctedStartColumn, imageRow) { return 0; } } diff --git a/src/qrcode/detector/detector_test.rs b/src/qrcode/detector/detector_test.rs index 109fb10..d91a0b1 100644 --- a/src/qrcode/detector/detector_test.rs +++ b/src/qrcode/detector/detector_test.rs @@ -32,7 +32,7 @@ fn test_encode_decode(value: &str) { let byt_matrix = qr_code.getMatrix().as_ref().unwrap().clone(); // dbg!(BitMatrix::from(byt_matrix.clone()).to_string()); // let mut detector = Detector::new(make_larger(&byt_matrix.into(),5)); - let new_matrix : &BitMatrix = &byt_matrix.into(); + let new_matrix: &BitMatrix = &byt_matrix.into(); let mut detector = Detector::new(new_matrix); let detected_points = detector.detect().expect("must detect"); let decoded = decoder::decode_bitmatrix(detected_points.getBits()).expect("must decode");