FLUX 3 Image 0-1000 boxes to pixels on a 1920x1080 canvas
FLUX 3 Image boxes are [top, left, bottom, right] on a 0-1000 grid. The BFL example [250, 50, 850, 650] becomes x 96, y 270, 1152x648 pixels on 1920x1080.
The BFL example box [250, 50, 850, 650] is [top, left, bottom, right] on a 0-1000 grid, so on a 1920x1080 canvas it covers x 96 to 1248 and y 270 to 918, a 1152x648 pixel rectangle. The pixel values are writer-derived: value / 1000 x canvas size. FLUX 3 Image is not in the Sume image catalog today; check GET /v1/images/models for the live list. The catalog lists FLUX.2 Pro and FLUX.2 Flex.
The format
BFL's bounding-box page says the grid is normalized from 0 to 1000 on both axes, and the model page repeats the 0-1000 layout grid. The order is y first. Three box kinds exist: new generates content at tgt_bbox, move relocates from src_bbox to tgt_bbox, and anchor preserves a region at the same position.
| Item | Value on the BFL page |
|---|---|
| Grid | 0-1000 on both axes |
| Order | [top, left, bottom, right] |
| Kinds | new, move, anchor |
| Example | [250, 50, 850, 650] |
The arithmetic for 1920x1080
Each coordinate scales by its own axis: top and bottom by height, left and right by width. Because the canvas is not square, a box that looks square on the grid will not be square in pixels.
| Edge | Grid value | Formula | Pixels |
|---|---|---|---|
| Top | 250 | 250 / 1000 x 1080 | 270 |
| Left | 50 | 50 / 1000 x 1920 | 96 |
| Bottom | 850 | 850 / 1000 x 1080 | 918 |
| Right | 650 | 650 / 1000 x 1920 | 1248 |
Check the result
Width is 1248 - 96 = 1152 and height is 918 - 270 = 648. The ratio 1152:648 is 16:9, the same as the canvas, because the grid box spans 60 percent of each axis.
A converter
The helper below converts a FLUX 3 box to an x, y, width, height rectangle.
def box_to_pixels(box, width, height):
top, left, bottom, right = box # FLUX 3 order: [top, left, bottom, right]
return {
"x": round(left / 1000 * width),
"y": round(top / 1000 * height),
"w": round((right - left) / 1000 * width),
"h": round((bottom - top) / 1000 * height),
}
print(box_to_pixels([250, 50, 850, 650], 1920, 1080))
# {'x': 96, 'y': 270, 'w': 1152, 'h': 648}On Sume
Sume has no bounding-box field. On Sume, mask_url is accepted only on ChatGPT Image 2.5 (openai/gpt-image-2.5 and openai/gpt-image-2.5-sunburst), so a box would need to be painted into a mask image yourself, using the pixel rectangle above.
Sources
Related posts
More in Developers
- FLUX 3 Image images field: 2-10 references vs Sume's input_references
BFL's images field takes 2-10 references addressed as <ref_image_N>. Sume's input_references takes up to 10, or 16 on ChatGPT Image 2.5.
- Forgot the TTS language field? Sume only infers Korean and Japanese
Omit language on a Sume TTS request and the voice check assumes English. Sume infers ko or ja only when Hangul or kana outnumber Latin letters.
- 404 format_run_wrong_path: read a Sume run by its own id
A 404 on GET /v1/formats/{handle}/{slug}/runs/{run_id} is a wrong URL, not a lost run. The did_you_mean hint names GET /v1/format-runs/{run_id}.
- Run stuck queued? queue.state waiting vs runtime_unavailable
queue.state waiting is normal pickup; runtime_unavailable means nothing claimed the run. Position is always null. Back off, then contact support.
Written by Sume