Translate small print on a pack: edit the panel crop, paste it back
For ingredient-panel small print, crop the panel, send only the crop to an Ideogram 4.5 edit at high quality, and paste it back with Pillow. Proof every word.

Do not ask an image model to translate a whole pack photo when the hard part is the ingredient panel. Crop the panel, edit only the crop at quality: high, then paste it back over the original with Pillow. The small print gets the full output size of the model, and the rest of the pack is never touched.
Why the crop helps
Small print is a few pixels tall on a full pack shot. In a crop, the same text fills the frame, so there are more pixels per letter for the model to read and to redraw. An edit with no aspect_ratio keeps the source shape (Image API docs), so the edited crop comes back at the size you sent and drops straight into the same box.
The Ideogram API says unedited pixels are copied exactly from the original in its own edit endpoint (read 2026-10-05). I have not verified that the Sume route preserves them byte for byte, so the paste-back is also your safety: only the panel box can change.
Pick the quality from the cost
Quality sets the price on Ideogram 4.5. The fal list prices are $0.03, $0.06 and $0.22 per image for low, medium and high, and Sume bills list x 1.25.
| Quality | Fal list | Billed on Sume |
|---|---|---|
| low | $0.03 | $0.0375 |
| medium (default) | $0.06 | $0.075 |
| high | $0.22 | $0.275 |
Crop, edit, paste
Upload the crop to a URL you control, send it as the first input_references entry with the target language in the prompt, and download the result. Then paste it back.
from PIL import Image
pack = Image.open("pack.png").convert("RGB")
box = (120, 640, 920, 1180) # left, top, right, bottom
pack.crop(box).save("panel.png")
# ...edit panel.png through POST /v1/images, save as panel_de.png...
w, h = box[2] - box[0], box[3] - box[1]
panel = Image.open("panel_de.png").convert("RGB")
if panel.size != (w, h):
panel = panel.resize((w, h), Image.Resampling.LANCZOS)
pack.paste(panel, box[:2])
pack.save("pack_de.png")Limits you should respect
Never ship translated ingredient or allergen text without a person who reads the language checking every word. A model can misspell, drop a line or change a number, and a label is a legal document in most markets. Translations are often longer than the English too, so tell the prompt to keep the same font size and to shorten line breaks rather than shrink the text.
Check the pasted seam. If the panel background is a flat colour it will be invisible. On a textured or gradient background, crop slightly larger than the text block and feather the paste edge, or retouch the seam by hand.
Checklist before the batch
Run one language end to end first, and print it at final size. Small print that looks fine on a monitor can fail at label size, so look at the printed proof.
Keep the prompt identical across languages except for the language name, so a difference in the output is the language and not the wording. Save each crop, each edit and the pasted result, because a reviewer will ask for the panel on its own.
Sources
Related posts
More in Use cases
- Translate a restaurant menu image into Spanish and French on Sume
Translate the text in a menu image with Ideogram 4.5: one edit call per language from the original, with prices and dish names kept. Python loop included.
- Travel Agency Destination Teaser With an AI Avatar: Cost
A destination teaser narrated by a reusable AI avatar: scene script, per-scene seconds, request JSON and Sume Avatar 1.0 cost on each quality tier.
- Score travel and drone footage with three moods and one concat
Make three Lyria 3.5 cues for a travel reel, join them with Timeline audio concat at $0.01, and render under drone footage. About $0.69 for 3 minutes.
- Blog post to a 45-second Short that is not the article aloud
Reading an article over stock clips is the pattern YouTube warns about. Pull one claim, add your own angle, and build the Short with Sume Timeline.
Written by Sume