| name | render |
| description | Generate raster images (PNG, JPEG, WebP) from natural language prompts using Python rendering engines. Covers graphics, charts, layouts, and procedural art. Not for SVG output.
|
Rasterize — Multi-Engine Raster Image Generation
Generate professional raster images by routing each request to the best
rendering engine. You write Python code; the engine does the pixel work.
Quick Start
- Read the user's request
- Pick an engine using the routing table below
- Read the engine's reference doc from
./references/
- Write a self-contained Python script that outputs to the target path
- Run the script using
pdm run python <script.py> (to use the plugin's venv), verify the output, deliver the image
Environment: This plugin uses a pdm-managed virtual environment.
Always run generation scripts with pdm run python from the plugin root.
If pdm is not set up yet, run python scripts/setup.py first.
Engine Routing Table
| Request type | Engine | Reference file |
|---|
| Photo manipulation, compositing, filters, pixel ops, simple graphics | Pillow | ./references/pillow.md |
| Clean vector-style graphics, logos, icons, anti-aliased shapes, typography-heavy designs | Cairo | ./references/cairo.md |
| Statistical charts, scientific plots, data visualization (static) | Matplotlib + Seaborn | ./references/matplotlib.md |
| Complex interactive-looking dashboards, rich data viz with annotations | Plotly (static export) | ./references/plotly.md |
| Complex layouts, HTML/CSS designs, UI mockups, anything with web fonts or CSS effects | Playwright (HTML→PNG) | ./references/playwright.md |
Routing decision hints
- If the request mentions "chart", "plot", "graph", "histogram", "scatter",
"heatmap", or data columns → Matplotlib/Seaborn (or Plotly for
fancier output)
- If the request is about a logo, icon, badge, geometric design, or
anything that needs crisp anti-aliased curves → Cairo
- If the request says "banner", "social media post", "thumbnail" with
text overlays on photos → Pillow
- If the request describes a full-page layout, poster with complex
typography, card design, or UI mockup → Playwright
- If the request is about generative/procedural/algorithmic art → Cairo
(or Pillow if it's pixel-manipulation art like fractals)
- When in doubt between Pillow and Cairo → prefer Cairo (better quality)
- When in doubt between Matplotlib and Plotly → prefer Matplotlib
(simpler, faster)
Multi-engine compositions
Some requests need two engines. Common combos:
- Matplotlib → Pillow: Generate a chart, then composite it onto a
branded background with logos and text overlays
- Cairo → Pillow: Draw clean vector shapes, then apply raster effects
(blur, noise, texture)
- Playwright → Pillow: Render an HTML layout, then crop/resize/optimize
When combining engines, save intermediate outputs as temporary PNGs and
load them in the second engine.
Shared References
These files contain cross-engine patterns — read them before the engine docs:
./shared/setup.md — Installation, pdm setup, running scripts
./shared/fonts.md — Font directory resolution, per-engine loading, font selection guide
./shared/canvas.md — Dimensions, size presets, retina scaling, output saving (PNG/JPEG/WebP)
./shared/themes.md — Dark/light themes, color tokens, categorical/sequential/diverging palettes
Workspace
All generated files go into the generated/ directory at the plugin root:
generated/
<slug>_render.py # generation script
<slug>.png # output image
- Scripts: Save as
generated/<slug>_render.py where <slug> is a
short kebab-case name derived from the request (e.g., social-card_render.py)
- Output images: Save as
generated/<slug>.png (or .jpg/.webp)
- Intermediates: Save temporary files in
generated/ too — prefix with _tmp_
- The
generated/ directory is gitignored. Do NOT place scripts in scripts/
or output in output/ — those are not for generated artifacts.
- After delivering the final image, clean up intermediate
_tmp_* files.
- Keep the generation script after completion — the user may want to
iterate ("make the text bigger", "change the color") and the script
enables re-rendering without rewriting from scratch.
- If the user explicitly asks to clean up, delete both the script and output.
Script Structure
Every generation script should follow this pattern:
"""Rasterize: [brief description of what this generates]"""
import os
WIDTH, HEIGHT = 1200, 630
SCALE = 2
PLUGIN_ROOT = os.path.dirname(os.path.abspath(__file__))
GENERATED_DIR = os.path.join(PLUGIN_ROOT, "generated")
os.makedirs(GENERATED_DIR, exist_ok=True)
OUTPUT_PATH = os.path.join(GENERATED_DIR, "<slug>.png")
FONT_DIR = os.path.join(PLUGIN_ROOT, "assets", "fonts")
def render():
pass
if __name__ == "__main__":
render()
print(f"Saved to {OUTPUT_PATH}")
Design Principles
When generating images, aim for professional quality:
- Whitespace: Leave generous margins (at least 5-8% of canvas size).
Content should breathe.
- Color: Use cohesive palettes. When the user doesn't specify colors,
choose a palette with 1 primary, 1 accent, 1-2 neutrals. Avoid pure
black (#000); use near-black (#1a1a2e or #0f172a) instead. Avoid pure
white (#fff) on large areas; use off-white (#fafafa, #f8fafc).
- Typography: Maximum 2 font families per image. Establish clear
hierarchy (title → subtitle → body → caption) through size and weight.
- Alignment: Use a grid. Align elements to consistent baselines and
gutters. Misalignment is the #1 tell of AI-generated graphics.
- Contrast: Ensure text passes WCAG AA (4.5:1 ratio). Use a contrast
checker function if needed.
Error Handling
- If a required engine is not installed, follow
./shared/setup.md.
- If a font file is missing, fall back to a safe default from the
bundled collection (see
./shared/fonts.md). Never use system fonts
without checking availability.
- If rendering fails, check the error, fix the script, and retry.
Common issues: missing font path, wrong image mode, Cairo surface not
flushed before save.
Engine Reference Docs
Before writing a generation script, ALWAYS read the relevant engine
reference doc from ./references/. These contain engine-specific
patterns, gotchas, and helper snippets that prevent common mistakes.
./references/pillow.md — Pillow patterns and helpers
./references/cairo.md — PyCairo patterns and helpers
./references/matplotlib.md — Matplotlib + Seaborn patterns
./references/plotly.md — Plotly static export patterns
./references/playwright.md — HTML-to-PNG via Playwright