# Image Overlay

> Place up to 12 layers, such as logos, text, QR codes and shapes, on an image, pixel-exactly, with a live preview. Export for many platforms in one run.

Source: https://nodaro.ai/docs/nodes/image/image-overlay

The **Image Overlay** node places layers on top of a base image, exactly where you put them. A layer can be a picture, such as a logo or a cut-out, real text in a bundled font, a QR code or a flat shape. Nothing is redrawn by AI, so a brand asset comes out as the file you gave it. Use the node for watermarks, logos, headlines, price badges and banners sized for each platform.

- Found in: Image › Edit & Retouch
- Output: image
- API type: `image-overlay`

## When to use it
- Watermark or brand every generated image before you publish it.
- Build YouTube, LinkedIn or X banners and video covers with your real logo file on an AI-generated background.
- Place a cut-out from [Remove Background](https://nodaro.ai/docs/nodes/image/remove-background) on a new backdrop, with a shadow.
- Add a badge or a sticker, such as "NEW", a price tag or a rating, to product shots.
- Put a QR code on a flyer, or one code per product in a batch.
- Compose before-and-after cards or comparison cards from two results.

## Quick start
### Add the node

Press Tab on the canvas and choose **Image › Edit & Retouch › Image Overlay**.

### Connect the base image

Drag from the background image, for example a [Generate Image](https://nodaro.ai/docs/nodes/image/generate-image) result, to the **Base** input. The node now shows a live preview.

### Add layers

Wire a picture, such as an [Upload Image](https://nodaro.ai/docs/nodes/image/upload-image) node with your logo, into **Layer 1**. For text, a QR code or a shape, click **Text**, **QR** or **Shape** instead. These layers need no wire.

### Place the layers

Drag a layer in the preview to move it, pull its corner handle to resize it, and pull its top handle to rotate it. You can also type exact values in the settings panel, or start from a **Preset**.

### Run it

The preview is live, but the file is made only when you run. Click **Run** on the node.

Workflow: The real logo file is placed on a generated image; the main output goes to Instagram and the X header render goes to X in the same run.

- Generate Image → Image Overlay (base)
- Upload Image → Image Overlay (layer 1)
- Image Overlay → Instagram Post (image)
- Image Overlay → X Post (X header)

## Inputs
| Input | Accepts | What it does |
| --- | --- | --- |
| **Base** | Image nodes, or a List of image URLs | The image everything is placed on. Required. With a List, the node runs once per image with the same layers. |
| **Layer 1** to **Layer 12** | Image nodes, such as Upload Image, Remove Background and Generate Image | One picture per layer: a logo, a cut-out, a sticker. Text, QR and shape layers need no wire. |
| **QR link** | Text nodes, such as Text, or a List column | Appears only when a QR layer takes its link from the workflow. With a List column, you get one code per row. |

The node shows 4 layer inputs at first. Use **+ Layer** and **− Layer** to show from 1 to 12, and the count also grows when you wire a higher layer. Every run needs at least one layer: a wired picture, or a text, QR or shape layer.

| Output | What it carries |
| --- | --- |
| **Image** | The composite, as a PNG by default. It keeps the pixel size of the base image unless you set a platform size or a custom output size. |
| **Mask** | A black-and-white image of the same size. White marks the area an AI edit may change. See [Mask output](#mask-output). |
| One output per platform | For each platform ticked under **Export also for**, an output with that platform's render, such as X header. |

## Place a layer

Every layer attaches to the base image at an anchor, and every distance is a percentage of the base image.

| Setting | What it does |
| --- | --- |
| **Anchor** | One of nine points on the base: top-left, top, top-right, left, center, right, bottom-left, bottom or bottom-right. The default is center. |
| **Offset X** and **Offset Y** | The distance from the anchor, from -100 to 100, in percent of the base width and height. On a right or bottom anchor, a negative offset moves the layer inward. |
| **Width** | The layer width in percent of the base width, from 1 to 100. The default is 25. The height follows the layer's own shape. |
| **Height (% of base, optional)** | A fixed height in percent of the base height. When it is set, **Fit (when height is set)** decides how the layer fills the box: **Contain**, **Cover** or **Stretch**. |
| **Opacity** | From 0 to 100%. The default is 100%. |
| **Rotation** | From -180 to 180 degrees, around the layer's own center. |
| **Blend** | **Normal**, **Multiply** or **Screen**. |
| **Rounded corners (px)** | Rounds the corners of the layer. |
| **Drop shadow** | A blurred, tinted copy of the layer under it, with **Blur**, **Shadow X**, **Shadow Y**, **Shadow color** and **Shadow opacity**. |
| **Layer order (z)** | Higher numbers draw on top. Empty means the layer number, so Layer 1 is at the bottom. The up and down buttons in the preview set it too. |

Why percentages: the size of the base image is decided upstream. It may be a 2K render today and a 4K poster tomorrow. A layer set "12% wide, 4% in from the right" lands in the same place on both, while a pixel position would not. Once a base image is connected, the settings panel shows the pixel value next to each percentage.

A layer that falls partly outside the base is cut at the edge of the base. A layer entirely outside the base is skipped, which is not an error. SVG logos are drawn at the final pixel size, so they stay crisp.

### Start from a preset

**Preset (fills layer 1)** sets up Layer 1 in one click. Every value stays editable afterwards.

| Preset | Layer 1 |
| --- | --- |
| **Watermark** | Bottom-right, 10% wide, 85% opacity |
| **Logo top-left** | Top-left, 14% wide |
| **Centered** | Centered, 40% wide |
| **Full bleed** | Covers the whole base |

### Example: a watermark

Connect the photo to **Base** and the logo to **Layer 1**, then set Layer 1 to these values:

| Setting | Value |
| --- | --- |
| **Anchor** | bottom-right |
| **Width** | 12 |
| **Offset X** | -4 |
| **Offset Y** | -6 |
| **Opacity** | 95% |

On a 2000 × 1000 pixel base, the logo is 240 pixels wide. Its right edge is 80 pixels from the right, and its bottom edge is 60 pixels from the bottom. On a 4000 × 2000 base, every one of those numbers doubles, and the node needs no change.

## Layer kinds

| Kind | What it is | How it is sized |
| --- | --- | --- |
| **Image** | A picture wired into the layer's input: a logo, a Remove Background cut-out, a sticker | **Width** in percent of the base width; the height follows the picture unless **Height** is set |
| **Text** | Real text, drawn with a bundled font. The preview uses the same font file, so the result matches the preview. | **Size (% of base height)**; the box fits the text |
| **QR** | A QR code for a link or any text | **Width** in percent of the base width; always square |
| **Shape** | Rectangle, Rounded rectangle, Pill, Circle, Ribbon, Triangle, Diamond, Hexagon, Star, Starburst badge or Arrow | **Width** and **Height** in percent of the base |

To change a text, QR or shape layer back into a picture layer, use **Turn back into an image slot**.

### Text layers

- **Fonts**: Inter, Montserrat, Space Grotesk, Playfair Display, Oswald, Bebas Neue, Anton, Pacifico, Rubik and Heebo. Rubik and Heebo set Hebrew. Variable fonts accept any **Weight** from 100 to 900.
- **Layout**: **Align**, **Letter spacing**, **Line height** and **Uppercase**. Right-to-left text is laid out right to left on each line.
- **Outline**: an outline around the letters, with **Outline width** and **Outline color**.
- **Background box (pill / badge)**: a box behind the text, with **Box color**, opacity, **Padding** and a corner radius. A large radius makes a pill.

### Image layers

Every layer can have a drop shadow and rounded corners. An image layer has four more finishes:

- **Crop** cuts the picture to a circle.
- **Feather edges** fades the edges out over a number of pixels.
- **Outline** draws a line around the silhouette.
- **Glow** adds a colored glow around it.

### QR layers

Type the link in **QR content (URL or text)**. You can change it at any time, and the code updates. **QR color**, **QR background** and **Quiet zone** set the look.

To take the link from the workflow instead, switch on **Use workflow output**. The node gets a **QR link** input: wire a Text node, a List column or any text output into it. With a List column, one run makes one code per row, for example fifty codes for fifty product pages. A run with **Use workflow output** on and nothing wired is refused, with a message that names the input.

## Platform sizes and safe areas

**Platform size** turns the output into the pixel size of a platform:

- YouTube thumbnail and YouTube channel banner
- LinkedIn company cover and LinkedIn personal cover
- X header and Facebook cover
- Instagram post, Instagram portrait and Instagram story
- Link preview, slide and A4 print

The default is **Keep the base image size**. When you choose a platform, the preview draws its **safe area** as a dashed box: the part every device shows. Choosing a platform also sets **Base fit** to **Cover**, so the picture fills the canvas. For the YouTube channel banner, the preview shows three nested zones: what TVs show, what desktops show and what all devices show.

While you drag, a layer snaps to the center lines, the edges and the safe area. Hold Shift to drag freely.

**Export also for** renders the same composition into more platform canvases in the same run. Tick as many platforms as you need, up to all twelve. The extra files appear as chips on the result. Every ticked platform is also an output on the node. For example, the X header render can feed an [X Post](https://nodaro.ai/docs/nodes/publish/x-post) node while the LinkedIn cover feeds a [LinkedIn Post](https://nodaro.ai/docs/nodes/publish/linkedin-post) node in the same run. Each extra platform costs 2 credits.

**Open full editor** opens a large editing view of the node. Its header has the same platform picker, and the stage becomes that platform's canvas with its safe area.

## Output size and format

| Setting | What it does |
| --- | --- |
| **Custom output size** | Off by default: the output keeps the pixel size of the base. On: the base is placed into a canvas of **Canvas width (px)** × **Canvas height (px)** with a **Canvas background**. **Base fit** decides how: **Contain** fits the whole base and fills the rest with the background color, **Cover** fills the canvas and crops the base. The layers are still placed relative to the base. |
| **Output format** | **PNG (keeps transparency)**, the default, **JPG** or **WebP**. JPG and WebP remove transparency. |

## Mask output

The **Mask** output is a black-and-white image. White marks the area an AI edit may change. **Mask output** chooses what is white:

| Option | White area |
| --- | --- |
| **Ring around the layers (for AI finish)** | A ring around the placed layers, **Ring width (px)** wide. This is the default. |
| **The layers themselves** | The layers |
| **Everything except the layers** | The rest of the image |
| **No mask** | Nothing |

Wire the mask into the **Mask** input of [Modify Image](https://nodaro.ai/docs/nodes/image/modify-image).

## Make it look part of the picture

The node never redraws your layers. That is the point, but sometimes you want the scene to react to them: a contact shadow under a placed product, matching light on a logo, a reflection on a floor.

Click **Add AI finish (make it look part of the picture)**. It adds a [Modify Image](https://nodaro.ai/docs/nodes/image/modify-image) node after this one. The new node is wired to the composite and to the mask ring around your layers, and its prompt asks for exactly that. The model can paint only in the ring, so it adds shadows and light around the elements. Every pixel outside the mask is kept from the composite, so the elements stay pixel-exact. To steer the look, wire a [Composition Effects](https://nodaro.ai/docs/nodes/creative-controls/composition-effects) picker into that Modify Image node.

**Suggest placement (AI)**, in a layer's settings, asks a vision model where the layer should go. It avoids faces, the main subject and busy textures, and it stays inside the safe area when a platform is set. It then fills in the anchor and the offsets. It costs the same as one [Describe Image](https://nodaro.ai/docs/nodes/image/describe-image) run, and you can drag the layer afterwards as usual.

## Credits
Image Overlay costs 10 credits for the composite and its mask, whatever the size of the base image or the number of layers. Each extra platform under **Export also for** adds 2 credits.

| Export also for | Credits |
| --- | --- |
| Nothing | 10 |
| 2 platforms, for example Instagram post and YouTube thumbnail | 14 |
| All 12 platforms | 34 |

The **Run** button, the workflow estimate and the API all use the same formula. The Modify Image node that **Add AI finish** creates is charged separately, at its model's price.

## Tips
- **Use transparent files.** Feed a transparent PNG or an SVG as a layer. An opaque JPG logo is placed as a rectangle, so run it through [Remove Background](https://nodaro.ai/docs/nodes/image/remove-background) first.
- **Keep brand assets as files.** Draw the picture with an AI node, then place the real logo here. A model always redraws a wordmark slightly wrong.
- **Blend marks into the image.** Use **Multiply** for dark marks on light photos and **Screen** for light marks on dark photos.
- **Lift a cut-out.** A soft drop shadow separates a person or a product from a busy background. Try blur 24, **Shadow X** 0, **Shadow Y** 12 and 50% opacity.
- **Make a banner from a wider render.** Turn on **Custom output size** with **Cover**, for example at 1500 × 500 pixels. The logo stays placed relative to the base, not the canvas.
- **Generate the base first.** The pixel values next to each percentage appear once a base image with a known size is connected.
- **Rotate, then offset.** Rotation turns the layer around its own center. Add an offset to keep a rotated mark tight in a corner.
- **Use text layers for words, files for logos.** Use a text layer for headlines, captions, prices and lower thirds, and an SVG or PNG file for the brand wordmark.

## From the API
`POST /v1/image-overlay` takes the base image and the layers. This call places the watermark from the example above:

```json
{
"imageUrl": "https://example.com/photo.png",
"layers": [
{ "imageUrl": "https://example.com/logo.svg", "anchor": "bottom-right", "width": 12, "x": -4, "y": -6, "opacity": 0.95 }
]
}
```

- A text, QR or shape layer sets `layers[i].kind` to `text`, `qr` or `shape`, with a `text`, `qr` or `shape` object. `opacity` runs from 0 to 1, and `zIndex` sets the stacking order.
- `canvas` sets a platform size or a custom output size. `outputFormat` is `png`, `jpg` or `webp`.
- `variants`, for example `["youtube-thumbnail", "x-header"]`, adds platform renders. The result lists them as `variants`, each with an `id`, a `label`, a `width`, a `height` and a `url`.
- `maskMode` is `around`, `layers`, `outside` or `none`, and `maskSpread` is the ring width. The job's output carries the mask as `maskUrl`.
- A QR layer with `qr.fromInput` set to `true` takes its link from a top-level `qrText`.

## Frequently asked questions

### Does Image Overlay use AI?

No. Image Overlay places your layers exactly as you set them and redraws nothing, so a logo comes out as the file you gave it. Only the optional AI finish and Suggest placement use AI.

### How many credits does Image Overlay cost?

10 credits per run, whatever the size of the image or the number of layers, plus 2 credits for each extra platform under Export also for. Exporting to all 12 platforms costs 34 credits.

### Why are layer positions in percent instead of pixels?

Percentages keep the layout right on any image size. A logo set 12% wide and 4% from the right edge lands in the same place on a 1K preview and on a 4K poster.

### How do I add a watermark to many images at once?

Wire a List of image URLs into the Base input. The node runs once per image with the same layers, so one run can watermark a whole batch.

### How do I make a placed product look part of the scene?

Click Add AI finish. It adds a Modify Image node that repaints only a ring around your layers, with contact shadows and matching light, while the layers themselves stay pixel-exact.

### Which fonts can text layers use?

Inter, Montserrat, Space Grotesk, Playfair Display, Oswald, Bebas Neue, Anton, Pacifico, Rubik and Heebo. Rubik and Heebo also set Hebrew, and right-to-left text is laid out right to left.
