How to prompt ChatGPT to make an image
Do two things and stop. Generate the line from your picture first, then write the one sentence measurement cannot produce: what you actually want. Everything the tool writes is a number comparison, and the most human-sounding clause it has — the mood — is not a separate opinion. It is computed from the same three measurements as exposure, contrast and colour temperature, which means four of the sixteen exposure × mood combinations cannot occur at all: a sweep of 3,748,096 synthetic measurements produced only 12 of the 16 cells. Say the opposite yourself and nothing argues back. In 480 of 480 lines your contrary sentence became the first fragment, at weight 1, sitting in the same line as the word it contradicts.
What was measured. Forty real files — 39 stock photographs at 640 × 360 and 800 × 450, plus one code screenshot — decoded on this machine and box-downsampled to the 192 × 192 grid the live tool measures on, then composed into all four shapes at three lengths: 480 lines. Every edited line was read back through parsePrompt, outOfRange and toExplicit from this site’s own weight parser. The structural sweep calls this site’s describe() on synthetic measurement values. No model was called and no image was generated anywhere in this page.
The question splits in two. Making the image happens inside ChatGPT; this site runs the other direction, picture to text, and hands you a line that already describes your file in numbers it measured. So the useful answer is not a list of magic words. It is knowing exactly which parts of that line are locked to your file, which parts can never disagree with each other, and where the one sentence you write yourself should go.
Twelve slots, and every one reads a number
Nothing on this line is a guess about your photograph. Each clause is one plain comparison against a measured value, and the code says which comparison it is. That matters for how you prompt: if a clause is wrong for your picture, there is a number behind it you can argue with.
| Slot | What it reads | What the 40 photographs produced |
|---|---|---|
| framing | m.ar | 1 of 8 values: widescreen 16:9, 40 / 40 |
| exposure | m.meanL | 4 of 4: 16 moderate · 9 well-lit · 9 dark · 6 bright |
| contrast | m.stdL | 3 of 3: 28 medium · 7 high · 5 soft |
| saturation | m.monoRatio, m.meanSat | 4 of 4: 17 moderate · 14 muted · 5 vivid · 4 monochrome |
| temperature | m.meanR − m.meanB | 5 of 5: 12 warm · 10 neutral · 7 slightly warm · 7 cool · 4 slightly cool |
| detail | m.edge | 3 of 3: 22 intricate · 14 moderate · 4 smooth |
| light distribution | m.centreL / m.borderL | 3 of 3: 21 even · 15 centre-lit · 4 brighter edges |
| vertical balance | m.topL / m.bottomL | 22 brighter upper · 12 empty · 6 brighter lower |
| mood | m.meanL + m.stdL + meanR − meanB | 4 of 4: 16 moody · 14 balanced · 5 uplifting · 5 calm |
| subject | m.monoRatio | 36 empty · 4 black and white photograph |
Look at the mood row. It is the only slot that reads three numbers, and all three of them are already being read by other slots. That is the whole story of this page: the atmosphere clause is not a second opinion about your picture, it is a second use of the same three values. Which means it can contradict you, but it can never contradict its own neighbours.
Sixteen cells, and four of them cannot happen
Exposure has four possible values and mood has four, so a plain 4 × 4 grid has sixteen cells. To find out how many of those cells the code can actually reach, we called this site’s describe() on a synthetic grid of measurements — mean lightness from 0 to 255, lightness spread from 0 to 120, and red-minus-blue from −60 to 60, every integer — which is 3,748,096 combinations. Twelve of the sixteen cells appeared. Four never did, not once.
| Exposure ↓ / Mood → | Moody and dramatic | Balanced, natural | Calm and cool | Bright and uplifting |
|---|---|---|---|---|
| Bright, high-key lighting | 0 | 1 | 3 | 2 |
| Well-lit, balanced exposure | 2 | 4 | 0 | 3 |
| Moderate, slightly dim lighting | 5 | 9 | 2 | — |
| Dark, low-key lighting | 9 | — | — | — |
The bottom row is the interesting one. A dark exposure, taken alone, already forces the mood: all nine of the dark files came out moody and dramatic atmosphere, nine out of nine, and the sweep says that is not luck — a dark file can never come out calm, balanced or uplifting. The same grid run against contrast and temperature gives 2 impossible cells out of 12 for contrast × mood, and 8 out of 20 for temperature × mood.
Now the other direction. On the 40 real files, temperature × mood walked into 12 of its 20 cells, which is exactly the structural maximum — these files reached every cell the code allows. Contrast × mood reached 9 of the 10 that are possible. And pairs that read different numbers fill almost everything: exposure × contrast reached 11 of 12, exposure × detail 11 of 12, contrast × temperature 12 of 15. Slots sharing a measurement are constrained; slots that read separate numbers are nearly free.
One cell in that table looks like a contradiction and is not. Two files — one at mean lightness 151.96 with spread 89.04, the other at 161.09 with spread 87.01 — came out well-lit and moody in the same line. The uplifting clause needs two things at once, lightness above 150 and red-minus-blue above 5. Both files clear the first and fail the second, at −1.93 and 1.20, so the test falls through to the spread, where 89.04 and 87.01 clear 68 and the line turns moody. That is the only opposition the code permits. It happened on 2 of 40 files, which is 8 of the 480 lines, and only at the long length, because the mood clause exists only there: 160 of the 480 lines carry an atmosphere clause at all.
Say the opposite and nothing argues back
So you want a bright, airy picture and your file is dark. You can say so. Take the line, put your sentence at the very front, and send both. We did this on all 480 lines: files whose measurement said dark or dim got bright sunlit daylight in front, files whose measurement said bright or well-lit got dark moody low-key. Both are three words and carry no comma, on purpose.
| Shape | Characters added | Fragments added | Your sentence lands at | Weight | Share (median) | Share (range) |
|---|---|---|---|---|---|---|
| Midjourney | +20 / +24 | +1 | first fragment, 120 / 120 | 1 | 7.35% | 5.2–12.2% |
| Stable Diffusion | +20 / +24 | +1 | first fragment, 120 / 120 | 1 | 6.9% | 4.9–11.1% |
| Flux | +20 / +24 | +1 | first fragment, 120 / 120 | 1 | 9.2% | 5.6–17.7% |
| DALL·E | +20 / +24 | +1 | first fragment, 120 / 120 | 1 | 9.6% | 6.2–18.8% |
Every single line behaved the same: 480 of 480 put your sentence in the first fragment at weight 1, added exactly one fragment, and left the out-of-range count and the round-trip exactly as they were before you touched anything. Nothing in the parser adjudicates meaning. It cuts on commas and reads weights; it does not know that bright and dark are opposites. Here is a dark file — mean lightness 34.51 — on the ChatGPT shape, before and after:
A widescreen 16:9 image, dark, low-key lighting, with a palette of navy, grey, slate, silver. Vivid, saturated colour, cool blue colour temperature, highly detailed with intricate texture. Moody and dramatic atmosphere. bright sunlit daylight, A widescreen 16:9 image, dark, low-key lighting, with a palette of navy, grey, slate, silver. Vivid, saturated colour, cool blue colour temperature, highly detailed with intricate texture. Moody and dramatic atmosphere.
Before any editing, 8 of the 480 lines already contained a darkness word and a brightness word at once — those 8 are the two wide-range files described above. After editing, 480 of 480 do, and the parser flags none of them. If you want your intention to outrank the measurement, write it as a weight rather than a louder adjective: (bright sunlit daylight:1.4) reads back as 1.4 in all four shapes and adds no out-of-range fragment on the three shapes that started clean.
The clause you want to push carries a comma
The obvious next move is to push down whatever you dislike instead. Try it on the exposure clause and you hit a small structural fact: every one of the four exposure values contains a comma. dark, low-key lighting is one clause to a reader and two fragments to the parser, and the parser is the thing that reads weights.
| Shape | Clause length | Commas inside it | Exactly two fragments | Welded to neighbours | Fragments touching the clause |
|---|---|---|---|---|---|
| Midjourney | 22–31 | 1 | 40 / 40 | 0 / 40 | 2 in 13, 3 in 24, 4 in 3 |
| Stable Diffusion | 22–31 | 1 | 40 / 40 | 0 / 40 | 2 in 13, 3 in 24, 4 in 3 |
| Flux | 22–31 | 1 | 0 / 40 | 40 / 40 | 2 in 18, 3 in 20, 4 in 2 |
| DALL·E | 22–31 | 1 | 40 / 40 | 0 / 40 | 2 in 24, 3 in 14, 4 in 2 |
On three shapes the clause is cleanly two fragments and you can weight each half on its own. On Flux it is not: that shape ends sentences with full stops and never puts a comma between them, so the fragment holding bright also holds the framing sentence in front of it, and the fragment holding high-key lighting also holds the whole palette sentence behind it. Those fragments run to a median of 48 characters and as long as 151. Wrap the whole clause anyway and see what the parser does:
A widescreen 16:9 image. (Bright, high-key lighting:0.6). The dominant colours are silver, moss green, cream, grey. Muted, desaturated tones, neutral colour temperature. Moderate detail and texture. Evenly lit. Balanced, natural atmosphere. reads back as: Bright @1.10 high-key lighting @0.60
The half before the comma gets 1.10, the half after it gets the 0.60 you asked for. That happened on 40 of 40 files in all four shapes, and writing the line out explicitly and reading it back again changed nothing, 40 of 40. On the two list shapes the same wrap looks like this:
masterpiece, best quality, widescreen 16:9 composition, (well-lit, balanced exposure:0.6), dominant palette of tan, brown, olive, moderately saturated colour, warm golden colour temperature, medium contrast, moderate detail and texture, evenly lit, brighter upper half, bright and uplifting atmosphere reads back as: well-lit @1.10 balanced exposure @0.60
One more wrinkle worth knowing before you go hunting for a clause to weight. On 27 of the 40 Midjourney and Stable Diffusion lines, and 16 of the 40 DALL·E lines, a third fragment also contains one of the clause’s words — usually moderate sitting inside moderately saturated colour, or bright inside brighter upper half. Searching by word finds those; the parser does not care about words, only about where the commas are.
What to do with the line, in four steps
- Generate first, then write one sentence. The line already carries measurements taken from your file on a 192 × 192 grid. Your job is the part no measurement can produce: what you want the picture to be.
- Put that sentence at the front, and keep it free of commas. One comma-free clause became the first fragment at weight 1 in 480 of 480 lines, cost 20 or 24 characters, and added exactly one fragment. A comma inside your sentence splits it into two fragments instead.
- Do not expect the line to agree with you, and do not wait for it to. Nothing in the parser resolves contradictions: after saying the opposite of what was measured, all 480 lines carried both words and none was flagged.
- If you must push a clause down, weight the half after the comma, or the whole clause knowing what it costs. Wrapping an exposure clause at 0.6 gave the first half 1.10 and the second half 0.60 in 40 of 40 files in every shape. Raising your own sentence to 1.4 stays inside the usable band.
Forty files, one synthetic sweep, four hundred and eighty lines
Forty real files — 39 stock photographs at 640 × 360 and 800 × 450, plus one code screenshot — were decoded on this machine and box-downsampled to 192 × 192, the grid the live tool measures on, so every figure here matches what this site would tell you for the same file. Each was composed into all four shapes at three lengths: 480 lines. The structural sweep calls this site’s describe() with synthetic measurement values — mean lightness 0–255, spread 0–120, red-minus-blue −60–60, step 1, 3,748,096 combinations — and records which clause pairs ever appear; nothing about those numbers depends on the photographs. Every edited line was read back through parsePrompt and checked with outOfRange against the 0.4–1.6 band and with toExplicit for the round-trip. Where this page says a fragment “reads back as” some weight, that is the parser’s answer, not a claim about what any generator will draw. No model was called, no image was generated, and nothing here is taken from another site’s wording.
What goes into the box, at the end
Two sentences, in this order: the line this tool wrote about your file, then the one thing you want that no measurement could have produced. On the ChatGPT shape that line is a short piece of prose rather than a tag list, and it is worth knowing the shape of the line this site writes for ChatGPT before you edit it. For the numbers behind every clause, see what an image to prompt tool measures; for producing that line from a picture, see how to generate a prompt from an image; for what a weight does to a fragment and where the 0.4–1.6 band comes from, see how weighting and negatives work; and for the closed vocabulary every clause is drawn from, see what an image describer actually writes.