{"course":{"slug":"ai-images","title":"Image Generation, in Practice","url":"https://addaly.com/learn/ai-images","level":"beginner","track":"create"},"lesson":{"slug":"text-in-images","title":"Type is set, not generated","url":"https://addaly.com/learn/ai-images/text-in-images","position":45,"of":69,"minutes":8,"answer":"Generated text fails at unusual words, small sizes and long strings because a diffusion model renders letterforms as visual texture rather than assembling glyphs.","keyIdea":"Generated text fails at unusual words, small sizes and long strings because a diffusion model renders letterforms as visual texture rather than assembling glyphs, so any text that must be correct is set in a type tool over a clean plate."},"body":{"format":"markdown","text":"## What the model is doing with letters\n\nA diffusion model has no glyphs and no notion of spelling. It has learned what text *looks like* in photographs: the visual texture of a shop sign, the arrangement of marks on a book spine, the rhythm of a paragraph. When it produces text it is producing that texture, and sometimes the texture happens to spell something.\n\nNewer models do markedly better, because they were trained with better captions and stronger text encoders, and short common words in large clear type now land often. But the mechanism has not changed, and that tells you exactly where it will still fail:\n\n> Figure: What is still wrong with generated letters, and what type gives you. Where a model still fails: Long strings: error accumulates per character; Unusual words, brand names, proper nouns; Small text, for the same reason hands fail; Devanagari, Arabic, Tamil and other joined scripts; A specific typeface, weight, tracking and alignment. What setting the type gives you: Correct spelling at any length; The brand's actual typeface; Copy a client can change without regenerating; Kerning, tracking and alignment you control; Vector, so it stays sharp at any size. This separation is not a workaround waiting for better models. Type and image are edited on different schedules, in different tools, by different people, which is why no newspaper has ever photographed its headlines.\n\n- **Long strings.** Error accumulates per character.\n- **Unusual words.** Brand names, proper nouns, anything not common in training text.\n- **Small text.** Not enough pixels, the same problem as hands.\n- **Non-Latin scripts.** Devanagari, Arabic, Chinese, Tamil: thinner training coverage, and in scripts with contextual joining or conjuncts the failures are severe and frequently nonsensical.\n- **Exact typography.** A specific typeface, weight, tracking and alignment.\n\n## The professional answer\n\nYou do not generate text. You generate a clean plate (the image with an empty area where the text goes) and you set the type in a type tool.\n\nThis is not a compromise. It is how every poster, advertisement and book cover you have ever seen was made. The photograph and the typography were always separate operations, and nobody would dream of asking a camera to render a headline.\n\nThe free tools are complete:\n\n- **Inkscape**: vector, full typographic control, exports print-ready PDF. The right tool for a poster or any layout.\n- **GIMP** or **Krita**: raster type over an image. Fine for social assets.\n- **Scribus**: page layout, for anything multi-page or going to a commercial printer.\n- **Photopea**: in a browser, reads PSD, useful on a locked-down machine.\n\n## The workflow\n\n1. Generate with the text area planned as quiet space, as the brief block set out. Prompt for `plain wall`, `overcast sky`, `dark background` in that region.\n2. Do not prompt for text at all. Asking for a sign and then covering it wastes effort and often produces garbled marks that show through.\n3. Open the plate in your type tool.\n4. Set the type. Check contrast against the background: 4.5:1 minimum for body-sized text is the accessibility threshold and a good rule generally.\n5. If the background is busy, add a scrim: a soft dark gradient or a semi-transparent panel behind the type. Cheap, and it works.\n\n## When you want the text to be in the scene\n\nSometimes the type has to look like it belongs to the world: a shop sign in perspective, a label on a bottle, a book cover on a table.\n\nThe method is the same, with one more step:\n\n1. Generate the scene with a blank sign, blank label or plain spine.\n2. Set the type flat in your tool.\n3. Transform it to match the surface: Perspective transform in GIMP, or a free-transform in Photopea.\n4. Match its behaviour to the scene: reduce opacity slightly, apply the same blur if the surface is out of focus, add the same grain, and multiply or overlay it so the surface texture shows through.\n\nThat fourth step is what separates a convincing result from an obvious paste-on. A perfectly crisp, perfectly opaque piece of type on a slightly soft, grainy photograph announces itself immediately.\n\n## When generated text is acceptable\n\nTwo cases, and only two.\n\n**Decorative illegibility.** Background signage in a street scene that nobody will read. Here garbled text is fine, except when it accidentally spells something, which is a real risk and belongs on the forbidden-list check.\n\n**A rough concept for internal review.** Showing a client where a headline will sit, clearly marked as placeholder.\n\nAnything a viewer will actually read gets set properly.\n\n## The limitation that will not go away soon\n\nEven where a model renders a short word correctly, it has no typographic control. You cannot specify the typeface, the weight, the tracking, the alignment or the exact size, and brand work is defined by exactly those things. A brand's typeface is usually its second-most-protected asset after the logo.\n\nSo the separation of image and type is not a temporary workaround to be abandoned when models improve. It is the correct structure for the work, because type and image are edited on different schedules, in different tools, by different people, and a headline needs to be changeable without regenerating a photograph. Even if a model rendered perfect type tomorrow, you would still set it separately, for the same reason a newspaper does not photograph its headlines."},"check":{"question":"Why is setting type in a separate tool the correct approach rather than a temporary workaround for current model limitations?","options":[{"text":"Because diffusion models will always render letterforms as texture, so generated text can never be reliable at any quality level.","correct":false,"tempting":"Overclaims permanence: short common words already render correctly on several models, and the argument for separation does not depend on failure rates."},{"text":"Because vector type scales to any output size without resampling, whereas generated raster letterforms degrade once they are enlarged to print resolution.","correct":false,"tempting":"A genuine advantage and not the main one; a raster headline at 300 dpi is perfectly adequate, while the inability to specify a typeface is not."},{"text":"Because typeface, weight, tracking and alignment cannot be expressed in a prompt, and a headline must be editable without regenerating the picture.","correct":true},{"text":"Because generated text may accidentally reproduce a trademarked wordmark or an unfortunate string, creating a rights problem that deliberately set type avoids entirely.","correct":false,"tempting":"A real hazard covered by the forbidden list, but it is a side issue rather than the structural reason for separating the two operations."}]},"prev":{"slug":"hands-eyes-teeth","title":"The three repairs everybody needs, with settings","url":"https://addaly.com/learn/ai-images/hands-eyes-teeth"},"next":{"slug":"outpainting-the-crop","title":"Extending a frame when the crop changes","url":"https://addaly.com/learn/ai-images/outpainting-the-crop"},"authorship":"Founder and series editor: Dr Mustafa Mun. Written by AI models to a written standard. Exam keys checked blind by a second model: 3,665 of 3,666 agreed. Academic review invited.","review":{"status":"Draft, open for academic review"},"cite":"Addaly (2026) 'Type is set, not generated', in Image Generation, in Practice. Edited by M. Mun. Addaly. Available at: https://addaly.com/learn/ai-images/text-in-images (Accessed: 13 October 2026).","licence":{"name":"CC BY-NC-SA 4.0","url":"https://creativecommons.org/licenses/by-nc-sa/4.0/"},"reader":{"schema":1,"title":"Type is set, not generated","courseTitle":"Image Generation, in Practice","module":{"index":5,"slug":"repair-and-extend","title":"Repair, extend, assemble"},"answer":null,"keyIdea":"Generated text fails at unusual words, small sizes and long strings because a diffusion model renders letterforms as visual texture rather than assembling glyphs, so any text that must be correct is set in a type tool over a clean plate.","hero":{"kind":"figure","figure":{"t":"figure","label":"Figure","figure":{"left":{"title":"Where a model still fails","items":["Long strings: error accumulates per character","Unusual words, brand names, proper nouns","Small text, for the same reason hands fail","Devanagari, Arabic, Tamil and other joined scripts","A specific typeface, weight, tracking and alignment"]},"type":"compare","right":{"title":"What setting the type gives you","items":["Correct spelling at any length","The brand’s actual typeface","Copy a client can change without regenerating","Kerning, tracking and alignment you control","Vector, so it stays sharp at any size"]},"title":"What is still wrong with generated letters, and what type gives you","caption":"This separation is not a workaround waiting for better models. Type and image are edited on different schedules, in different tools, by different people, which is why no newspaper has ever photographed its headlines."},"alt":"Figure: What is still wrong with generated letters, and what type gives you. Where a model still fails: Long strings: error accumulates per character; Unusual words, brand names, proper nouns; Small text, for the same reason hands fail; Devanagari, Arabic, Tamil and other joined scripts; A specific typeface, weight, tracking and alignment. What setting the type gives you: Correct spelling at any length; The brand’s actual typeface; Copy a client can change without regenerating; Kerning, tracking and alignment you control; Vector, so it stays sharp at any size. This separation is not a workaround waiting for better models. Type and image are edited on different schedules, in different tools, by different people, which is why no newspaper has ever photographed its headlines."}},"blocks":[{"t":"h2","id":"what-the-model-is-doing-with-letters","runs":[{"text":"What the model is doing with letters"}]},{"t":"p","runs":[{"text":"A diffusion model has no glyphs and no notion of spelling. It has learned what text "},{"text":"looks like","i":true},{"text":" in photographs: the visual texture of a shop sign, the arrangement of marks on a book spine, the rhythm of a paragraph. When it produces text it is producing that texture, and sometimes the texture happens to spell something."}]},{"t":"p","runs":[{"text":"Newer models do markedly better, because they were trained with better captions and stronger text encoders, and short common words in large clear type now land often. But the mechanism has not changed, and that tells you exactly where it will still fail:"}]},{"t":"ul","items":[[{"text":"Long strings.","b":true},{"text":" Error accumulates per character."}],[{"text":"Unusual words.","b":true},{"text":" Brand names, proper nouns, anything not common in training text."}],[{"text":"Small text.","b":true},{"text":" Not enough pixels, the same problem as hands."}],[{"text":"Non-Latin scripts.","b":true},{"text":" Devanagari, Arabic, Chinese, Tamil: thinner training coverage, and in scripts with contextual joining or conjuncts the failures are severe and frequently nonsensical."}],[{"text":"Exact typography.","b":true},{"text":" A specific typeface, weight, tracking and alignment."}]]},{"t":"h2","id":"the-professional-answer","runs":[{"text":"The professional answer"}]},{"t":"p","runs":[{"text":"You do not generate text. You generate a clean plate (the image with an empty area where the text goes) and you set the type in a type tool."}]},{"t":"p","runs":[{"text":"This is not a compromise. It is how every poster, advertisement and book cover you have ever seen was made. The photograph and the typography were always separate operations, and nobody would dream of asking a camera to render a headline."}]},{"t":"p","runs":[{"text":"The free tools are complete:"}]},{"t":"ul","items":[[{"text":"Inkscape","b":true},{"text":": vector, full typographic control, exports print-ready PDF. The right tool for a poster or any layout."}],[{"text":"GIMP","b":true},{"text":" or "},{"text":"Krita","b":true},{"text":": raster type over an image. Fine for social assets."}],[{"text":"Scribus","b":true},{"text":": page layout, for anything multi-page or going to a commercial printer."}],[{"text":"Photopea","b":true},{"text":": in a browser, reads PSD, useful on a locked-down machine."}]]},{"t":"h2","id":"the-workflow","runs":[{"text":"The workflow"}]},{"t":"ol","start":1,"items":[[{"text":"Generate with the text area planned as quiet space, as the brief block set out. Prompt for "},{"text":"plain wall","code":true},{"text":", "},{"text":"overcast sky","code":true},{"text":", "},{"text":"dark background","code":true},{"text":" in that region."}],[{"text":"Do not prompt for text at all. Asking for a sign and then covering it wastes effort and often produces garbled marks that show through."}],[{"text":"Open the plate in your type tool."}],[{"text":"Set the type. Check contrast against the background: 4.5:1 minimum for body-sized text is the accessibility threshold and a good rule generally."}],[{"text":"If the background is busy, add a scrim: a soft dark gradient or a semi-transparent panel behind the type. Cheap, and it works."}]]},{"t":"h2","id":"when-you-want-the-text-to-be-in-the-scene","runs":[{"text":"When you want the text to be in the scene"}]},{"t":"p","runs":[{"text":"Sometimes the type has to look like it belongs to the world: a shop sign in perspective, a label on a bottle, a book cover on a table."}]},{"t":"p","runs":[{"text":"The method is the same, with one more step:"}]},{"t":"ol","start":1,"items":[[{"text":"Generate the scene with a blank sign, blank label or plain spine."}],[{"text":"Set the type flat in your tool."}],[{"text":"Transform it to match the surface: Perspective transform in GIMP, or a free-transform in Photopea."}],[{"text":"Match its behaviour to the scene: reduce opacity slightly, apply the same blur if the surface is out of focus, add the same grain, and multiply or overlay it so the surface texture shows through."}]]},{"t":"p","runs":[{"text":"That fourth step is what separates a convincing result from an obvious paste-on. A perfectly crisp, perfectly opaque piece of type on a slightly soft, grainy photograph announces itself immediately."}]},{"t":"h2","id":"when-generated-text-is-acceptable","runs":[{"text":"When generated text is acceptable"}]},{"t":"p","runs":[{"text":"Two cases, and only two."}]},{"t":"p","runs":[{"text":"Decorative illegibility.","b":true},{"text":" Background signage in a street scene that nobody will read. Here garbled text is fine, except when it accidentally spells something, which is a real risk and belongs on the forbidden-list check."}]},{"t":"p","runs":[{"text":"A rough concept for internal review.","b":true},{"text":" Showing a client where a headline will sit, clearly marked as placeholder."}]},{"t":"p","runs":[{"text":"Anything a viewer will actually read gets set properly."}]},{"t":"h2","id":"the-limitation-that-will-not-go-away-soon","runs":[{"text":"The limitation that will not go away soon"}],"role":"limit"},{"t":"p","runs":[{"text":"Even where a model renders a short word correctly, it has no typographic control. You cannot specify the typeface, the weight, the tracking, the alignment or the exact size, and brand work is defined by exactly those things. A brand’s typeface is usually its second-most-protected asset after the logo."}]},{"t":"p","runs":[{"text":"So the separation of image and type is not a temporary workaround to be abandoned when models improve. It is the correct structure for the work, because type and image are edited on different schedules, in different tools, by different people, and a headline needs to be changeable without regenerating a photograph. Even if a model rendered perfect type tomorrow, you would still set it separately, for the same reason a newspaper does not photograph its headlines."}]}],"check":{"question":[{"text":"Why is setting type in a separate tool the correct approach rather than a temporary workaround for current model limitations?"}],"options":[{"text":[{"text":"Because diffusion models will always render letterforms as texture, so generated text can never be reliable at any quality level."}],"correct":false,"tempting":[{"text":"Overclaims permanence: short common words already render correctly on several models, and the argument for separation does not depend on failure rates."}]},{"text":[{"text":"Because vector type scales to any output size without resampling, whereas generated raster letterforms degrade once they are enlarged to print resolution."}],"correct":false,"tempting":[{"text":"A genuine advantage and not the main one; a raster headline at 300 dpi is perfectly adequate, while the inability to specify a typeface is not."}]},{"text":[{"text":"Because typeface, weight, tracking and alignment cannot be expressed in a prompt, and a headline must be editable without regenerating the picture."}],"correct":true,"tempting":null},{"text":[{"text":"Because generated text may accidentally reproduce a trademarked wordmark or an unfortunate string, creating a rights problem that deliberately set type avoids entirely."}],"correct":false,"tempting":[{"text":"A real hazard covered by the forbidden list, but it is a side issue rather than the structural reason for separating the two operations."}]}],"order":[3,1,0,2],"why":null},"prev":{"slug":"hands-eyes-teeth","title":"The three repairs everybody needs, with settings","minutes":8},"next":{"slug":"outpainting-the-crop","title":"Extending a frame when the crop changes","minutes":8}}}