Stegstr
Stegstr writes with one method by default and reads with all of them, verifying the result. Here is what each does and what it costs.
Both the sender and the receiver resample the image's luminance onto a fixed canonical grid before touching it. A messaging app's rescale is therefore undone by the receiver's own normalisation, which is why this method survives resizing when a fixed 8×8 block grid does not. Each bit is spread across many mid-frequency coefficients, the embedding strength is calibrated per photo, and the encoder reads its own output back before saving. Three payload modes trade capacity for robustness: locator (48 bytes), standard (163 bytes), bulk (about 1.2 kilobytes, for lossless channels only). Measured on the contest gauntlet with the encoder not told which channel it would face: 100% on two of three covers and 80% on a busy document-like cover. Contributed by Saif from contest entry #71.
Quantization-index modulation in the JPEG frequency domain, from the winning entry #108. It survives recompression well and pre-sizes the cover to the width a chosen platform delivers, so that platform does not resize it again. If the image is later resized to a different size, the grid misaligns and the payload is lost.
The original method. Largest capacity and an exact round trip, but only through channels that do not recompress: sending as a file, email, a shared drive. Kept so every image ever made by Stegstr still opens.
Detect tries the methods in order, Robust then QIM then Dot, and only accepts a result that passes that method's own verification. The reader never needs to know which version made the image.
Before any bytes go into an image, the payload is encrypted with AES-256-GCM. "Open" images can be read by any Stegstr user; "Recipients" images are additionally sealed to specific public keys, so only those recipients can decrypt. Direct messages are always encrypted to the recipient.