Double-exposure portrait from two photos with Nano Banana 2.1

Blend a portrait and a landscape into one double exposure: two input_references, a pinned 4:5 ratio, Nano Banana 2.1 at 1K, and the 10-reference cap on Sume.

5 min readSume
All posts

To make a double-exposure portrait on Sume, send two photos as input_references to google/nano-banana-2.1: a head-and-shoulders portrait first and a landscape second. Pin aspect_ratio to 4:5 and describe the effect in the prompt. The Sume catalog lists 15 ratio values for this row, so 4:5 is available, and one image at 1K is priced at the row's endpoint rate, which is $0.10 in the catalog I read.

Why two references and not a prompt alone?

A double exposure needs two real pictures: the silhouette and the texture that shows through it. Google's Nano Banana 2.1 model page describes multi-image fusion with up to 14 reference images. Sume's catalog caps input_references at 10 for this row, so a two-photo blend is well inside the limit on both sides.

Order the references the way you describe them. Say "the first photo is the silhouette, the second photo fills it" so the model does not have to guess.

Which request fields do I need?

Sume copies the OpenRouter image schema. Reference URLs must be public HTTPS; localhost and private-network URLs are rejected before submission. If you omit aspect_ratio on an edit, the result is not the same as auto, so here I pin the ratio that suits a portrait print.

Fields for a two-photo double exposure on Nano Banana 2.1, from Sume's Image API page and Google's model page, read 2026-10-11.
FieldValueNote
modelgoogle/nano-banana-2.1The retired nano-banana-2 id runs as this row
input_referencestwo image_url entriesSume cap is 10; Google's page says 14
aspect_ratio4:5One of 15 values the row lists
resolution1KRows list 512, 1K, 2K and 4K; Google's default is 1K
n1Raise only after the first result looks right

What does the code look like?

The prompt carries the whole effect, so keep it concrete about where the second photo shows.

import os
import requests

def ref(url):
    return {"type": "image_url", "image_url": {"url": url}}

body = {
    "model": "google/nano-banana-2.1",
    "prompt": "Double exposure. The first photo is the silhouette of "
              "the person in profile; the second photo fills that "
              "silhouette. Pale background, soft contrast.",
    "input_references": [ref("https://example.com/portrait.jpg"),
                         ref("https://example.com/forest.jpg")],
    "aspect_ratio": "4:5",
    "resolution": "1K",
}
r = requests.post("https://api.sume.com/v1/images",
    headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
    json=body, timeout=60)
if r.status_code != 200:
    raise SystemExit(f"{r.status_code}: {r.text[:200]}")
print(r.json()["data"][0]["url"])

How do I iterate without overspending?

Nano Banana 2.1 lists four resolution tiers on Sume: 512, 1K, 2K and 4K, and 0.5K is accepted as an alias for 512. Test the pairing of two photos at 512, which is the cheapest tier, then rerun the winner at 1K or 2K. Sume's docs say failed and cancelled generations are not billed, while every completed one is, so each retry of a pairing that works is a cost you chose.

Can I mask where the second photo appears?

Not on this row. Sume's mask_url field is listed only for ChatGPT Image 2.5, and Google's model page does not mention a mask for Nano Banana 2.1. Steer placement with words instead, or use the GPT row with a mask if you need an exact region. If the call returns 202, read the image from the job result as described in Jobs and results.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume