> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bfl.ml/llms.txt
> Use this file to discover all available pages before exploring further.

# Multi-Reference Editing

> Combine up to 10 reference images in one FLUX 3 Image request: refer to each by position, specify what each supplies, choose which image sets the aspect ratio, and place objects at exact spots with box rows.

export const MultiRefMasonry = ({inputs = [], result = {}, prompt = ""}) => {
  const [hoveredInput, setHoveredInput] = useState(-1);
  const colors = [{
    bg: "rgba(99,182,137,0.22)",
    border: "#63b689",
    text: "#63b689"
  }, {
    bg: "rgba(130,170,255,0.22)",
    border: "#82aaff",
    text: "#82aaff"
  }, {
    bg: "rgba(255,180,107,0.22)",
    border: "#ffb46b",
    text: "#ffb46b"
  }, {
    bg: "rgba(199,140,230,0.22)",
    border: "#c78ce6",
    text: "#c78ce6"
  }, {
    bg: "rgba(255,130,130,0.22)",
    border: "#ff8282",
    text: "#ff8282"
  }, {
    bg: "rgba(130,220,220,0.22)",
    border: "#82dcdc",
    text: "#82dcdc"
  }, {
    bg: "rgba(220,200,120,0.22)",
    border: "#dcc878",
    text: "#dcc878"
  }, {
    bg: "rgba(200,160,180,0.22)",
    border: "#c8a0b4",
    text: "#c8a0b4"
  }];
  const renderPrompt = () => {
    if (!prompt) return null;
    const parts = [];
    let lastIndex = 0;
    const re = /\b(image\s+(\d))\b/gi;
    let m;
    while ((m = re.exec(prompt)) !== null) {
      if (m.index > lastIndex) parts.push({
        text: prompt.slice(lastIndex, m.index),
        idx: -1
      });
      parts.push({
        text: m[1],
        idx: parseInt(m[2], 10) - 1
      });
      lastIndex = m.index + m[0].length;
    }
    if (lastIndex < prompt.length) parts.push({
      text: prompt.slice(lastIndex),
      idx: -1
    });
    return parts.map((p, i) => {
      if (p.idx >= 0 && p.idx < colors.length) {
        const c = colors[p.idx];
        return <span key={i} style={{
          color: c.text,
          fontWeight: 700,
          padding: "1px 5px",
          borderRadius: "3px",
          background: hoveredInput === p.idx ? c.bg : "transparent",
          transition: "background 200ms"
        }}>
            {p.text}
          </span>;
      }
      return <span key={i}>{p.text}</span>;
    });
  };
  const n = inputs.length;
  const useLeftRight = n <= 4;
  const inputItem = (img, idx) => {
    const c = colors[idx % colors.length];
    const isHovered = hoveredInput === idx;
    return <div key={idx} onMouseEnter={() => setHoveredInput(idx)} onMouseLeave={() => setHoveredInput(-1)} style={{
      position: "relative",
      overflow: "hidden",
      borderRadius: "4px",
      cursor: "default",
      outline: isHovered ? "2px solid " + c.border : "2px solid transparent",
      outlineOffset: "-2px",
      transition: "outline-color 150ms ease"
    }}>
        <img src={img.src} alt={img.label || "Input " + (idx + 1)} style={{
      display: "block",
      width: "100%",
      height: "auto",
      pointerEvents: "none"
    }} />
        <div style={{
      position: "absolute",
      top: "4px",
      left: "4px",
      width: "22px",
      height: "22px",
      borderRadius: "50%",
      background: c.border,
      color: "#000",
      display: "flex",
      alignItems: "center",
      justifyContent: "center",
      fontSize: "0.65rem",
      fontWeight: 800,
      boxShadow: "0 1px 4px rgba(0,0,0,0.5)"
    }}>
          {idx + 1}
        </div>
      </div>;
  };
  const resultItem = <div style={{
    position: "relative",
    overflow: "hidden",
    borderRadius: "4px"
  }}>
      <img src={result.src} alt={result.label || "Result"} style={{
    display: "block",
    width: "100%",
    height: "auto",
    pointerEvents: "none"
  }} />
      <div style={{
    position: "absolute",
    top: "6px",
    right: "6px",
    padding: "3px 10px",
    borderRadius: "5px",
    background: "rgba(0,0,0,0.6)",
    backdropFilter: "blur(4px)",
    color: "#fff",
    fontSize: "0.65rem",
    fontWeight: 600
  }}>
        Result
      </div>
    </div>;
  const inputRows = n <= 2 ? n : n <= 4 ? 2 : n;
  const inputColsInner = n <= 3 ? 1 : 2;
  return <div className="not-prose" style={{
    borderRadius: "0.75rem",
    border: "1px solid rgba(255,255,255,0.08)",
    background: "#000000"
  }}>

      {useLeftRight ? <div style={{
    display: "grid",
    gridTemplateColumns: "1fr 2fr",
    gap: "3px",
    padding: "3px",
    alignItems: "start"
  }}>
          {}
          <div style={{
    display: "grid",
    gridTemplateColumns: "repeat(" + inputColsInner + ", 1fr)",
    gridTemplateRows: "repeat(" + inputRows + ", auto)",
    gap: "3px"
  }}>
            {inputs.map((img, idx) => inputItem(img, idx))}
          </div>
          {}
          {resultItem}
        </div> : <div style={{
    display: "flex",
    flexDirection: "column",
    gap: "3px",
    padding: "3px"
  }}>
          <div style={{
    display: "grid",
    gridTemplateColumns: "repeat(" + Math.min(n, 6) + ", 1fr)",
    gap: "3px"
  }}>
            {inputs.map((img, idx) => inputItem(img, idx))}
          </div>
          {resultItem}
        </div>}

      {}
      {prompt && <div style={{
    padding: "0.5rem 0.5rem 0.6rem"
  }}>
          <div style={{
    padding: "0.6rem 0.75rem",
    borderRadius: "6px",
    background: "rgba(255,255,255,0.06)",
    border: "1px solid rgba(255,255,255,0.10)",
    fontFamily: "monospace",
    fontSize: "0.72rem",
    lineHeight: 1.6,
    color: "rgba(255,255,255,0.7)"
  }}>
            <span style={{
    color: "rgba(255,255,255,0.35)",
    fontSize: "0.6rem",
    marginRight: "5px"
  }}>prompt:</span>
            {renderPrompt()}
          </div>
        </div>}
    </div>;
};

export const MultiRefGrid = ({inputs = [], result = {}, prompt = ""}) => {
  const [hoveredInput, setHoveredInput] = useState(-1);
  const colors = [{
    bg: "rgba(99,182,137,0.22)",
    border: "#63b689",
    text: "#63b689"
  }, {
    bg: "rgba(130,170,255,0.22)",
    border: "#82aaff",
    text: "#82aaff"
  }, {
    bg: "rgba(255,180,107,0.22)",
    border: "#ffb46b",
    text: "#ffb46b"
  }, {
    bg: "rgba(199,140,230,0.22)",
    border: "#c78ce6",
    text: "#c78ce6"
  }, {
    bg: "rgba(255,130,130,0.22)",
    border: "#ff8282",
    text: "#ff8282"
  }, {
    bg: "rgba(130,220,220,0.22)",
    border: "#82dcdc",
    text: "#82dcdc"
  }, {
    bg: "rgba(220,200,120,0.22)",
    border: "#dcc878",
    text: "#dcc878"
  }, {
    bg: "rgba(200,160,180,0.22)",
    border: "#c8a0b4",
    text: "#c8a0b4"
  }];
  const renderPrompt = () => {
    if (!prompt) return null;
    const parts = [];
    let lastIndex = 0;
    const re = /\b(image\s+(\d))\b/gi;
    let m;
    while ((m = re.exec(prompt)) !== null) {
      if (m.index > lastIndex) parts.push({
        text: prompt.slice(lastIndex, m.index),
        idx: -1
      });
      parts.push({
        text: m[1],
        idx: parseInt(m[2], 10) - 1
      });
      lastIndex = m.index + m[0].length;
    }
    if (lastIndex < prompt.length) parts.push({
      text: prompt.slice(lastIndex),
      idx: -1
    });
    return parts.map((p, i) => {
      if (p.idx >= 0 && p.idx < colors.length) {
        const c = colors[p.idx];
        return <span key={i} style={{
          color: c.text,
          fontWeight: 700,
          padding: "1px 5px",
          borderRadius: "3px",
          background: hoveredInput === p.idx ? c.bg : "transparent",
          transition: "background 200ms"
        }}>
            {p.text}
          </span>;
      }
      return <span key={i}>{p.text}</span>;
    });
  };
  const getGridCols = () => {
    const n = inputs.length;
    if (n <= 3) return n;
    if (n === 4) return 2;
    if (n <= 6) return 3;
    return 4;
  };
  const gridCols = getGridCols();
  return <div className="not-prose" style={{
    borderRadius: "0.75rem",
    overflow: "hidden",
    border: "1px solid rgba(255,255,255,0.08)",
    background: "rgba(0,0,0,0.35)"
  }}>

      {}
      <div style={{
    display: "grid",
    gridTemplateColumns: "repeat(" + gridCols + ", 1fr)",
    gap: "3px",
    padding: "3px",
    background: "rgba(0,0,0,0.3)"
  }}>
        {inputs.map((img, idx) => {
    const c = colors[idx % colors.length];
    const isHovered = hoveredInput === idx;
    return <div key={idx} onMouseEnter={() => setHoveredInput(idx)} onMouseLeave={() => setHoveredInput(-1)} style={{
      position: "relative",
      overflow: "hidden",
      cursor: "default",
      aspectRatio: "4/3",
      outline: isHovered ? "2px solid " + c.border : "2px solid transparent",
      outlineOffset: "-2px",
      transition: "outline-color 200ms ease",
      borderRadius: "4px"
    }}>
              <img src={img.src} alt={img.label || "Input " + (idx + 1)} style={{
      display: "block",
      width: "100%",
      height: "100%",
      objectFit: "cover",
      pointerEvents: "none"
    }} />
              <div style={{
      position: "absolute",
      top: "4px",
      left: "4px",
      width: "22px",
      height: "22px",
      borderRadius: "50%",
      background: c.border,
      color: "#000",
      display: "flex",
      alignItems: "center",
      justifyContent: "center",
      fontSize: "0.65rem",
      fontWeight: 800,
      boxShadow: "0 1px 4px rgba(0,0,0,0.5)"
    }}>
                {idx + 1}
              </div>
            </div>;
  })}
      </div>

      {}
      <div style={{
    display: "flex",
    justifyContent: "center",
    padding: "4px 0",
    background: "rgba(0,0,0,0.3)"
  }}>
        <svg width="20" height="20" viewBox="0 0 24 24" fill="none">
          <path d="M12 5v14M6 13l6 6 6-6" stroke="rgba(255,255,255,0.3)" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
        </svg>
      </div>

      {}
      <div style={{
    position: "relative",
    padding: "0 3px 3px",
    background: "rgba(0,0,0,0.3)"
  }}>
        <img src={result.src} alt={result.label || "Result"} style={{
    display: "block",
    width: "100%",
    height: "auto",
    borderRadius: "4px",
    pointerEvents: "none"
  }} />
        <div style={{
    position: "absolute",
    top: "6px",
    right: "9px",
    padding: "3px 10px",
    borderRadius: "5px",
    background: "rgba(0,0,0,0.6)",
    backdropFilter: "blur(4px)",
    color: "#fff",
    fontSize: "0.65rem",
    fontWeight: 600
  }}>
          Result
        </div>
      </div>

      {}
      {prompt && <div style={{
    padding: "0.4rem 0.5rem 0.5rem"
  }}>
          <div style={{
    padding: "0.4rem 0.6rem",
    borderRadius: "6px",
    background: "rgba(255,255,255,0.04)",
    border: "1px solid rgba(255,255,255,0.08)",
    fontFamily: "monospace",
    fontSize: "0.68rem",
    lineHeight: 1.5,
    color: "rgba(255,255,255,0.7)"
  }}>
            <span style={{
    color: "rgba(255,255,255,0.35)",
    fontSize: "0.6rem",
    marginRight: "5px"
  }}>prompt:</span>
            {renderPrompt()}
          </div>
        </div>}
    </div>;
};

Multi-reference editing combines several input images into one output. Use it to restyle a photo after an artwork, put a product into a scene, dress a person in garments from other photos, or keep a character consistent across variations. In the prompt, clarify the purpose of each image and how the pieces fit together.

## FLUX 3 example: put an object from one image into another

<MultiRefGrid
  inputs={[
{ src: "https://cdn.sanity.io/images/2gpum2i6/production/ec365238b6efa1b29f573e83b774c6d539408ea8-1800x1200.webp", label: "Image 1: a record spinning on a turntable" },
{ src: "https://cdn.sanity.io/images/2gpum2i6/production/ff3bf81b5a8b38f0d870561217b68a72964259ab-1131x1414.webp", label: "Image 2: a red and white van on a highway" },
]}
  result={{ src: "https://cdn.sanity.io/images/2gpum2i6/production/0fc855dcc110a26d1689f1fd70005f4f80d58ce2-1800x1193.webp", label: "FLUX 3 Image result: a miniature van in place of the cartridge" }}
  prompt="replace the cartridge from image 1 with the van in image 2, adjust the lighting on the van to integrate well within image 1"
/>

Image 1 is the scene and image 2 supplies the object, and the prompt names both roles. It also says how the new object should fit: the van takes the lighting of image 1. The result is landscape like the turntable because `aspect_ratio: "auto"` follows the first reference.

## How FLUX 3 reads multiple references

**Send up to 10 images.** FLUX 3 Image takes 1 to 10 entries in `images`, as URLs or base64 strings. Each must be at least 256 × 256 pixels and at most 16 megapixels.

**Refer to each image by position.** "Image 1" is the first entry in `images`, "image 2" the second, and so on. Use the same words every time you mention an image.

**Specify what each image supplies.** A reference can supply more than one feature, such as both the material and the background. Name those roles explicitly:

| Role | What it supplies | Example phrasing |
| - | - | - |
| Subject | A person, animal, or character to keep recognizable | “the woman in image 2” |
| Product | An object whose shape, color, and label you want to keep | “the bottle from image 3, label facing the camera” |
| Setting | The scene, room, or background everything goes into | “the kitchen in image 1” |
| Style | Palette, medium, texture, or lighting to apply | “in the style of image 4” |

**Say how the pieces relate.** Name positions and interactions, not only the parts: "the woman in image 2 sits on the swing in image 1, with the cat from image 3 on her lap."

**Put the base image first.** With `aspect_ratio: "auto"` (the default), the output takes its aspect ratio from image 1. Put the setting or base photo you are editing first, or set `aspect_ratio` explicitly when no reference has the shape you want.

## Specify an object’s position

A written instruction such as "put the lamp from image 2 on the sideboard" lets FLUX 3 choose the position. To specify it, add box rows to the end of the prompt. A row with `from: "ref_image_1"` takes an element from the second image: `src_bbox` marks the object in image 2, and `tgt_bbox` marks where it belongs in the output. Anchor rows (`from: "ref_image_0"` with the same source and target box) ask the model to keep those elements in place.

```python theme={null}
import json

room = "https://example.com/living-room.jpg"  # image 1: the scene to edit
lamp = "https://example.com/ceramic-lamp.jpg"  # image 2: the product

record = (
    "Modify <ref_image_0> by placing the ceramic table lamp <lamp_1> on the left end "
    "of the oak sideboard <sideboard_1>. Keep the rest of the room exactly unchanged, "
    "preserving the framed print <print_1> above the sideboard."
)
rows = [
    {"id": "lamp_1", "from": "ref_image_1", "src_bbox": [80, 250, 950, 750], "tgt_bbox": [300, 120, 560, 280], "desc": "a ceramic table lamp with a linen shade"},
    {"id": "sideboard_1", "from": "ref_image_0", "src_bbox": [540, 60, 880, 940], "tgt_bbox": [540, 60, 880, 940], "desc": "an oak sideboard"},
    {"id": "print_1", "from": "ref_image_0", "src_bbox": [120, 330, 420, 670], "tgt_bbox": [120, 330, 420, 670], "desc": "a framed botanical print"},
]

generate({
    "prompt": f"{record} {json.dumps(rows)}",
    "images": [room, lamp],
}, name="lamp_on_sideboard")
```

The coordinates are illustrative: measure the boxes on your own images, as `[top, left, bottom, right]` on a 0–1000 grid. `generate()` is the helper from [FLUX 3 Text to Image](/flux_3/flux3_image_generate#quickstart). Placement is a strong hint, not a hard constraint, and multi-reference compositions can place an element partly outside its box. [Edit with boxes](/flux_3/flux3_image_bounding_boxes#edit-an-image) covers every row type.

## More examples

These examples were generated with FLUX 3 Image. Hover an input to highlight where the prompt refers to it.

### Paintings on coins, from four references

<MultiRefMasonry
  inputs={[
{ src: "/images/flux3-image/multiref/coins-1.webp", label: "Coins" },
{ src: "/images/flux3-image/multiref/coins-2.webp", label: "Café" },
{ src: "/images/flux3-image/multiref/coins-3.webp", label: "Sunflowers" },
{ src: "/images/flux3-image/multiref/coins-4.webp", label: "Starry night" },
]}
  result={{ src: "/images/flux3-image/multiref/coins-result.webp" }}
  prompt="Paint the artwork from images 2, 3, and 4 onto the coins in image 1."
/>

One image sets the scene and three supply artwork. Each painting appears on its own coin, and the hand and page stay the same.

### A tower sinking into the sea

<MultiRefMasonry
  inputs={[
{ src: "/images/flux3-image/multiref/tower-1.webp", label: "Sea" },
{ src: "/images/flux3-image/multiref/tower-2.webp", label: "Tower" },
]}
  result={{ src: "/images/flux3-image/multiref/tower-result.webp" }}
  prompt="Make the building from image 2 appear to be sinking into the water from image 1."
/>

The tower is tilted and cut off at the waterline, with waves where it meets the sea.

### A knife made of candy

<MultiRefMasonry
  inputs={[
{ src: "/images/flux3-image/multiref/knife-1.webp", label: "Candy" },
{ src: "/images/flux3-image/multiref/knife-2.webp", label: "Knife" },
]}
  result={{ src: "/images/flux3-image/multiref/knife-result.webp" }}
  prompt="Take the shape of the knife from image 2 and recreate it entirely out of Skittles like in image 1, keeping the full knife silhouette but formed from colorful Skittles arranged tightly together, on the same background of image 1."
/>

The shape comes from image 2 and the material and background come from image 1, including the loose candies around the edge.

### A heart in paper

<MultiRefMasonry
  inputs={[
{ src: "/images/flux3-image/multiref/heart-1.webp", label: "Heart" },
{ src: "/images/flux3-image/multiref/heart-2.webp", label: "Paper" },
]}
  result={{ src: "/images/flux3-image/multiref/heart-result.webp" }}
  prompt="Replace the material of the heart so that it looks like the same wrinkled white paper texture from the second image."
/>

Only the material changes. The shape, the veins, and the black background stay the same.

## Use cases

The categories below cover the most common multi-reference tasks, each with the prompt that produced the result. The "Animal placed in scene", "Pattern onto plate", "Fill bottles with liquid", and "Logo engraved in tree" results were generated with FLUX 3 Image. The rest were generated with FLUX.2.

***

### Scene Compositing

Combine elements from multiple source images into a single coherent scene.

<AccordionGroup>
  <Accordion title="Vintage skating scene from three references">
    FLUX.2 result:

    <MultiRefMasonry
      inputs={[
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/669126258fdc53965be6d8168180b298755d5db1-1125x750.png", label: "Ice Skates" },
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/5c022629eb46a126547ea685a5bedb145288875c-1125x750.png", label: "Location" },
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/c00b05340b6dc9807e492efa7cd85277d4fc7201-500x331.png", label: "Decorations" },
  ]}
      result={{ src: "https://cdn.sanity.io/images/2gpum2i6/production/31acfcff514f52c13abb3a7327d4d74aeb35103c-1120x736.png", label: "FLUX.2 result" }}
      prompt="Create a vintage image taken with a Kodak camera, with heavy grain and slight light smudges. Use Image 2 as the location. Insert only the ice skates from Image 1 into Image 2, with the decorations and evening lighting vibe from Image 3. Add more people skating on the ice."
    />
  </Accordion>

  <Accordion title="Animal placed in scene">
    <MultiRefMasonry
      inputs={[
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/35bbfd4cb834b4b441e76c2aba8025a8d85b29f0-1200x800.jpg", label: "Bathtub" },
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/6d4accd102227c63a70e516d0e5d76b0cf3f5745-960x1200.jpg", label: "Alpaca" },
  ]}
      result={{ src: "/images/flux3-image/regen/F2-92.webp" }}
      prompt="Take the animal from image 2 and place it naturally inside the bathtub from image 1. Fill the tub with water and bubbles, and add a rubber duck on the animal's head."
    />
  </Accordion>

  <Accordion title="Underwater room">
    FLUX.2 result:

    <MultiRefMasonry
      inputs={[
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/02393cf9968cbf103195b9eb0343c8ab826a1ae2-799x1200.jpg", label: "Room" },
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/eff4cc5d02f21e4ffd09e649445637e806e56d42-900x1200.jpg", label: "Underwater" },
  ]}
      result={{ src: "https://cdn.sanity.io/images/2gpum2i6/production/451bc541700469e4618645a5c887bf5e04a5b183-786x1200.jpg", label: "FLUX.2 result" }}
      prompt="Using the corals and fish from the underwater image, place them inside the vintage room as if the entire room is submerged deep in the ocean. The specific coral formations from the first image should grow along the walls, ceiling, and floor, keeping their original shapes and colors."
    />
  </Accordion>
</AccordionGroup>

***

### Style & Material Transfer

Apply the visual style, texture, or material of one image onto the content of another.

<AccordionGroup>
  <Accordion title="Impasto style transfer">
    FLUX.2 result:

    <MultiRefMasonry
      inputs={[
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/0cd2bc72448e9be220cd5de5558f2f6b5973441f-699x750.jpg", label: "Cat photo" },
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/f2779c2086110676494152f9bf4ef7a22d4fd787-360x237.jpg", label: "Style" },
  ]}
      result={{ src: "https://cdn.sanity.io/images/2gpum2i6/production/f9ea604a7f73e7e2f4d185d2d83390221e5adbe2-688x736.jpg", label: "FLUX.2 result" }}
      prompt="An impasto painting of a gigantic fluffy ginger-and-white cat walking through a narrow New York alley. Thick textured brushstrokes, bold color layers, expressive painterly details, and a dramatic sense of scale."
    />
  </Accordion>

  <Accordion title="Animal pattern transfer">
    FLUX.2 result:

    <MultiRefMasonry
      inputs={[
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/09d279847b8ff443b7214f5eca5db019053c6246-500x750.jpg", label: "Cat" },
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/ab0dfc97c6e7640a73d57b69daee2891e6fecbdc-502x750.jpg", label: "Pattern source" },
  ]}
      result={{ src: "https://cdn.sanity.io/images/2gpum2i6/production/e54cc75458e0ad0e4d3da6e1062dd6b22db29a51-496x736.jpg", label: "FLUX.2 result" }}
      prompt="Apply the colors, patterns, and surface tones of the animal in Image 2 to the animal in Image 1. Keep the pose, lighting, and overall composition of Image 1 unchanged."
    />
  </Accordion>

  <Accordion title="Pattern onto plate">
    <MultiRefMasonry
      inputs={[
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/d39856ac7f347609b515a27949a3a92e43dcc4e2-1200x800.jpg", label: "Plate" },
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/baf2e03f89390f6940a5ce2d0f6f3835262efc22-800x1200.jpg", label: "Pattern" },
  ]}
      result={{ src: "/images/flux3-image/regen/F2-100.webp" }}
      prompt={"Apply the exact colors and repeating pattern from image 2 to the glazed surface of the plate in image 1. Keep the plate's shape, rim, position, camera angle, table and lighting unchanged. The pattern follows the curved plate surface and appears fired into the ceramic glaze, with the existing glossy highlights remaining visible. Preserve the saturated burnt-orange, red-orange, ocher and near-black colors of image 2, especially away from reflected highlights."}
    />
  </Accordion>
</AccordionGroup>

***

### Object Replacement

Replace or fill objects with elements from another reference image.

<AccordionGroup>
  <Accordion title="Fill bottles with liquid">
    <MultiRefMasonry
      inputs={[
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/079050c86be377a68dfcfb17f28acc430a93a54d-1200x1200.jpg", label: "Bottles" },
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/8d0259eee11952faa21e39334ea4acf99da32382-1200x800.jpg", label: "Liquid" },
  ]}
      result={{ src: "/images/flux3-image/regen/F2-102.webp" }}
      prompt="Fill the bottles in image 1 with the liquid from image 2, matching the color, texture, and translucency of the liquid. Then replace the pile of foam in image 1 with a realistic puddle of the liquid from image 2."
    />
  </Accordion>
</AccordionGroup>

***

### Logo & Branding

Place logos from one image onto objects or scenes in another.

<AccordionGroup>
  <Accordion title="Logo engraved in tree">
    <MultiRefMasonry
      inputs={[
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/83125b7b2b5fbe84b55c7031b52dadb8a640a1b1-1200x800.jpg", label: "Tree" },
    { src: "/images/flux3-image/regen/logo-ember-oak.webp", label: "Logo" },
  ]}
      result={{ src: "/images/flux3-image/regen/F2-104.webp" }}
      prompt="Engrave the logo from image 2 into the tree trunk in image 1"
    />
  </Accordion>

  <Accordion title="Smoke shaped as logo">
    FLUX.2 result:

    <MultiRefMasonry
      inputs={[
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/31d47345b8ee244203ff291ed7ca9e33fc19aa96-1200x675.jpg", label: "Smoke" },
    { src: "https://cdn.sanity.io/images/2gpum2i6/production/6e754bd689a380d5683120d8054185d365b2070a-1200x675.jpg", label: "Logo" },
  ]}
      result={{ src: "https://cdn.sanity.io/images/2gpum2i6/production/3c30e4c007520b47ed79974d023386b9d4190d04-1200x675.jpg", label: "FLUX.2 result" }}
      prompt="Shape the smoke in image 1 so that it forms the logo from image 2"
    />
  </Accordion>
</AccordionGroup>

***

## Checklist: vague to specific

| Instead of | Write | What it adds |
| - | - | - |
| “Combine these images” | “Place the couple from image 2 at the table in image 4, with the view from image 1 through the window.” | A role and a position for each image |
| “Use the style of the other one” | “Turn image 1 into the style of image 2, keeping the temple’s shape and layout.” | Which image is which, and what to keep |
| “Add the product” | “Put the bottle from image 3 on the counter in image 1, label facing the camera, lit by the window on the left.” | The product’s placement, orientation, and light |
| “Make them wear it” | “The person from image 1 wears the jacket from image 2 and stands in the kitchen from image 3.” | How the pieces relate |

<CardGroup cols={2}>
  <Card title="Single-reference editing" icon="pen-to-square" href="/guides/prompting_editing_single_reference">
    Write the instruction for one image, with a catalog of edit types.
  </Card>

  <Card title="Edit with boxes" icon="vector-square" href="/flux_3/flux3_image_bounding_boxes#edit-an-image">
    Place and anchor elements with box rows.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.