diff --git a/app/src/main/rust/src/image/qr_code.rs b/app/src/main/rust/src/image/qr_code.rs index 87e0bbb28..55536fb17 100644 --- a/app/src/main/rust/src/image/qr_code.rs +++ b/app/src/main/rust/src/image/qr_code.rs @@ -4,7 +4,7 @@ use bardecoder::decode::Decode; use bardecoder::default_builder; use bardecoder::extract::QRExtractor; use bardecoder::util::qr::{QRData, QRError}; -use image::ImageBuffer; +use image::{GenericImageView, ImageBuffer, Rgba}; use jni::objects::JClass; use jni::sys::{jboolean, jobject}; use jni::JNIEnv; @@ -20,6 +20,15 @@ impl Decode for Nothing { } } +fn detect_image_ad(image: &D) -> bool +where + D: GenericImageView>, +{ + let mut decoder = default_builder(); + decoder.qr(Box::new(QRExtractor {}), Box::new(Nothing {})); + decoder.build().decode(image).iter().any(|i| i.is_ok()) +} + #[no_mangle] #[allow(non_snake_case)] #[jni_fn("com.hippo.ehviewer.image.ImageKt")] @@ -30,12 +39,9 @@ pub fn hasQrCode(mut env: JNIEnv, _class: JClass, object: jobject) -> jboolean { let (width, height) = (bitmap_info.width(), bitmap_info.height()); let ptr = handle.lock_pixels()? as *const u8; let buffer = unsafe { &*slice_from_raw_parts(ptr, (width * height * 4) as usize) }; - let mut decoder = default_builder(); - decoder.qr(Box::new(QRExtractor {}), Box::new(Nothing {})); let image = ImageBuffer::from_raw(width, height, buffer); - let result = image.map(|img| decoder.build().decode(&img)); + let result = image.map(|img| detect_image_ad(&img)); handle.unlock_pixels()?; - let vec = result.ok_or(anyhow!("Internal Error!"))?; - Ok(vec.iter().any(|i| i.is_ok()) as jboolean) + Ok(result.ok_or(anyhow!("Internal Error!"))? as jboolean) }) }