相机水印
Make your AI images look shot on a real camera
- image
- IMAGE
The name is a lot of what it does: this is the node that slaps a camera-style watermark and frame onto an image. If you've ever seen a photo post captioned with "shot on iPhone" or carrying a little red Leica dot and thought "I want that look on my generations," this is the tool. It's a pure post-processing node - one image in, one framed image out, no model download, no GPU cost, runs in milliseconds on CPU.
Why would you reach for it? In the photorealism playbook, the last mile of "this looks real" is presentation. The KB's realism notes point out that AI images carry tells - no EXIF, wrong aspect ratios - and that adding plausible camera details is part of a convincing workflow. The watermark frame is the same idea, aimed at the phone-photography aesthetic that dominates social feeds: a white bottom bar, a camera model line, a settings line like 24mm | f/1.8 | 1/125s | ISO 50. It reads as "captured," not "generated."
How it works
Under the hood it's PIL drawing, nothing fancier. The node converts your IMAGE tensor to a PIL image, then depending on the chosen layout either extends the canvas with a colored bar (bottom, top-and-bottom, or right side) or overlays text inside the frame. It renders two text blocks - block A (camera model, lens, copyright line) and block B (brand, settings, timestamp) - plus a logo pasted in with its transparent border auto-cropped. Worth knowing: everything scales down proportionally for images narrower than 1200px wide, so a small generation doesn't end up with a giant chunky bar on it.
Inputs and outputs that matter
- image - the thing you're framing.
- layout - ten dropdown choices, all labeled in Chinese: bottom-bar left/right or centered, right-side vertical, top-and-bottom, in-frame overlay in each corner and center, and a standalone info bar. The first two are the classic "shot on phone" look.
- block_a_text_1/2/3 and block_b_text_1/2/3 - the text blocks. Defaults are
iPhone 15 Pro Max/Main Camera/© KARASandSONY/24mm | f/1.8 | 1/125s | ISO 50. Just type over them. - logo - 124 bundled choices pulled from the pack's
logosfolder: leica, hasselblad, zeiss, canon, fujifilm, dji, plus a stack of car badges. Add your own transparent-background.pngthere and it appears in the list after a restart. - use_exif - on by default. If a valid
exif_datastring is wired in (see the companion node), it overwrites your typed text with real camera settings. If nothing's wired, it quietly uses your typed text. - restore_preset - a boolean that acts like a button: flip it true, queue once, and the selected layout's recommended settings snap back. Handy after you've fiddled things into a mess.
- randomize_style + random_style_selection + seed - picks a random layout for you;
random_style_selectiontakes ranges like1-5, 8. The winner prints to the console; the dropdown won't reflect it.
Everything else - bar_size, padding, spacing, font_size_large/medium/small, bg_color, title_color, subtitle_color, logo_size_ratio - is styling. One trap: bar_width and bar_height only do anything on layout 10 (the standalone info bar). Everywhere else, bar thickness comes from bar_size. That's the kind of thing that makes you think the node is broken when it isn't.
The single output is an IMAGE, so it drops straight into a Save Image node.
Installing it
Easiest route is ComfyUI Manager: search "ComfyUI Camera Watermark" and hit install. Manual install is the usual:
cd ComfyUI/custom_nodes
git clone https://github.com/karas17/ComfyUI-Camera-Watermark
Then restart ComfyUI. The pack's only real dependency is piexif (Manager installs it for you). If you cloned by hand, don't skip this - the README forgets to mention it:
cd ComfyUI/custom_nodes/ComfyUI-Camera-Watermark
pip install -r requirements.txt
Gotchas
- use_exif overwrites your text. When EXIF is active, block A's third line is hardcoded to
© KARAS- there's no input to change it. If you want your own copyright line, leaveuse_exifoff. - The bundled fonts are Alibaba PuHuiTi, a Chinese-first typeface. Fine for the defaults, but drop your own
.ttf/.otfinto thefontsfolder for Latin text with more personality. - It's a tiny pack - no real community discussion, a bilingual (Chinese-first) README, defaults aimed at Chinese-market phone brands. Expect to figure some things out yourself.
Troubleshooting
The most common failure is nothing rendering where you expect it. Check layout first - if you're editing bar_width expecting a bottom bar, you're on the wrong knob. If text is missing, the fonts failed to load (the console warns and falls back to a default). If piexif is missing you'll see an ImportError - that's the manual-install dependency gap above. And the dropdown labels are in Chinese: layouts 1–2 are the bottom bars, 5–9 the in-frame overlays.
Inputs (29)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| layout | COMBO | 10 options: 1. 底部留白 - 左右分布, 2. 底部留白 - 居中, 3. 右侧留白 - 上下竖排, 4. 顶部 & 底部留白, 5. 画内叠加 - 左下角, 6. 画内叠加 - 右下角, +4 | |
| restore_preset | BOOLEAN | false | — |
| randomize_style | BOOLEAN | false | — |
| random_style_selection | STRING | 1-10 | — |
| seed | INT | 00–18446744073709550000 | — |
| use_exif | BOOLEAN | true | — |
| block_a_text_1 | STRING | iPhone 15 Pro Max | — |
| block_a_text_2 | STRING | Main Camera | — |
| block_a_text_3 | STRING | © KARAS | — |
| block_b_text_1 | STRING | SONY | — |
| block_b_text_2 | STRING | 24mm | f/1.8 | 1/125s | ISO 50 | — |
| block_b_text_3 | STRING | — | |
| logo | COMBO | leica | 124 options: None, Dodge, Faraday%20Future, Ferrari, Fiat, Ford, +118 |
| logo_size_ratio | FLOAT | 1.00.1–3 | — |
| bar_size | INT | 2000–2048 | — |
| bar_width | INT | 189464–8192 | — |
| bar_height | INT | 16564–8192 | — |
| padding | INT | 500–400 | — |
| spacing | INT | 150–200 | — |
| font_name | COMBO | 2 options: Alibaba-PuHuiTi-Bold.ttf, Alibaba-PuHuiTi-Medium.ttf | |
| font_bold_name | COMBO | 1 options: Alibaba-PuHuiTi-Bold.ttf | |
| font_size_large | INT | 488–200 | — |
| font_size_medium | INT | 288–200 | — |
| font_size_small | INT | 248–200 | — |
| bg_color | STRING | #FFFFFF | — |
| title_color | STRING | #000000 | — |
| subtitle_color | STRING | #888888 | — |
| exif_dataopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |