Image Watermark Embedder
Add a visible copyright overlay and/or an invisible DWT+DCT frequency watermark to an image. Reports PSNR and checks your own image against JPEG, brightness, contrast and resize. Runs in your browser; the result is a PNG.
Try the demo instantly
Loads a 200×200 gradient PNG — no upload needed
Drop your image here or click to browse
PNG, JPEG, BMP, WebP · Max 50 MB
All processing runs locally — your image never leaves your device
Processed in your browser
Your image is decoded in this browser tab and is not sent to a StegoToolkit server. Basic usage analytics record coarse facts such as file type and size range, never the image or your text. The Embedder saves the watermarked result as a PNG. In our tests the invisible watermark was not recovered when images were kept at a smaller final size or cropped; other transformations may behave differently.
How to Add a Watermark to Your Photo (4 steps)
- Upload your photo (PNG, JPEG, BMP or WebP, up to 50 MB; 10 MB on phones). The result is saved as a PNG (PNG is lossless, but converting from another format can change the image representation).
- Enter your copyright notice (for example '© Your Name 2026', up to 100 characters). Turn the visible overlay and/or the invisible watermark on; both can be combined.
- Optional: choose the overlay position, opacity and size, and the invisible strength. Forensic mode adds a logo overlay, the robustness check and per-recipient copies.
- Click 'Protect My Image', then download the watermarked PNG. 'Verify Watermark is Present' opens the Detector with the same image type in mind.
Watermark Types & Methods
| Type | Technique | Survives | Best For |
|---|---|---|---|
| Visible — text | Your text drawn over the picture at a position you choose, with opacity, size, shadow and optional tiling | Anyone can crop, paint over or clone it out | A deterrent and attribution that people can see |
| Visible — tile | The same text repeated across the whole image | Harder to crop out; more intrusive | Stock-photo previews |
| Invisible — Light (≈47 dB) | Frequency-domain mark with the smallest quantization step (20) | Read back after JPEG q95–q60 in our tests (known length); the Detector flagged 16 of 16 at q75 and 11 of 16 at q60 | Photographs where quality matters most (Forensic mode only) |
| Invisible — Balanced (≈41 dB) | Step 36 | Detected and read back after JPEG q95–q60; not read in our tests once the image was kept at a smaller size or cropped | Default |
| Invisible — Archival (≈38 dB) / Maximum (≈35 dB) | Steps 52 and 68 | Same limits as Balanced with a stronger pattern and a larger change to the image | When you accept more change for a stronger pattern |
What a Watermark Does and Does Not Do
A visible watermark is text or a logo drawn on the picture. It deters casual reuse and shows who made the image, but anyone can crop, blur or paint over it. An invisible watermark stores the same text in the image's frequency data so a program can read it later. Neither creates copyright (in many jurisdictions it arises automatically for an eligible original work; laws vary), neither is a digital signature, and neither watermark by itself establishes legal ownership: the invisible mark has no key, so anyone with this tool, or a program that follows the same layout, could embed or read the same text.
The invisible watermark is built to survive JPEG re-encoding, not editing that moves pixels. In our tests the text was read back exactly after JPEG quality 95 down to 60 for every strength. In our tests it was not read when the image was resized to 90% and kept at that smaller size (0 of 16) or cropped (offsets of 1 to 13 pixels: 0 of 8). The likely reason is that the position of each bit depends on the image's block grid, which a change of dimensions moves; we did not test that explanation separately. Resizing and then returning to the original dimensions sometimes kept the text (exact 2× down and back: 8 of 8; bilinear 50%, 75% and 90% and back: 6 of 8 each), so the result depends on the resampling method. Rotation, perspective changes, screenshots and printing were not tested systematically and may prevent recovery.
How the Invisible Watermark Is Written
The image's brightness (the Y channel of YCbCr) goes through a one-level Haar wavelet transform. The low-frequency LL subband is cut into 8 × 8 blocks, and each block gets a 2-D discrete cosine transform. In every block the largest non-DC coefficient is moved to a quantization-index-modulation target: with step S, a coefficient c is replaced by (floor(c ÷ S) + 0.25) × S for a 0 bit and (floor(c ÷ S) + 0.75) × S for a 1 bit. S is 20, 36, 52 or 68 for Light, Balanced, Archival and Maximum. The blocks are transformed back to pixels.
Your text is converted to UTF-8 bytes and its bits are written in order, repeated over every block (block k carries bit number k mod (8 × L), where L is the text's length in bytes, so the bits repeat in a cycle). One copy of the text therefore occupies 8 × length blocks, and an 800 × 600 image has 1,850 blocks. Reading takes a majority vote over all copies of each bit, which is why the text can be recovered exactly even when some blocks are damaged. The text length and the strength are not stored in the image: the reader has to be told them or has to try all of them (see the Detector).
How Much Text Fits
The text can be up to 100 characters, and a smaller text gives more repeated copies. The Detector attempts a blind reading (without being told the length) only when each bit has at least 12 copies, a rule built into it, so the longest text it can read blind is the number of blocks ÷ 96 bytes, up to 128 bytes: 4 bytes in 400 × 300 pixels, 12 in 640 × 480, 19 in 800 × 600 and 83 in 1920 × 1080. The minimum is 12 because with 5 to 11 copies the blind reader sometimes returned a wrong text in our measurements, while with 12 or more it returned none in that set (it declined to read instead). That is a measured result on our test images, not a guarantee for every image or edit. A text that is longer than the blind limit is still embedded and can be read when its length is known, but the Detector will report that a pattern exists without showing the text, and exact recovery is not reliable with few copies. A text that does not fit even once (more bits than the image has blocks) is refused with the numbers instead of being cut off. The form shows, while you type, how many times the text is stored. Characters outside ASCII (© is 2 bytes) count by their UTF-8 length. Images smaller than 16 × 16 pixels cannot carry the invisible mark, and under 200 pixels the tool warns you.
Quality: What the Numbers Mean
PSNR and SSIM are computed between your original and the result. On the photograph crops we measured, the invisible mark alone gave about 47 dB (Light), 41 dB (Balanced), 38 dB (Archival) and 35 dB (Maximum). PSNR is computed over R, G and B and the SSIM shown is a simplified whole-image luminance version, not the usual windowed SSIM. Higher is a smaller change; neither number says whether the watermark would be noticed in a particular picture, so compare the previews. The visible overlay is included in the figure when it is on.
The Robustness Check
In Forensic mode you can switch on a check that runs after embedding and reports whether your exact text is read back after five changes to this image: JPEG at quality 80 and at 60 (encoded by your own browser, so another program's encoder may differ), brightness +20%, contrast +20% and a 50% resize and back. A change counts as survived only when the whole text is recovered exactly. The resize line scales by exactly 2 and back to the original size, a round trip that keeps the mark aligned, so it normally passes; it does not show that sharing a smaller copy is safe (a smaller copy lost the mark in every test). If your browser cannot encode JPEG in a worker, those two checks are shown as not run instead of being estimated. The check does not test any website or app.
Per-Recipient Copies and Batches
Forensic mode can make one copy per recipient: for each line of a recipient list (blank lines and exact duplicates are removed) an identifier is derived from your master key and the recipient with HKDF-SHA-256 (the first 16 hexadecimal characters of the output, which stand for 64 bits of key material), and that identifier is embedded as the invisible text. You receive a ZIP of the copies and a key file that maps identifiers to recipients; keep the key file, because the image alone cannot tell you who got it. The run is refused without a master key or recipients, with more than 200 recipients, or when the copies would need more than 800 MB of memory (width × height × 4 bytes per copy). Written as text, each identifier is 16 ASCII characters, that is 16 bytes or 128 embedded bits (twice the 64 bits of key material, because each hex character takes a whole byte), so the Detector can read it blind only when the image has at least 1536 blocks, for example 1850 blocks in 800 × 600 (14 copies) but only 1200 in 640 × 480; in a smaller image it can still flag the pattern, and you compare the leaked file against the IDs in the key file. Batch visible watermarking applies the same overlay to many images and returns a ZIP.
Invisible Watermark: Quality and Survival (our test)
The text '© Test Studio 2026' written into 16 crops of 800 × 600 cut from one photograph, then converted with the macOS system image tool (sips) and read with the strength and length known. 'Detector' is how many of the 16 the Detector flagged after the conversion (frequency pattern or a blind reading of the text). One photograph and one converter: an example, not a promise for other pictures, programs or websites.
| Strength | PSNR | Text read, PNG re-save | Text read (length known), JPEG q95 → q60 | Detector, JPEG q75 / q60 | Resized to 90%, kept smaller |
|---|---|---|---|---|---|
| Light (step 20) | 47.1 dB | 16 of 16 | 16 of 16 at every quality | 16 / 11 of 16 | 0 of 16 |
| Balanced (step 36) | 41.4 dB | 16 of 16 | 16 of 16 at every quality | 16 / 16 of 16 | 0 of 16 |
| Archival (step 52) | 37.8 dB | 16 of 16 | 16 of 16 at every quality | 16 / 16 of 16 | 0 of 16 |
| Maximum (step 68) | 35.3 dB | 16 of 16 | 16 of 16 at every quality | 16 / 16 of 16 | 0 of 16 |
Longest Text the Detector Can Read Without Being Told
Computed from the image size: 8 × 8 blocks of the half-size LL subband, at least 12 copies of every bit, at most 128 bytes.
| Image size | Blocks | Longest blind-readable text |
|---|---|---|
| 400 × 300 | 450 | 4 bytes |
| 640 × 480 | 1,200 | 12 bytes |
| 800 × 600 | 1,850 | 19 bytes |
| 1920 × 1080 | 8,040 | 83 bytes |
How Reliably the Text Is Read, by Copies per Bit (our test)
Texts of 4 to 80 bytes at all four strengths, written into 8 crops of 800 × 600 cut from one image and into the same crops with synthetic grain added (a stand-in for camera noise, then JPEG q92), and read back untouched and after JPEG q95, q75 and q60 (macOS sips). Each row counts the Detector's blind reader, which is given neither the strength nor the length. The Detector now requires 12 copies: the 1–4 row is never read, and the rows for 5–11 copies were measured with the earlier minimum of 5 to find out why it was raised. One image and one converter: an example, not a rate for all images.
| Copies of each bit | Readings | Exact text | Wrong text | Nothing read |
|---|---|---|---|---|
| 1–4 | 512 | 0 | 0 | 512 |
| 5–7 | 768 | 692 | 18 | 58 |
| 8–11 | 768 | 718 | 5 | 45 |
| 12–19 | 512 | 484 | 0 | 28 |
| 20–39 | 256 | 241 | 0 | 15 |
| 40 or more | 256 | 242 | 0 | 14 |
Examples
Input: An 800 × 600 photograph, text '© Test Studio 2026' (19 bytes), Balanced, invisible only
Result: The result is a PNG with a PSNR of about 41 dB. The Detector reads the text back exactly and rates the image HIGH.
Meaning: 19 bytes need 152 blocks per copy, so each bit is stored about 12 times and the vote recovers the text.
Input: The same watermarked PNG saved as a JPEG at quality 75, then checked
Result: The text is still read exactly and the Detector still flags it (16 of 16 crops in our test).
Meaning: JPEG changes pixel values slightly but keeps the 8 × 8 block grid the mark is written on.
Input: The same watermarked PNG resized to 90% and saved at that smaller size
Result: Nothing is read and the Detector finds no pattern (0 of 16).
Meaning: The smaller image did not preserve a recoverable pattern in our test; the changed block grid, which puts each bit in a different place, is a likely explanation. In our tests a crop behaved the same way.
Input: A 400 × 300 image and a 30-byte text
Result: The watermark is written, but the Detector reports a pattern without a readable text (only 450 blocks, about 2 copies of each bit, fewer than the 12 needed).
Meaning: Use a shorter text or a larger image if you want the Detector to show the text without being told its length.
How the Watermark Embedder Works
1. Decode your photo
The browser decodes the image in a Web Worker; the tool's own code does not upload it.
2. Write the invisible mark
Brightness → Haar wavelet → 8 × 8 DCT in the LL subband → quantization-index modulation of the largest coefficient in every block → back to pixels.
3. Draw the visible overlay
Text and/or a logo are drawn on top with your position, opacity and size.
4. Measure
PSNR and a simplified SSIM against your original, plus the optional robustness check.
5. Save
The result is saved as a PNG for download (PNG is lossless, but converting from another format can change the image representation).
What the results mean
| Result | What it means | What to do |
|---|---|---|
| PSNR above about 40 dB | A small change to the image | Compare the previews; the number does not predict visibility |
| Robustness: text read back exactly | Your whole text was recovered after that change to this image | That change is survivable; others were not tested |
| Robustness: N% of bits read back correctly | The text was damaged by that change | The watermark may not survive that change |
| Robustness: not run in this browser | The browser cannot encode JPEG in a worker | Use a browser that can, or check the JPEG yourself with the Detector |
| Warning: image under 200 px | Few blocks, so few copies of each bit | Use a larger image or a shorter text |
Limitations
- In our tests the invisible watermark was not recovered when the image was kept at a smaller final size (90%: 0 of 16) or cropped (crops of 1 to 13 pixels: 0 of 8), so expect to lose it in those cases. Resizing down and back to the original dimensions can give different results depending on the resampling method. Screenshots, rotation and printing were not tested systematically and may also prevent recovery. Other programs and individual websites or apps were not tested.
- There is no key and no encryption: the invisible text is stored as plain UTF-8 bits, so anyone can read it with this Detector or a program that follows the same layout, and anyone can embed the same text. It is not a signature and, by itself, does not establish ownership. The only secret is the master key of Forensic mode, which derives the recipient identifiers; the identifiers themselves are readable, and the Detector cannot check whether one came from your key.
- A visible overlay can be cropped, painted over or cloned out.
- The Detector can read the text without being told its length only with at least 12 copies per bit, which limits long texts in small images (see the table).
- PSNR and SSIM measure how much the pixels changed, not whether the change is visible or detectable. The figures on this page come from 16 crops of one photograph.
- Images with transparency are written through a browser canvas, which may alter colours in transparent areas; the output is always an opaque-or-transparent PNG, never a JPEG.
Privacy
Your image and text are processed in your browser, in a Web Worker, and are not sent to a StegoToolkit server by the tool's own code. The only things the tool keeps in your browser are your chosen mode (localStorage) and a flag that you dismissed the mobile tip (sessionStorage). Site analytics, if you accept them, may record coarse facts such as the strength you chose, the file type, a size range and timing — never the image, your watermark text or the file name. Per-recipient copies derive identifiers from a master key you type; it stays in the page and is not sent anywhere by the tool. The hosting provider's ordinary request logs still record your visit.
Which Tool Next?
- Image Watermark Detector — Check whether an image carries a watermark, and read the invisible text
- LSB Embedder — Hide a message in pixel values instead of a copyright mark
- Image Steganography Hider — Hide a secret message, not a watermark
Frequently Asked Questions
What is the difference between visible and invisible watermarks?
A visible watermark is text or a logo drawn on the picture: a deterrent anyone can crop or paint out. An invisible watermark stores your text in the image's frequency data so the Detector can read it later. Using both means that if the visible one is cropped away, the invisible one is still there — unless the image is also kept at a smaller size or cropped, which removed the invisible one in our tests.
Does the invisible watermark change image quality?
Slightly. On the photograph crops we measured, PSNR against the original was about 47 dB (Light), 41 dB (Balanced), 38 dB (Archival) and 35 dB (Maximum). PSNR is a measure of how far the pixels moved, not of visibility, so compare the original and result previews; the visible overlay is included in the figure when it is on.
Will the invisible watermark survive Instagram or Twitter?
We have not tested any website or app. In our tests the text was read back exactly after JPEG re-encoding from quality 95 down to 60 with every strength, but never when the image kept a smaller size or was cropped, and services often resize images as well as re-encode them. Treat it as likely to be lost when an image is resized to a smaller final size.
How does the robustness check work?
After embedding, it applies five changes to the result and tries to read your exact text back: JPEG quality 80 and 60 (your browser's encoder), brightness +20%, contrast +20% and a 50% resize and back. A change counts as survived only when the whole text is recovered; otherwise it shows the percentage of bits that were read correctly. If your browser cannot encode JPEG in a worker, those two lines say not run.
What is the DWT+DCT algorithm?
The brightness channel goes through a one-level Haar wavelet transform. The low-frequency LL subband is split into 8 × 8 blocks, each block gets a DCT, and in every block the largest non-DC coefficient is moved to a quantization-index-modulation target that encodes one bit (steps 20, 36, 52 or 68). The text's bits are repeated over all blocks and read back by majority vote. JPEG also works on 8 × 8 DCT blocks, which is why moderate JPEG leaves the mark readable while a smaller copy or a crop, which moves the block grid, removes it.
Does this prove I own the image?
No. The invisible mark has no key and no signature, so it cannot prove who embedded it, and anyone can read it. It can support a claim alongside the original file, timestamps and your records, but it is not legal proof and this page is not legal advice.
Is my image uploaded to any server?
The tool's own code does not upload your image: embedding, the robustness check and batch processing run in your browser in a Web Worker. Accepted analytics may record coarse option choices, file type, size range and timing, but never the image, your watermark text or the file name, and your host's ordinary request logs still see the page visit.
How do I add an invisible watermark to an image?
Upload the image, type your copyright text, leave the invisible watermark switched on and click Protect My Image. The text is written into the image's frequency data (the 8 × 8 blocks of a wavelet-reduced brightness channel) and you download a PNG. You can check it with the Image Watermark Detector. It survived JPEG re-encoding in our tests, but not a smaller final size or a crop.
Can I encrypt the watermark with a password?
No, and there is no password field. A watermark is meant to be readable, so the text is stored as plain bits that anyone can read with the Detector. If you need a secret, the per-recipient copies in Forensic mode derive each recipient's identifier from a master key you keep.
Related Tools
Image Watermark Detector
Check an image for a visible overlay, an LSB statistic, an invisible DWT+DCT watermark (and read its text), EXIF/XMP/IPTC copyright fields and AI-provenance metadata (C2PA, DigitalSourceType). Runs in your browser.
Steganography Capacity Calculator
Calculate exact hidden-payload capacity for PNG, BMP, WebP, WAV, FLAC, AIFF and more — plus PSNR and detection risk, all client-side. Links to the right specialist hider/extractor for your file type.
Text-in-Image Hider
Hide secret text inside an image with Sequential, Seeded Scatter or Adaptive Edge LSB. Shows PSNR and SSIM after encoding, optional AES-256 password, and always saves a PNG.
Text-in-Image Extractor
Extract hidden text from images. Auto-Detect tries 11 common LSB settings; manual mode, bit plane viewer, chi-square pre-scan, CTF flag detection and an optional AES-256 password.