live
MODEL IDbfl:flux@3-image

FLUX 3 Image

Black Forest Labs
by
Available with Zero Data Retention

FLUX 3 Image is Black Forest Labs' image generation and editing model built on the multimodal FLUX 3 backbone shared with FLUX 3 Video. It combines text-to-image synthesis, precise local editing, multi-reference composition, bounding-box placement, and native 4K output. The model preserves identities and fine details across references, supports targeted changes and in-place text editing, and renders accurate typography in text-heavy layouts across a broad range of visual styles.

FLUX 3 Image

Editing images

How to edit an image with FLUX 3 Image from a single reference: scoping the instruction, swapping materials and light, removing objects, reframing, and chaining edits.

Introduction

An edit is the same request as a generation with one image attached. You put the picture in inputs.referenceImages and write the change in positivePrompt, and the model rebuilds the frame with that change applied while holding the rest of the scene where it was.

There is no mask and no brush. The region you are editing is identified by what you name in the sentence, which means the wording of the instruction is the only targeting mechanism you have.

A lounge chair upholstered in oatmeal boucle with a black steel frame on a pale concrete floor

A product photograph of a lounge chair upholstered in oatmeal boucle with a tubular black steel frame, standing on a pale concrete floor against a plain warm white wall. Even soft daylight from the front left, a soft shadow under the frame. Straight-on shot at seat height, 50mm lens, the chair centered with clear floor either side. Photoreal furniture e-commerce photography, warm neutral palette.

SourceEdited

The frame, the floor shadow and the falloff across the seat survive the swap. The upholstery is the only thing that moved, because it was the only thing named.

This guide covers how to scope an instruction, the kinds of change a single reference handles, how to recompose a shot into another shape, and how to stack several edits without the picture drifting.

Scoping the instruction

A broad instruction gives the model permission to reinterpret the whole frame. A scoped one names the target, then names what has to survive. The second half of that sentence is what keeps the rest of the image still.

"Make the outfit cooler" leaves the model to decide what counts as the outfit and what counts as cooler, so the pose and the wall tone move with it. The precise version changes one garment and leaves the face, the trousers and the boots where they were, which is the difference between a mood board and a colorway.

The instruction has three working parts:

  • The target, named with the detail that identifies it: "the mustard yellow corduroy overshirt", not "the top"
  • The change, stated as the finished state: "to a slate blue one in the same corduroy"
  • The survivors, listed explicitly: the face, the other garments, the wall, the framing, the lighting
Try in Playground
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'bfl:flux@3-image',
  positivePrompt: 'Change only the mustard yellow corduroy overshirt to a slate blue one in the same corduroy. Preserve its cut, its buttons and the way it hangs open. Keep the man, his face, his t-shirt, his trousers, his boots, the plaster wall, the framing and the lighting unchanged.',
  inputs: {
    referenceImages: [
      'https://im.runware.ai/image/os/a14d18/ws/2/ii/c3d4e5f6-a7b8-9012-cdef-123456789012.jpg'
    ]
  },
  width: 1248,
  height: 832
})
import asyncio
import os

from runware import Runware


async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "bfl:flux@3-image",
            "positivePrompt": "Change only the mustard yellow corduroy overshirt to a slate blue one in the same corduroy. Preserve its cut, its buttons and the way it hangs open. Keep the man, his face, his t-shirt, his trousers, his boots, the plaster wall, the framing and the lighting unchanged.",
            "inputs": {
                "referenceImages": [
                    "https://im.runware.ai/image/os/a14d18/ws/2/ii/c3d4e5f6-a7b8-9012-cdef-123456789012.jpg"
                ]
            },
            "width": 1248,
            "height": 832
        })


asyncio.run(main())
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "imageInference",
      "taskUUID": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "model": "bfl:flux@3-image",
      "positivePrompt": "Change only the mustard yellow corduroy overshirt to a slate blue one in the same corduroy. Preserve its cut, its buttons and the way it hangs open. Keep the man, his face, his t-shirt, his trousers, his boots, the plaster wall, the framing and the lighting unchanged.",
      "inputs": {
        "referenceImages": [
          "https://im.runware.ai/image/os/a14d18/ws/2/ii/c3d4e5f6-a7b8-9012-cdef-123456789012.jpg"
        ]
      },
      "width": 1248,
      "height": 832
    }
  ]'
runware run bfl:flux@3-image \
  positivePrompt="Change only the mustard yellow corduroy overshirt to a slate blue one in the same corduroy. Preserve its cut, its buttons and the way it hangs open. Keep the man, his face, his t-shirt, his trousers, his boots, the plaster wall, the framing and the lighting unchanged." \
  inputs.referenceImages.0=https://im.runware.ai/image/os/a14d18/ws/2/ii/c3d4e5f6-a7b8-9012-cdef-123456789012.jpg \
  width=1248 \
  height=832
{
  "taskType": "imageInference",
  "taskUUID": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
  "model": "bfl:flux@3-image",
  "positivePrompt": "Change only the mustard yellow corduroy overshirt to a slate blue one in the same corduroy. Preserve its cut, its buttons and the way it hangs open. Keep the man, his face, his t-shirt, his trousers, his boots, the plaster wall, the framing and the lighting unchanged.",
  "inputs": {
    "referenceImages": [
      "https://im.runware.ai/image/os/a14d18/ws/2/ii/c3d4e5f6-a7b8-9012-cdef-123456789012.jpg"
    ]
  },
  "width": 1248,
  "height": 832
}
Response
{
  "data": [
    {
      "taskType": "imageInference",
      "taskUUID": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "imageUUID": "d4e5f6a7-b8c9-0123-def1-234567890123",
      "imageURL": "https://im.runware.ai/image/os/a14d18/ws/2/ii/d4e5f6a7-b8c9-0123-def1-234567890123.jpg"
    }
  ]
}

The edit comes back at the size the request asked for, not the shape of the reference. Send the same width and height as the source when you want the pair to line up, or send resolution instead and the aspect ratio is taken from the reference.

Relighting a scene

Light and time of day are a single instruction, and they are worth treating as one because the model has to rebuild every shadow in the frame to honor them. Name the new light source and where it sits, not just the hour.

A rooftop terrace with a teak table, woven chairs and olive trees under bright midday sun

A rooftop terrace of a city apartment with a teak dining table, four woven chairs and a row of planted olive trees along the parapet, the skyline visible behind. Bright midday sun from overhead, short hard shadows on the decking. Wide shot at standing height, 24mm lens, the table running from the lower left. Photoreal real estate photography, warm palette.

MiddayDusk

The furniture and the planting hold their positions while every shadow on the decking is redrawn from a new source. For a listing set, that turns one shoot into a day version and an evening version without moving the camera.

Replacing a subject in place

A replacement keeps the composition and swaps what occupies it. The instruction has to pin the geometry, because "replace the bicycle with a scooter" alone will also reframe the shot around the new object.

A sage green city bicycle with a wire basket leaning against a red brick wall

A sage green city bicycle with a front wire basket and a tan leather saddle, leaning against a red brick wall on a stone pavement, a drainpipe running down the wall behind it. Warm late afternoon light from the right, a long shadow across the pavement. Side-on shot at saddle height, 50mm lens, the bicycle filling the width of the frame. Photoreal lifestyle photography, warm palette.

BicycleScooter

"Occupying the same part of the frame" is the clause doing the work. It tells the model that the composition is fixed and only the object inside it is open, which is what makes a swap usable as a variant of the original shot rather than a new one. The scooter stands on its own kickstand rather than leaning, because a replacement keeps the geometry you pin and settles the rest the way the new object would really sit.

Removing and adding objects

Both operations run off the same source. A removal needs the surface underneath described, or the model tends to leave a smudge where the object was. An addition needs a position and a contact shadow, or the new object floats.

"Leave the marble it stood on clean and empty" is the removal doing its own inpainting brief. "Sitting flat on the marble with a soft shadow beneath it" is the addition being told how to touch the surface. Both are cheap sentences that decide whether the result reads as a photograph.

Changing the frame

A reframe is an edit whose output size differs from the reference, and it works because the requested size wins over the shape of the reference. The model rebuilds the scene to fill the new aspect instead of cropping it or padding it, which means it is drawing area the source never had.

Two clauses carry a reframe. The first is the usual list of survivors, the woman, the table, the wall and the light. The second is the one this edit adds: say where the subject sits in the new frame and what fills the space that opens up. "Move her to the lower half and extend the wall and the lamps upward" leaves nothing for the model to invent, and a vertical cut of a landscape shot is exactly where an unbriefed model starts inventing.

Camera distance is the same instruction at the same aspect. Asking to pull back and show more of the table, or to come in to a chest-up crop, reads as a composition change rather than a resize, so the survivors clause still does the work.

A reframe is a re-render, not a crop. Type, faces and fine texture are drawn again and will not match the source pixel for pixel, so treat the pair as two shots of one setup rather than as one asset in two sizes. When a layout needs exactly the same pixels at another shape, crop it downstream.

Chaining edits

There is no seed, so a prompt you rerun comes back as a different picture. The way to build up a change is to edit the output, then edit that output again, each pass carrying the last one forward.

Each pass names the previous pass's result among the survivors, which is what stops the green from drifting when the brass goes on and stops the brass from drifting when the shelf changes. One change per pass is the rule that makes this hold. Two changes in a sentence means two chances for the model to reinterpret the frame, and you lose the ability to tell which half went wrong.

Every pass is a fresh generation, not a patch applied to the last one, so what survives a pass survives because the instruction named it. When a chain runs long, go back to the source and fold the settled changes into a single instruction rather than trusting a longer list of survivors.

Tips for best results

  1. Name the target by a distinguishing feature. "The mustard yellow corduroy overshirt" lands where "the jacket" wanders, especially when the frame holds more than one candidate.

  2. List the survivors. The sentence that starts "keep" is not filler. It is the only thing standing between a colorway and a re-render.

  3. State the change as a finished state. "To a slate blue one in the same corduroy" describes the result. "Make it bluer" describes a direction, and the model picks the distance.

  4. Describe the surface under a removal. Without it the model has to guess what was hidden, and a guess reads as a patch.

  5. Give an addition a position and a shadow. Where it sits relative to something already in the frame, and how it meets the surface.

  6. Pin the geometry on a replacement. Same angle, same part of the frame. Otherwise the shot recomposes around the new object.

  7. One change per pass. Chain the passes instead of stacking clauses, and name the previous pass's result among the survivors every time.

  8. Place the subject when you reframe. A new aspect opens space the source never had, so say where the subject lands and what fills the rest.