Text2Image _O
Render real text into an image for ControlNet
- IMAGE
Diffusion models are famously bad at spelling. The trick that actually works is to stop asking the model to write text and instead give it text to look at: render the word on a canvas, feed that as a ControlNet condition, and let the model regenerate the scene while honoring the letter shapes. Text2Image _O is the renderer half of that trick - it takes a string and draws it onto a canvas, outputting a proper IMAGE tensor.
It's under O/text in the Quality of Life Suit. The ControlNet knowledge base essay calls out this exact pattern - embedding patterns like text, logos, and barcodes via spatial conditioning - and this node is one of the easiest ways to produce the text plate for it. Beyond ControlNet, it's handy for quick watermarks, title cards, or feeding a text mask into an inpainting workflow.
How it works
Under the hood it's PIL: the text is drawn with ImageFont.truetype and ImageDraw, then converted to a normalized float tensor (/255) and shaped into an IMAGE. The canvas dimensions are enforced to a multiple of 8, which keeps the output latent-friendly if you route it toward a sampler.
The inputs that matter
text- the string to draw (multiline).font- a dropdown of the fonts in the pack'sfonts/folder. Ships with Calibri, Comic Sans (regular/italic/bold), and Alkatra. To add your own, drop a.ttf,.otf, or.ttcintocustom_nodes/ComfyUI-QualityOfLifeSuit_Omar92/fonts/and restart ComfyUI - it appears in the dropdown automatically.size- font size in points (0–255, default 36).font_R/G/B/Aandbackground_R/G/B/A- RGBA colors, each channel 0–255. Default black text on white.width/height- canvas size in pixels (defaults 128×128).expand-true(default) auto-grows the canvas to fit the text;falsekeeps your canvas and clips.x/y- where the text lands. The node centers the text on(x, y)and clamps it to stay on-canvas, so these behave like a "focus point" rather than a raw top-left coordinate.
Output: one IMAGE.
Installing
cd ComfyUI/custom_nodes
git clone https://github.com/omar92/ComfyUI-QualityOfLifeSuit_Omar92.git
or ComfyUI Manager → search ComfyUI-QualityOfLifeSuit_Omar92, then restart. The fonts ship with the pack; no model downloads.
Gotchas and honest advice
- Keep
expandon unless you have a specific canvas in mind; a text string longer than the canvas silently gets clamped (the draw position is pushed back on-canvas, so the tail can get cut off). - The output is a flat text plate - it works best as a ControlNet/inpaint seed, not as "generated text." For truly embedded text in a scene, pair it with a ControlNet and let img2img/denoise do the blending. If you skip ControlNet and just feed the plate to a sampler at high denoise, the model will mostly ignore it. That's the one mistake people make here: they expect the plate itself to be the final image, and it isn't.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | — | |
| font | COMBO | CALIBRI.TTF | 5 options: CALIBRI.TTF, COMICZ.TTF, Alkatra.ttf, COMICI.TTF, COMIC.TTF |
| size | INT | 360–255 | — |
| font_R | INT | 00–255 | — |
| font_G | INT | 00–255 | — |
| font_B | INT | 00–255 | — |
| font_A | INT | 2550–255 | — |
| background_R | INT | 2550–255 | — |
| background_G | INT | 2550–255 | — |
| background_B | INT | 2550–255 | — |
| background_A | INT | 2550–255 | — |
| width | INT | 128 | — |
| height | INT | 128 | — |
| expand | COMBO | true | 2 options: true, false |
| x | INT | 0 | — |
| y | INT | 0 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |