One 8:1 image sliced into 8 square carousel slides: $0.15 vs $1.20

Generate one 8:1 Nano Banana 2.1 image on Sume at $0.15 (2K), cut it into 8 squares for a swipe carousel. Cost vs 8 separate images, slicing code, seam gotchas.

4 min readSume
All posts

An 8:1 image is eight squares side by side, so one call can become an eight-slide swipe carousel where the picture runs across slide edges. On Sume, Nano Banana 2.1 lists 8:1 and a 2K image costs $0.15, against $1.20 for eight separate 2K squares at the same price per image.

The 8:1 ratio arrived with Nano Banana 2.1 GA on Oct 6 2026 (Gemini API changelog, read 2026-10-09).

Cost: one wide image or eight squares

Price depends on the resolution tier, not on the ratio, so the wide image costs the same as one square.

Carousel of 8 slides, Nano Banana 2.1 (read 2026-10-09)
ResolutionOne 8:1 imageEight 1:1 images (8 x price)Difference
0.5K$0.075$0.60$0.525
1K$0.10$0.80$0.70
2K$0.15$1.20$1.05
4K$0.20$1.60$1.40

Generate one continuous scene

Ask for one continuous scene that runs left to right. The pixel size is not fixed by the request, so read the dimensions of the returned file and cut by width divided by eight, not by a hard-coded number.

import os, requests

body = {
    "model": "google/nano-banana-2.1",
    "prompt": "One continuous street scene across eight panels, left to right, no text",
    "aspect_ratio": "8:1",
    "resolution": "2K",
}
r = requests.post(
    "https://api.sume.com/v1/images",
    headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
    json=body, timeout=60,
)
print(r.status_code)  # 200 = image body, 202 = job envelope
if r.status_code == 200:
    out = r.json()
    print(out["data"][0]["url"], out["usage"]["cost"])

Cut the returned file

This Pillow snippet crops eight squares from the downloaded file. It uses the real width and height, so a result a few pixels off 8:1 still slices cleanly.

from PIL import Image
import requests, io

url = "https://media.sume.com/img/EXAMPLE/0.png"  # data[0].url from the response
img = Image.open(io.BytesIO(requests.get(url, timeout=60).content))
w, h = img.size
tile = w // 8                      # 8:1 means eight squares side by side
side = min(tile, h)
for i in range(8):
    box = (i * tile, 0, i * tile + side, side)
    img.crop(box).save(f"slide-{i + 1}.png")

Gotchas

  • Separate square generations will not line up at the slide edges; that is the reason to use one wide image.
  • Objects on a cut line get split between two slides. Ask for empty space at the seams, or accept a deliberate swipe effect.
  • Text inside the image should sit inside one eighth of the width, or it will straddle a cut.
  • data[].url is a signed Sume-hosted URL; download the file you keep.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume