Chrome Web Store marquee 1400x560: crop a 21:9 Sume image
The optional marquee is 1400x560, a 5:2 ratio no Sume model lists. Generate 21:9 on FLUX.2 Pro and crop 6.7% of the height, or lose 20% from a 2:1 image.

The Chrome Web Store marquee promotional image is optional and 1400 x 560 pixels, which is a 5:2 ratio (2.5 wide to 1 high). No Sume image model lists 5:2, so the cleanest route is to request 21:9 from FLUX.2 Pro and crop 6.7% off the height. Starting from a 2:1 image would cost you 20% of the height instead.
What the store asks for
Chrome's image page separates required assets from optional ones. The small promotional tile at 440 x 280 is required, and the marquee at 1400 x 560 is optional. Its design advice for promotional images is to avoid text, to make sure the image still works when shrunk to half size, and to use saturated colors rather than a lot of white and light gray.
| Asset | Size | Status |
|---|---|---|
| Small promo tile | 440 x 280 | Required |
| Marquee promo tile | 1400 x 560 | Optional |
Pick the nearest ratio, then crop
The target is 1400 / 560 = 2.5. Cropping only removes pixels, so the source must be wider than the target and you cut height. The table shows what each native ratio leaves you, from the ratio lists in the Image API catalog.
| Source ratio | Width / height | Height kept | Lost |
|---|---|---|---|
| 21:9 | 2.333 | 93.3% | 6.7% |
| 2:1 | 2.000 | 80.0% | 20.0% |
| 16:9 | 1.778 | 71.1% | 28.9% |
Which models list 21:9
FLUX.2 Pro and Flex, Qwen Image, Recraft V4, Nano Banana 2 and Nano Banana Pro list 21:9 in the catalog; the GPT Image family, Seedream and Imagen do not. The docs also warn that a ratio a model does not list is rejected, and that auto is not accepted everywhere, so check GET /v1/images/models for the model you pin. FLUX.2 Pro lists $0.03 for the first megapixel and $0.015 for each additional one (rounded up), before Sume's 1.25 multiplier, so a larger output costs more than a 1 MP one; read usage.cost for the real figure. A failed generation is not billed.
import os, io, requests
from PIL import Image
r = requests.post(
"https://api.sume.com/v1/images",
headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
json={"model": "black-forest-labs/flux.2-pro", "aspect_ratio": "21:9",
"prompt": "wide abstract gradient scene of floating browser tabs, saturated colors, no text"},
timeout=60,
)
r.raise_for_status()
if r.status_code != 200:
raise SystemExit("202: read the job result instead")
img = Image.open(io.BytesIO(requests.get(r.json()["data"][0]["url"], timeout=60).content)).convert("RGB")
w, h = img.size
new_h = round(w * 560 / 1400) # 5:2 target
top = (h - new_h) // 2
img.crop((0, top, w, top + new_h)).resize((1400, 560), Image.LANCZOS).save("marquee.png")Cost and iteration
Marquee art is a place where you will want several drafts, since you judge it at a glance and at half size. Generate three or four variants in separate requests, throw away the ones where the subject sits near the top or bottom edge, and crop only the winner. The n parameter exists in the Image API, but check the catalog entry for the model first, because a model that does not list a parameter rejects it. Each request returns usage.cost, so you can sum the drafts and see what the exploration cost without reading a price table.
The listing images are separate from your product's own screenshots. Screenshots should show the real interface, and an image model cannot do that honestly; the marquee is the one slot where an illustrative scene is normal.
Placing the content
The crop trims the top and bottom evenly, so keep the focal point in the middle band. The store says to avoid text in promotional images, which suits an image model's weakness with lettering anyway. Look at a 700 x 280 version of the file, which is half size, before you upload it. Screenshots and the small tile have their own posts: see the 440x280 tile.
Sources
Related posts
More in Developers
- Claude Agent SDK 0.2.160: background wait ceiling, Sume video job
Claude Agent SDK Python 0.2.160 keeps stdin open until background subagents go idle, ten minutes by default. Why a Sume video job can outlast that.
- Claude Code 2.1.288 hooks fail closed: a Sume spend guard script
Claude Code 2.1.288 now blocks a tool call when a PreToolUse hook can't match or serialize input. A small guard script for Sume paid calls.
- allowManagedModsOnly in Claude Code: does hosted Sume MCP still load?
allowManagedModsOnly keeps users' own Claude Code mods from loading. What it leaves alone, how a policy mod reviews the rest, and the Sume MCP connection.
- Claude Code .mcp.json oauth.scopes: mcp:read first, mcp:write later
Claude Code's .mcp.json oauth block takes a space-separated scopes string that overrides discovery. Start Sume at mcp:read and widen to mcp:write when needed.
Written by Sume