Structured image brief

How to turn an image into a JSON prompt

Use JSON to separate observations, decisions, and constraints—not to disguise a vague prompt as a technical one.

Editorial still life used to demonstrate a structured JSON image prompt
A structured prompt is valuable when the same visual analysis must be reviewed, edited, stored, or transformed for several outputs.

JSON is an interface, not a better adjective list.

Many image generators accept natural-language prompts, not arbitrary JSON objects. Wrapping the same sentence in braces does not automatically improve the image. JSON becomes useful when another person, script, database, or agent needs predictable fields.

Use a JSON image prompt when you need to compare references, power a form, store reusable brand constraints, generate several model-specific prompts, or keep an edit request separate from the source analysis. For one quick generation, a clear natural-language prompt may be simpler and better.

Ask where the structure will be consumed. If no tool reads the fields and no person needs to edit them separately, JSON may add ceremony without adding control.

Build the visual analysis first with the image-to-text prompt method. JSON is the container for that analysis, not a replacement for it.

Separate observation, instruction, and delivery.

A robust object keeps three kinds of information apart. This prevents a guessed observation from becoming a hard generation constraint and prevents model syntax from contaminating the reusable visual brief.

Source observation

What is visible in the reference: subject, environment, composition, light, color, materials, text, and uncertain details.

Creative instruction

What the new image should do: recreate, restyle, replace, edit, preserve, avoid, or leave open to interpretation.

Delivery settings

Target model, orientation, aspect ratio, output type, count, or downstream format. These settings may change without rewriting the visual analysis.

Rendered prompt

A readable natural-language prompt assembled from the chosen fields. Keep it for inspection, manual editing, and tools that do not accept JSON.

This layered design also makes provenance clearer. A field can say whether a value was observed, requested by the user, or inferred with uncertainty.

Choose fields that correspond to visual decisions.

A schema should be stable enough to reuse but not so detailed that every image produces dozens of empty properties. Start with the categories below and add domain-specific fields only when a real workflow needs them.

intent

recreate, edit, restyle, subject replacement, composition study, or creative brief

subject

primary subject, visible attributes, action, pose, and relationships

environment

setting, supporting objects, spatial context, weather, or time cues

composition

shot size, viewpoint, placement, crop, depth, leading lines, and negative space

lighting

source, direction, quality, contrast, shadow behavior, reflections, and atmosphere

visualStyle

medium, rendering treatment, palette behavior, texture, finish, and production context

constraints

preserve, change, avoid, and allow-to-vary lists

output

target model, orientation, aspect ratio, use case, and readable final prompt

The image prompt format guide provides the conceptual order behind these fields.

Complete example: editorial still life

The following object is valid JSON. It keeps source observations separate from the intended output and retains one natural-language prompt for direct use.

{
  "schemaVersion": "1.0",
  "intent": "subject_replacement",
  "sourceObservation": {
    "primarySubject": "matte charcoal ceramic vessel with flowering branches",
    "environment": "pale limestone plinth against a cool desaturated blue wall",
    "composition": {
      "shotSize": "close still life",
      "viewpoint": "slightly low three-quarter view",
      "subjectPlacement": "left of center",
      "negativeSpace": "open upper-left and right side",
      "depth": "shallow studio set with visible wall texture"
    },
    "lighting": {
      "source": "large window-like source from the left",
      "quality": "soft and directional",
      "shadow": "long feathered shadow falling right",
      "contrast": "low to medium"
    },
    "colorPalette": ["charcoal", "limestone", "desaturated blue", "soft cream"],
    "materials": ["matte ceramic", "limestone", "paper-textured wall"],
    "uncertain": ["exact lens", "physical scale of the set"]
  },
  "creativeInstruction": {
    "replaceSubjectWith": "rectangular clear-glass perfume bottle with matte charcoal cap",
    "preserve": [
      "subject placement",
      "camera height",
      "branch entering from upper right",
      "soft left-side light",
      "cool restrained palette",
      "calm editorial negative space"
    ],
    "change": [
      "add a controlled glass edge highlight",
      "add a faint amber liquid accent"
    ],
    "avoid": ["blown glass reflections", "floating product", "busy props"]
  },
  "output": {
    "orientation": "landscape",
    "aspectRatio": "3:2",
    "useCase": "editorial perfume campaign",
    "prompt": "Close editorial still life of a rectangular clear-glass perfume bottle with a matte charcoal cap, placed slightly left of center on a pale limestone plinth against a cool desaturated blue wall. A sparse flowering branch enters from the upper right. Soft directional light from the left creates a controlled glass edge highlight and a long feathered shadow. Restrained charcoal, cream, blue, and faint amber palette; tactile stone and paper textures; calm negative space; realistic refraction without blown highlights."
  }
}

The object is deliberately redundant in one place: the final prompt restates selected fields. That redundancy is useful because a person can inspect the exact string sent to a model while the structured fields remain available for editing.

For edits, make the change smaller than the preserve list.

Image-edit requests often fail because the prompt describes the desired change but never states what must remain stable. A compact edit object can make that boundary explicit.

{
  "intent": "focused_edit",
  "change": {
    "target": "umbrella",
    "instruction": "replace the red umbrella with a transparent dome umbrella",
    "materialBehavior": "clear wet plastic with subtle blue-hour reflections"
  },
  "preserve": [
    "person identity and pose",
    "centered one-point perspective",
    "concrete corridor geometry",
    "camera position and crop",
    "wet pavement reflections",
    "cool blue-hour lighting"
  ],
  "avoid": [
    "moving the subject",
    "changing clothing",
    "adding extra people",
    "warming the overall color grade"
  ]
}

This format is useful even when the final editor expects prose. It forces the requester to identify the edit target, its intended visual behavior, and the invariants that define continuity.

Keep the JSON valid and predictable.

JSON is a strict data format. The official definition is RFC 8259. Valid JSON uses double-quoted property names and string values, does not allow comments, and does not allow trailing commas.

  • Use arrays for multiple independent values. Palette colors, preserve items, and exclusions are easier to edit as arrays than as comma-packed strings.
  • Use objects for categories with internal structure. Composition and lighting benefit from named subfields.
  • Use null for known missing values. Do not write an empty string when a field was checked but unavailable.
  • Omit fields that do not apply. An object with twelve empty categories is harder to review than a smaller truthful one.
  • Version the schema. If automation depends on field names, a schemaVersion makes later changes manageable.
  • Keep values semantically consistent. Decide whether shot sizes use “close-up” or “close_up” and apply the choice across records.
Looks like JSON

{ style: 'cinematic', colors: blue, red, }

Valid JSON

{ "visualStyle": "cinematic architectural photography", "colorPalette": ["blue-gray", "red accent"] }

Render a readable prompt from selected fields.

Do not send every stored field blindly. A prompt renderer should select and order the information that matters for the target task.

  1. Start with the requested output and primary subject.
  2. Add action, environment, and the most important relationships.
  3. Add composition and camera language.
  4. Add light, color, materials, and style.
  5. Append narrow constraints or model settings.
  6. Remove duplicate phrases created by fields that overlap.

Simple rendering rule

subject → environment → composition → lighting → palette/materials → style → constraints

Edit rendering rule

change target + desired result → preserve list → narrow avoid list

Before automating this step, compare the output with the annotated natural-language examples. Structured fields are only successful when the rendered prompt remains coherent.

Avoid structure that creates false confidence.

Invented precision

Exact lenses, locations, identities, and style labels should not appear as facts when the image cannot establish them.

One giant description field

If all information lives in a single string, JSON provides no practical editing or validation advantage.

Over-nested schemas

Deep objects are expensive to maintain. Add levels only when a person or program needs to address those values separately.

Model-specific lock-in

Keep reusable observations separate from parameters so the same analysis can support another image model later.

Start with a smaller reusable template.

Use this structure when you do not yet know which fields your workflow needs. Expand it only after real examples expose a missing category.

{
  "schemaVersion": "1.0",
  "intent": "recreate | edit | restyle | replace_subject",
  "subject": {},
  "environment": {},
  "composition": {},
  "lighting": {},
  "colorPalette": [],
  "materials": [],
  "visualStyle": {},
  "constraints": {
    "preserve": [],
    "change": [],
    "avoid": [],
    "allowToVary": []
  },
  "output": {
    "targetModel": null,
    "aspectRatio": null,
    "prompt": ""
  }
}

Generate a prompt from your image, then use this template to separate the resulting visual description into fields only when your workflow benefits from the structure.