Edge Add-ons small tile 440x280: crop a 3:2 Sume image
Edge's small promotional tile must be exactly 440 x 280, a 1.571 ratio. Sume lists 3:2 for FLUX.2 Pro, so crop 4.5% of the height and resize.

On the Microsoft Edge Add-ons page in Microsoft Learn, the small promotional tile is optional and must be 440 x 280 pixels. That is a ratio of 1.571, close to 3:2 (1.5) but not equal. Generate 3:2 on Sume with a model that lists it, then crop 4.5% off the height and resize to the exact size.
Where the tile sits among the listing assets
Edge treats these as separate uploads per language, and each has a Duplicate option that copies it to the other languages.
| Asset | Required | Size |
|---|---|---|
| Extension logo | Yes, per language | 1:1, 300 x 300 recommended, 128 x 128 minimum |
| Small promotional tile | Optional | 440 x 280 |
| Large promotional tile | Optional | 1400 x 560, PNG |
| Screenshots | Optional, up to 6 | 640 x 480 or 1280 x 800 |
The crop arithmetic
A 3:2 source of width W has height W/1.5. The target height for the same width is W/1.571, which is 95.5% of that. Cropping only cuts height, so 4.5% disappears, about 2.3% from the top and bottom each. That is small enough that a centered subject is untouched.
3:2 is in the FLUX.2 Pro, FLUX.2 Flex, Qwen Image, Recraft V4 and Seedream catalog lists, and in the Nano Banana models. The GPT Image family does not list it.
Generate, crop, resize
The script crops to the target ratio, then resizes to 440 x 280 with LANCZOS. Start from the full-size master so the downsample stays crisp.
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": "3:2", "prompt": "bright abstract scene of overlapping browser windows, saturated colors, no text"},
timeout=90,
)
r.raise_for_status()
if r.status_code != 200:
raise SystemExit("202: read the finished job from /v1/jobs/{id}/result")
img = Image.open(io.BytesIO(requests.get(r.json()["data"][0]["url"], timeout=60).content))
w, h = img.size
target = 440 / 280
if w / h > target:
nw = round(h * target)
img = img.crop(((w - nw) // 2, 0, (w - nw) // 2 + nw, h))
else:
nh = round(w / target)
img = img.crop((0, (h - nh) // 2, w, (h - nh) // 2 + nh))
img = img.convert("RGB").resize((440, 280), Image.LANCZOS)
img.save("edge-small-tile.png")Checking the file
After the resize, open the file at actual size and at half size. The tile is shown next to other extensions, so the subject has to read as a shape, not as detail. Confirm the dimensions with Pillow rather than by eye, since a crop that rounds the wrong way can leave a one pixel border after the resize. The page requires exactly 440 x 280, so assert img.size == (440, 280) in the script before you upload. If the generated art has a strong horizon or a face near the top edge, crop from the top instead of the center for that image. Edge lets you duplicate an uploaded tile to every other language, so one generated tile with no lettering covers a multilingual listing without more generations.
Design notes from the vendor and common sense
Edge's page does not give design rules for the tile beyond its size. Chrome's image guidance, which is a different store, asks for no text and saturated colors; both are sensible here since the tile shows next to other extensions at thumbnail size. Keep the subject centered, and check the 440 pixel result at half size. One tile costs one generation, and FLUX.2 Pro lists at $0.03 before Sume's 1.25 multiplier, so each attempt is $0.0375. Failed generations are not billed.
Sources
Related posts
More in Developers
- Elixir 1.20: verify a Sume webhook with :crypto.mac
An Elixir module that checks the Sume sume-v1 header with :crypto.mac and a guard clause that refuses an empty secret. Written against Elixir 1.20.4.
- Episode idempotency keys: season, episode and version for Sume runs
Build the Sume Idempotency-Key from series, season, episode and a version you bump on purpose. What replays, what conflicts, what needs a new key.
- Extend a video Veo didn't make: which API takes an uploaded clip
Veo 3.1 extension only accepts Veo-made videos. Here is what Gemini Omni and Sume accept instead when you need to continue a clip you uploaded.
- Extend an AI clip by hand: last frame to the next clip, in Python
No extend endpoint? Pull a clip's last frame with Sume's video-frames API and feed it as the first frame of the next job. Python code under 30 lines.
Written by Sume