#[path = "support.rs"]
mod support;
use image::{ImageBuffer, Rgba};
use qrc::{add_image_watermark, QRCode};
fn main() {
support::header("qrc -- watermark");
let qr = QRCode::from_string("https://example.com/product/42".to_string());
support::with_temp_dir("watermark", |dir| {
let logo = support::task("Create a 20x20 brand logo (red square)", || {
ImageBuffer::from_fn(20, 20, |x, y| {
if !(2..18).contains(&x) || !(2..18).contains(&y) {
Rgba([255, 255, 255, 255])
} else {
Rgba([220, 20, 60, 255]) }
})
});
support::task_with_output("Apply watermark via QRCode::add_image_watermark", || {
let mut img = qr.to_png(256);
QRCode::add_image_watermark(&mut img, &logo);
let (w, h) = img.dimensions();
img.save(dir.join("watermarked_method.png")).unwrap();
vec![
format!("QR size: {}x{} px", w, h),
format!("Logo size: 20x20 px"),
format!("Position: Bottom-right corner (alpha blended)"),
]
});
support::task_with_output("Apply watermark via add_image_watermark! macro", || {
let mut img = qr.to_png(256);
add_image_watermark!(&mut img, &logo);
img.save(dir.join("watermarked_macro.png")).unwrap();
vec![
format!("Macro: add_image_watermark!(&mut img, &logo)"),
format!("Result: Identical to method call"),
]
});
support::task_with_output("Larger logo on 512px QR code", || {
let big_logo = ImageBuffer::from_fn(40, 40, |_, _| Rgba([0, 102, 204, 200]));
let mut img = qr.to_png(512);
QRCode::add_image_watermark(&mut img, &big_logo);
img.save(dir.join("watermarked_large.png")).unwrap();
vec![
format!("QR size: 512x512 px"),
format!("Logo size: 40x40 px"),
format!("Tip: Keep logo < 10%% of QR area for scannability"),
]
});
});
support::summary(4);
}