loading webassembly…
Invisible, robust watermarks woven into the DWT-DCT-SVD frequency domain of an image — survives re-saving, recoverable with nothing but the image and a secret. Everything below runs entirely in your browser through WebAssembly. No upload, no server.
Tip — embed a message, hit download, then drag the saved file back in and decode it to prove the watermark survives the round-trip.
The luminance channel is wavelet-transformed; each block's largest singular value is quantized to carry one bit — imperceptible to the eye.
A header (magic + length + CRC-16) is embedded with the payload, so decoding needs only the image — no bit length to remember.
Recovery needs no original image. Redundant, scrambled placement keeps the mark alive through PNG re-saves and moderate JPEG.
// npm i blind-watermark-wasm
import { BlindWatermark } from 'blind-watermark-wasm';
const bwm = new BlindWatermark();
const marked = await bwm.embed(imageBytes, '© 2026'); // text or Uint8Array
const result = await bwm.extract(marked); // no length needed
if (result?.valid) console.log(result.text); // → '© 2026'