Skip to content

About

Claude paints with code: a Claude Code skill for procedural illustration in 70 styles, from ink wash (水墨), watercolour and ukiyo-e to stained glass, Roman mosaic, Art Deco, shadow puppets, X-ray, VHS tape, pastel UI, retro gouache, dry-brush blocks, a twilight storybook and hatched nocturnes. No image model: numpy + Pillow on a CPU, draw-on GIFs.

Topics

Resources

Stars

35 stars

Watchers

0 watching

Forks

Latest commit

 

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Claude Drawing · Claude 绘图

Claude paints with code — no image model. Seventy styles, from ink wash and impasto oil to clay, cyanotype, stained glass, a Roman mosaic, Delft tiles, a cyberpunk street, a ray-traced ball pit, low-poly 3D, a thermal camera, an X-ray, a VHS tape, a synthwave sunset, a pastel product-film UI, an answer sheet marked in red, a lamp-lit shadow-puppet play, pen-and-wash sketch cards, retro gouache picture-book portraits, a soft-blue picture-book spread, a Jiangnan water garden in spring, a dry-brushed mid-century poster, a dusk picture-book page where the sky turns to stars and a hatched night print of lava meeting the sea. 不用生图模型,Claude 用代码一笔一笔作画。 七十种画风,从水墨、油画到黏土、蓝晒、彩色玻璃花窗、罗马马赛克、代尔夫特蓝瓷砖、赛博朋克、光线追踪的小球海、低多边形 3D、热成像、X 光片、VHS 录像带、Synthwave 落日、产品发布片式的粉彩界面、红笔批改的答题卡、油灯下的皮影戏、钢笔淡彩的速写小卡、复古水粉的绘本大头像、蓝调绘本的雨天跨页、江南园林的春水园景、干刷色块的 mid-century 海报、暮色微缩绘本里转入星空的黄昏和排线夜景里流进海里的熔岩。

English · 中文


Ink wash · 水墨 — every style below is drawn stage by stage like this (the storybook one is a real character animation) · 下面每种画风都是这样一步步画出来的(绘本角色动画是一段真正的角色动画)

Watercolour · 水彩 Paper collage · 剪纸拼贴 Coloured pencil · 韩国彩铅
watercolour collage pencil
Anime · 日本动漫 Editorial · 编辑风手绘 Impasto oil · 油画厚涂
anime editorial oil
Ukiyo-e · 浮世绘木版画 Pixel art · 像素风 Stop-motion clay · 黏土定格
ukiyoe pixel clay
Cyanotype · 蓝晒 Cross-stitch · 十字绣 Retro panel · 复古仪器面板
cyanotype stitch panel
Sticker collage × receipt · 贴纸拼贴 · 小票 Lab notebook × stickers · 实验笔记本 · 贴纸 Chalkboard · 黑板板书
sticker notebook chalk
Cyberpunk · 赛博朋克 Hand-drawn cartoon · 卡通手绘 Continuous line art · 单线画
cyberpunk cartoon lineart
Soft 3D · 柔光 3D Shape morph · 形变动画 Newspaper collage · 报刊拼贴
soft3d morph newscollage
Aurora glass · 弥散玻璃 Bauhaus geometric · 包豪斯几何 Retro synthwave · 复古 Synthwave
aurora bauhaus synthwave
Isometric 2.5D · 等轴 2.5D Perler beads · 拼豆 Petroglyph · 岩画
isometric perler petroglyph
Egyptian tomb painting · 古埃及墓室壁画 Roman mosaic · 罗马马赛克 Stained glass · 彩色玻璃花窗
tomb mosaic stainedglass
Illuminated manuscript · 泥金手抄本 Leonardo codex · 达·芬奇手稿 Silhouette · 剪影
illuminated codex silhouette
Letterpress poster · 凸版印刷海报 Soviet constructivism · 苏联构成主义 Art Deco · 装饰艺术
letterpress constructivism artdeco
Golden-age comic · 黄金时代漫画 Pop silkscreen · 波普丝网 ASCII art (line printer) · ASCII 字符画
comic popart lineprinter
Low poly · 低多边形 Stencil graffiti · 喷漆模板涂鸦 Embroidered patches · 刺绣徽章
lowpoly stencil patch
Blueprint · 蓝图工程图 Children's crayon · 儿童蜡笔画 Green-screen CRT · 绿屏终端
blueprint crayon crt
Thermal camera · 热成像 Delft tiles · 代尔夫特蓝瓷砖 Cave painting · 洞穴壁画
thermal delft cave
1-bit paint program · 1-bit 早期画图软件 Greek black-figure vase · 古希腊黑绘陶瓶 Graphite pencil · 铅笔素描
macpaint blackfigure graphite
X-ray · X 光片 1930s rubber hose · 1930 年代黑白橡皮管动画 Linocut · 黑白麻胶版画
xray rubberhose linocut
VHS home video · VHS 家庭录像 Flat vector · 扁平矢量 Storybook animation · 绘本角色动画
vhs flatvector storybook
Ballpoint doodle · 圆珠笔涂鸦 Overlay sheets · 描图纸叠层 Pastel UI · 粉彩界面
ballpoint overlay pastelui
Exam grading · 阅卷批改 Shadow puppetry · 皮影戏 Pen & wash · 钢笔淡彩
grading shadowpuppet penwash
Retro gouache · 复古水粉 Blue picture book · 蓝调绘本 Jiangnan garden · 江南园林
gouache bluebook jiangnan
Dry-brush blocks · 干刷色块 Twilight storybook · 暮色微缩绘本 Hatched nocturne · 排线夜景
drybrush twilight nocturne

Gallery · 画廊

八万四千法门 · Many Paths, One Summit
Ink wash · 水墨
月印万川 · One Moon in Ten Thousand Rivers
Ink wash · 水墨
秋日湖畔 · Autumn Lake
Watercolour · 水彩
水彩底纹 · Watercolour Washes
Watercolour · 水彩 — a background for explainer videos · 讲解视频的背景
热气球小镇 · Balloon Day
Paper collage · 剪纸拼贴
午后甜点 · Afternoon Dessert
Coloured pencil · 韩国彩铅
夏空 · Summer Sky
Anime · 日本动漫
灵感生长 · Growing Ideas
Editorial · 编辑风手绘
麦田星空 · Swirling Sky over the Wheat Field
Impasto oil · 油画厚涂
富士曙 · Fuji at Dawn
Ukiyo-e · 浮世绘
雨夜咖啡店 · Rainy Night Cafe
Pixel art · 像素风
灯塔岛 · Lighthouse Island
Stop-motion clay · 黏土定格
蓝晒植物 · Sun-Print Botanicals
Cyanotype · 蓝晒
家 · Home Sampler
Cross-stitch · 十字绣
Aurora 64 收音机 · Aurora 64 Radio
Vintage instrument panel · 复古仪器面板
周末市集 · Weekend Market
Sticker collage × receipt · 贴纸拼贴 · 小票
咖啡萃取实验 · Coffee Brewing Experiment
Lab notebook × stickers · 实验笔记本 · 贴纸
为什么天空是蓝的 · Why Is the Sky Blue?
Chalkboard · 黑板板书
霓虹不夜城 · Neon District
Cyberpunk · 赛博朋克
早安吐司 · Good Morning, Toast
Hand-drawn cartoon · 卡通手绘
岛上的气象站 · Island Weather Station
Isometric 2.5D · 等轴 2.5D
从这扇窗到那扇窗 · From Window to Window
Continuous line art · 单线画
浮出 · Rise
Soft 3D · 柔光 3D
一滴水的旅程 · A Drop's Round Trip
Shape morph · 形变动画
好奇心周刊 · 拆开看看 · Curiosity Weekly · Take It Apart
Newspaper collage · 报刊拼贴
晨间计划 · Morning Plan
Aurora glassmorphism · 弥散玻璃
形与色 · Form & Colour
Bauhaus geometric · 包豪斯几何
海岸线 1987 · Coastline 1987
Retro synthwave · 复古 Synthwave
草莓杯垫 · Strawberry Coaster
Perler beads · 拼豆
迁徙季 · Migration Season
Petroglyph · 岩画
尼罗河丰收 · Harvest on the Nile
Egyptian tomb painting · 古埃及墓室壁画
港口渔获 · The Day's Catch
Roman mosaic · 罗马马赛克
四季之窗 · Window of the Seasons
Stained glass · 彩色玻璃花窗
星辰之书 · Liber Stellarum
Illuminated manuscript · 泥金手抄本
扑翼机 · The Ornithopter
Leonardo codex · 达·芬奇手稿
剪影小像 · Shades of the Wren Household
Silhouette · 剪影
马戏团来了 · The Circus Is Coming
Letterpress poster · 凸版印刷海报
无线电 · Radio
Soviet constructivism · 苏联构成主义
夜行快车 · Night Express
Art Deco · 装饰艺术
火箭小队 · Rocket Squad
Golden-age comic · 黄金时代漫画
猫的六种心情 · Six Moods of a Cat
Pop silkscreen · 波普丝网
发射记录 · Liftoff Trace
ASCII art (line printer) · ASCII 字符画(行式打印机)
峡谷飞行 · Canyon Run
Low poly · 低多边形
放风筝 · Hold On
Stencil graffiti · 喷漆模板涂鸦
三晚露营 · Three Nights Out
Embroidered patches · 刺绣徽章
灯塔剖面 · Halvard Rock Light
Blueprint · 蓝图工程图
我的周末 · My Weekend
Children's crayon · 儿童蜡笔画
今天带伞吗 · Bring an Umbrella?
Green-screen CRT terminal · 绿屏终端(荧光字符画)
厨房里的温度 · Kitchen Heat Map
Thermal camera · 热成像
一阵风 · The Gust
Delft tiles · 代尔夫特蓝瓷砖
篝火旁的岩洞 · The Hunt by the Fire
Cave painting · 洞穴壁画
窗台花园 · Windowsill Garden
1-bit paint program · 1-bit 早期画图软件
赛跑与赛车 · Games on a Vase
Greek black-figure vase · 古希腊黑绘陶瓶
老街角的自行车 · The Bread Run
Graphite pencil · 铅笔素描
行李安检 · Security Check
X-ray · X 光片
早晨的闹钟 · Seven O'Clock
1930s rubber hose · 1930 年代黑白橡皮管动画
雪夜归途 · Homeward, First Snow
Linocut · 黑白麻胶版画
吹蜡烛 · Blow Out the Candles
VHS home video · VHS 家庭录像
山间夜营 · Night Camp
Flat vector · 扁平矢量
小橡果的秋天 · An Acorn's Autumn
Storybook animation · 绘本角色动画
蛇梯棋大冒险 · Snakes & Ladders, Round 7
Ballpoint doodle · 圆珠笔涂鸦
海港步行图 · Larkhaven on Foot
Overlay sheets · 描图纸叠层
出发前,再查一遍行李 · Pack Check
Pastel UI · 粉彩界面
数学单元测验 · Unit Test, Graded
Exam grading · 阅卷批改
蹴鞠 · Cuju by Lamplight
Shadow puppetry · 皮影戏
街角速写 · Sketchbook Neighbours
Pen & wash · 钢笔淡彩
雨天三人像 · Rainy-Day Portraits
Retro gouache · 复古水粉
借伞 · The Shared Umbrella
Blue picture book · 蓝调绘本
春水园林 · Spring Water Garden
Jiangnan garden · 江南园林
面馆 · Noodle Counter
Dry-brush blocks · 干刷色块
夜的边上 · The Kite at the Edge of Night
Twilight storybook · 暮色微缩绘本
熔岩入海 · Lava Meets the Sea
Hatched nocturne · 排线夜景

Every mark above is computed: paper fibres, ink washes and mist, dry-brush strokes, pigment granulation and blooms, torn-paper edges, pencil wax on paper tooth, cel-shaded clouds, risograph grain and halftones, lit impasto relief, woodblock grain and bokashi, dithered pixels, plasticine lit like a film set, sunlight through leaves on Prussian blue, twisted thread on Aida cloth, machined knobs behind a backlit dial, die-cut vinyl with a laminate gloss, streaky thermal print, graphite catching the tooth of graph paper, highlighter pooling at the start of a swipe, chalk dust settling under half-erased lessons, rain-lit neon glass mirrored in a wet street, a blue-pencil rough under boiling brush ink, an island ray-traced under one soft sun, a single unbroken gold line, candy balls with softbox glints, one outline morphing through six shapes, halftone photos cut out with scissors, frosted glass blurring the real pixels behind it, screen-printed primaries out of register, a slit sun sinking behind a neon grid played off tape, hollow fuse beads on a pegboard melting together under an iron, pits knocked through desert varnish, a red grid showing through flaking plaster, stones laid row by row along an outline, daylight through leaded glass, burnished gold that mirrors the room, left-handed hatching in iron-gall ink, black paper cut with scissors, wood type printed a hair out of register, red and black plates slipping apart, airbrush fades inside knife-cut friskets, Ben-Day dots on yellowed newsprint, one photo key pulled across hand-painted colour, characters struck through a fading ribbon, flat-shaded triangles dithered to 15 bits, spray drifting past cut card, satin stitches catching the light by their angle, ink lines printed white on Prussian blue, wax scribbles skipping the paper's pits, phosphor glowing behind curved glass, heat leaking out of a kitchen, cobalt fired into tin glaze tile by tile, ochre blown onto rock lit by a fire, 1-bit patterns in an old paint program, slip silhouettes incised to the clay, graphite that never quite reaches black, X-rays adding up through a suitcase, grey cels shot on scratched film, gouge marks in a rolled-up block, a birthday smeared onto tape, seven flat colours lifting off each other, an acorn squashing and stretching through a world drawn as it goes, ballpoint ink blobbing at every corner of a hand-drawn game, inks multiplying through tracing paper on a light box, window cards floating on a pastel field over shadows tinted by it, a vermilion stamp running dry at one end, red ink pooling where the pen slowed down, dyed donkey hide glowing on a lamp-lit screen, gouache scumbled dry over a toned board, knit stitch by stitch, dry pastel blue under a scratchy brush line, with chalk rain on top, a spring garden built leaf by leaf, its tiled roofs and willows mirrored in a jade lake, a roller and a dry brush running out across cream paper, a dusk sky going over to stars above thousands of tiny wildflowers, and a night sea laid stroke by stroke under the one warm light of lava meeting the water. No diffusion model, no API, no stock art. It is just Python with numpy + Pillow on a CPU: from 0.1 s (pixel art) to about 45 s (the soft 3D ray tracer) per 1920×1080 image.


English

What it is

A Claude Code skill and a small painting library with seventy styles:

Style Module What makes it read as the real medium
Ink wash (水墨) lib/inkpaint.py · Painting rice paper; occluding washes with wet rims and mist; bristle brush with flying-white; texture strokes (皴); moss dots; pines, boats, reeds; calligraphy and seal
Watercolour lib/watercolor.py · Watercolor cold-press paper tooth; transparent glazes that mix subtractively; wet-edge darkening; granulation; blooms; wet-in-wet feathering; reflections; lifting
Paper collage lib/papercut.py · Collage torn edges with a white fibrous core; paper depth shadows; kraft, crayon, newsprint and ruled-notebook papers; waxy crayon lines; cute faces
Coloured pencil (Korean style) lib/colorpencil.py · ColorPencil short directional hatching; wax that catches on the paper tooth, with pressure reaching the valleys; soft layered blending; brown pencil outlines; gel-pen sparkles
Anime (Japanese) lib/anime.py · Anime gradient skies; cumulus with crescent cel shadows on every puff; bloom, god rays, lens flare; flat-shaded fields, perspective roads, power lines; line-art characters
Editorial (risograph) lib/editorial.py · Editorial 4–5 spot inks with grain, uneven density and mis-registration; overprinting; halftone shading; wobbly hand-drawn line; stylised figures
Impasto oil lib/oilpaint.py · OilPainting thousands of strokes following a flow field; each pixel knows its place inside its stroke → flat-topped paint ridges, bristle grooves, heavier paint where the brush lands; lit relief
Ukiyo-e woodblock lib/ukiyoe.py · Ukiyoe one block per colour on washi, with wood grain and registration drift; bokashi graded wipes; black key-block outlines; seigaiha waves; cloud bands; title cartouche and seal
Pixel art lib/pixelart.py · PixelArt a 320×180 canvas painted pixel by pixel; limited palette; ordered (Bayer) dithering for gradients, glows and reflections; 3×5 bitmap font; crisp ×6 upscale
Stop-motion clay lib/clay.py · Clay a height map of pressed pieces (pads, balls, rolled snakes, puffy letters, finger-smeared slabs, tool grooves, pokes) with lumps and fingerprints; lit like a photo of a set: wrap-diffuse key + cool fill, waxy sheen, shadows marched through the height field, ambient occlusion
Cyanotype (sun print) lib/cyanotype.py · Cyanotype emulsion brushed on in strokes with dry-brush ends; objects block UV (transmissions multiply): translucent leaves with whiter veins, fluff lifted off the paper with a soft penumbra, light scattering under edges; a Prussian-blue density curve; white handwriting printed in, pencil notes on the margin
Cross-stitch embroidery lib/stitch.py · Stitch Aida cloth with a hole at every block corner; one X per cell, lit as round twisted thread with a shadow, in hand-made variants; half stitches; back-stitch snapped hole to hole; padded glossy satin stitch; French knots; ASCII charts and a 5×7 sampler alphabet; a sewn-on woven label
Vintage instrument panel lib/panel.py · Panel teak veneer, brushed aluminium, moulded plastic, grille cloth with lurex floats, perforated metal; bevels, wells and drop shadows from one key light; machined knobs, piano keys, toggle switch, jewel lamp, magic-eye tube, meter; silkscreened scales and a backlit dial behind glass
Sticker collage × receipt lib/sticker.py · Sticker cream card board with grain, mottling and fibres; flat-vector art die-cut into vinyl stickers (rounded white border, cut-edge thickness, laminate gloss rim and sheen, contact + drop shadow, peeled corners showing the pale backing); a thermal receipt with serrated tear edges, grey streaky thermal print, dotted leaders, a printed strike-through, a fold crease and curl; translucent washi tape with torn ends; price tags with grommets on baker's twine; a round rubber stamp in translucent, unevenly pressed ink; red ballpoint ticks
Lab notebook × stickers lib/notebook.py · Notebook a wire-o graph-paper notebook on a graphite desk (hard back cover, stepped page stack, divider tabs, dog-ear, wire loops lit as metal tubes); graphite that only catches the paper tooth, with pressure, taper and hand wobble; ruled lines, hatching, pencil charts and check boxes; multiply highlighter swipes with pooled starts, felt streaks and dry tails; red felt-pen loops that overshoot instead of closing; curling sticky notes, die-cut vinyl stickers, embossed label-maker tape, a coffee ring; a hexagonal pencil with a scalloped sharpened edge
Chalkboard lib/chalk.py · Chalkboard cloudy green slate paint; chalk that only catches the board's tooth, with pressure, grain and broken edges; side-of-the-stick shading; a felt eraser that really removes chalk, drags a smear along the wipe and leaves ghosts of the last lesson; dust settling thicker toward the tray; hand-set text where each character sits a little differently; hand-drawn ∝, waves, arrows and open loops; a mitred wooden frame with chalk sticks and an eraser on the ledge
Cyberpunk lib/cyberpunk.py · Cyberpunk a pinhole camera down a rain-soaked street canyon, rendered in HDR with a z-buffer: glass-tube neon with over-exposed cores, dead and flickering tubes; backlit light boxes; a translucent hologram ad with scan lines, tear slices and colour fringing; each object mirrored from its own ground line into the wet asphalt and puddles; depth fog lit by the city; steam lit by the signs; three layers of rain lit only near the neon; flying-car light trails; bloom, halation, grain and one glitch line
Hand-drawn cartoon lib/cartoon.py · Cartoon drawn the way an animator draws one frame: a blue col-erase pencil rough left under everything; brush-pen ink that lands thin, swells and lifts off to a point, closed shapes inked in one stroke whose ends overlap, heavier on the shadow side; flat colour painted a little off the lines (a sliver of paper here, a spill there); hard one- or two-tone cel shadows and white glints; crayon that only catches the paper tooth, screentone, ink hatching; faces, rubber-hose arms with mitten gloves, sparkles, speed lines, starbursts; chunky extruded lettering; lines that boil from frame to frame; a staged replay rough → ink → colour → shadow → effects → type
Isometric 2.5D lib/isometric.py · Isometric a true isometric orthographic camera and a small ray tracer: every part is an exact analytic solid (chamfered boxes, roofs, rocks and hulls as convex polyhedra; cylinders and cones on any axis; ellipsoids cut by planes) in a G-buffer, so hiding never depends on draw order; one soft sun gives the three-tone faces and percentage-closer soft shadows that widen with distance; occlusion comes from a top-down map that knows eaves and tree crowns float; pastel albedos under a lilac sky, chamfer highlights, shore foam, glassy water walls, a floating slab whose shadow lands on the backdrop; data cards printed on iso planes
Continuous line art lib/lineart.py · LineArt the whole picture is one path: shapes strung together in drawing order with tangent-continuous bridges, loop-the-loops laid along the path, invisible retraces to reach a window; rasterised once into a time map, so every draw-on stage is an exact prefix of the line; a hand-pressure width (touch-down and lift-off tapers, slow drift, heavier in sharp turns, a flick where the pen doubles back, a lighter hand for motion paths); a gilded wire with angle-dependent sheen and a faint, tight glow on night blue (or dark ink on cream); a hot pen tip while drawing; one glowing accent; letter-spaced Didot titles
Soft 3D lib/soft3d.py · Soft3D an actual little ray tracer: tens of thousands of balls found by walking a grid (DDA) with exact ray–sphere hits; puffy letters as signed distance fields (exact 2D distance transform of the glyph, extruded, rounded and inflated); a studio sky dome with ambient occlusion sampled in the scene's own distance field; a big softbox key with soft penumbra shadows, a rim light, softbox reflections and Fresnel edges; shade that turns deeper and more saturated instead of grey; displaced balls that settle into real hollows; aerial haze, layered depth of field, 1.5× supersampling
Shape morph lib/morph.py · Morph one closed outline per object: resampled to 256 points evenly along its arc length, given the same winding, start point aligned by FFT cross-correlation, then blended point by point while its centroid travels an eased motion path with squash & stretch; compound shapes (cloud, snowflake) are unions of primitives traced back to a single outline; colours switch through OKLab; the poster freezes the animation as a film strip: one flat colour panel per keyframe, onion-skin ghosts that change colour at the panel border, matched points dotted on the middle frame, a dashed motion path and a timeline of ease curves
Newspaper collage lib/newscollage.py · NewsCollage everything is paper that was printed, then torn or cut, then glued: kraft board with fibres; hand-torn newsprint of generated pseudo-text that shows a pale fibrous core along stretches of the tear; "old photos" that are real renders (height field, key light, chrome reflections, cast shadows) printed as a 45° halftone with ragged dots and dot gain, cut out with scissors in short straight snips; ransom-note letters each from a different magazine; masking tape that shows the paper edges beneath; uneven rubber stamps
Aurora glassmorphism lib/aurora.py · Aurora a mesh gradient of colour pools mixed in OKLab on a domain-warped grid, with aurora ribbons and fine grain; glossy iridescent orbs; frosted panes that blur the actual pixels beneath them (backdrop, orbs, the cards and text behind), boost saturation and add a milky veil that is thicker toward the light; a bevelled rim that bends the view outward with faint dispersion, a light-facing 1 px edge highlight, frost grain and a soft shadow tinted by what it falls on; crisp SDF controls: gradient toggles, sliders, conic progress rings, pill bars, sparklines, glass chips, a glossy sun behind a glass cloud; SF + PingFang lettering
Bauhaus geometric lib/bauhaus.py · Bauhaus a press sheet printed screen by screen, light to dark, on cream uncoated stock (cloudy pulp, fibres, flecks, tooth, a slight cockle); each screen has its own registration error, so colour meets black with a sliver of paper or a dark overlap and the register targets print as a stack of offset crosshairs; an ink film streaked along the squeegee pull and thinning toward the end of the stroke, with bare tooth pits and pinholes where it is thin and a mesh-ragged stencil edge; semi-opaque inks that darken where they overprint; circles, sectors, triangles and heavy bars on a strict module grid; Futura-style caps and heavy Hei, knocked out of solids; crop marks, a colour bar and a pencilled edition number
Retro synthwave lib/synthwave.py · Synthwave an 80s retro-future dusk through a pinhole camera: a gradient sun cut by slits that thicken toward the horizon; an analytic neon grid with honest line widths that fades to its average instead of moiré; wireframe mountains glowing magenta to cyan; a sea whose reflection is torn into bars stretched about the sun's column; palm silhouettes with sunset rims; chrome caps mirroring sky over ground with a sharp horizon, extrusion and glints; neon script; then played back off tape: chroma bleed, a tracking band, head-switching noise, on-screen display and scanlines
Perler beads lib/perler.py · Perler a height field of real tubes seen by a camera leaning back a little (each pixel walks its column to the first surface), so every bead shows a sliver of side wall, its hole shows the inner wall and the peg inside tinted by light through the plastic, and the gaps show the pegboard; a translucent pegboard (square, round, hexagonal) with empty pegs; per-bead dye-lot shade and wobble; opaque, pearl, clear and glow plastics; ironing as melt: tubes slump and spread, holes close from the rim, neighbours flow together through a smooth union until the gaps shrink to diamonds and the top becomes one flat waxy sheet with paper grain; translucent ironing paper that drapes over the beads and peels back with a curl; a soft box seen in reflection (crisp arcs on glossy rims, a drifting sheen on melted plastic); sorting-tray heaps, spilled beads, tweezers held in the air with their own shadow, a printed chart with pencil ticks
Petroglyph lib/petroglyph.py · Petroglyph the picture is knocked out of the rock, not painted on: a sandstone height field (swells, faint bedding, grain, solution pockets, a stepped ledge) under desert varnish that grows as a near-uniform dark coat with crisp blue-black runoff streaks; every glyph is drafted as a mask and hammered out with hundreds to thousands of irregular pits that break the varnish and crush the grains pale, so outlines are ragged at the scale of one blow and interiors are shallow granular hollows; tally marks are ground V-grooves instead; age re-varnishes old work toward a ghost, so superimposed layers show; cracks bleed seep streaks; spalls are scalloped step-down scars of fresh orange stone that took part of the old work; crustose lichen; one low raking sun with a cast shadow in every pit
Egyptian tomb painting lib/tomb.py · TombPainting the wall is built in the painters' own order and every layer is kept: straw-tempered mud under gypsum plaster, a red-ochre squaring grid snapped at one canon unit per cell, a searching red underdrawing, a ground wash brushed round the figures, flat matte secco colour one pigment at a time (red-ochre men, yellow-ochre women, translucent pleated linen, glittering Egyptian blue, green frit) z-ordered so the pots can go in any order, then even black and red-brown outlines; figures in the composite view on a posable canon rig (profile head with a frontal kohl-lined eye, frontal shoulders and collar that turn toward profile when the body bends, both feet from the big-toe side, IK elbows) at hierarchical scale; oxen with all four legs visible, an emmer field gathered into the reapers' fists, polychrome pseudo-hieroglyphs laid out in quadrats, kheker frieze and block border; then age as strata: clustered flaking down to the wash, or to the plaster where the red grid and sketch come back, plaster losses down to the mud as a real height field with a broken gypsum rim and a cast shadow, cracks, blue decaying to grey-green, soot, a tide-line, salt and fly specks
Roman mosaic lib/mosaic.py · Mosaic a hidden cartoon that every stone samples and snaps to a finite box of stones (limestone, veined marble, smalti glass, terracotta), matched on hue before lightness; rows traced along iso-lines of distance fields (marching squares) so they wrap every outline and ring every eye (opus vermiculatum), halo rows round each figure, straight or wavy background rows (opus tessellatum), mitred border rows; each row fitted with a whole number of hand-cut stones that turn into wedges on curves and stop at the figure's spine; later stones cut to fit against earlier ones with a grout gap; stroke Roman capitals in a tabula ansata; a height field: polished, slightly domed tops with worn edges, recessed sandy grout, a per-stone tilt so equal stones catch the raking light differently, cast shadows in the joints; red-ochre sinopia on the wet bed; lacunae that leave the sockets of lost stones in the old bed, a settling crack, dirt in patches
Stained glass lib/stainedglass.py · StainedGlass the glazier's process: a cartoon cut into pieces (Voronoi mosaics, explicit cut sites for borders, slivers merged away); pot-metal glass coloured all the way through, every piece with its own shade and thickness (transmission ** thickness), reams running one way per piece and seed bubbles drawn out along them; grisaille trace lines, stippled matt with sticklight scratched out of it, silver stain; lead came on every boundary, lit as an H-section, with brighter solder blobs and a wide rim came; iron saddle bars wired to the leads, a crack mended with a strap lead; an ashlar wall with splayed reveals and voussoir joints; daylight from behind: coloured spill on the stone, glowing reveals, a soft upside-down projection on the sill, halation over the leads, grime and corrosion pits
Illuminated manuscript lib/illuminated.py · Illuminated textura written with a simulated broad-edged quill (a stroke is the area an angled nib sweeps, so the diamond feet and hairline joins come from the pen, not a font), with long s, the Tironian et and a per-letter wobble; iron-gall ink that browns as the quill runs dry and pools at the stroke edges; vermilion rubrics, red-touched capitals, red and blue paragraph marks, line fillers, hyphenation; burnished gold as a mirror on a raised gesso cushion (each pixel reflects a studio window through its gesso normal, so the leaf shows bands, flares on the cushion edge and glittering punchwork, while shell gold stays matte); granular azurite, rose with lead-white tracery; an ivy spray grown recursively from a bar border; compass-drawn diagrams with a true stereographic astrolabe plate; vellum with follicles, veins, cockle, prickings, ruling, show-through and a flaw hole; foxing, thumb soil, gold flaked down to the red bole
Leonardo codex lib/codex.py · Codex laid rag paper on a mount (laid and chain lines, fibre tooth), aged unevenly: browned ragged edges, a lost corner, yellowed clouds, crisp foxing, a water stain with a darker tide line, writing from the verso showing through; iron-gall ink from a quill whose width follows the nib, that runs dry stroke by stroke and is re-dipped (darker again, sometimes a pooled bead), warm amber where thin and umber where thick, darker where strokes cross; left-handed '\' hatching laid in bands, interleaved for darker tones and crossed only in the deepest shadow; red chalk that only catches the paper tooth, rubbed into a soft tone; colourless stylus and compass lines lit by raking light, prick holes at the centres, leadpoint underdrawing; contours searched twice before the final line; mirror writing right to left in pseudo-Italian; machine parts (gears, lantern pinions, crown wheels, cranks, pulleys) drawn by a pen renderer with a z-buffer: hidden lines dropped, faces hatched by how far they turn from the light, only silhouettes and creases inked; blots and struck-out ideas
Silhouette lib/silhouette.py · Silhouette black paper that is actually cut: a glued outline re-cut into tiny straight scissor facets, separately snipped strands (plume barbs, lashes, whiskers, ringlets, rigging) that lift a little and throw a longer shadow, and cut-outs where the card shows through (an eye, lace piercings), all drawn at 4× so one-pixel strands survive; thin shell-gold bronzing that stays on the paper; an oval gilt frame built as a height field from a real moulding profile (sight-edge bead, cove, pearls, rope-twist torus) that mirrors a room lit by one window, with leaf-square seams, red bole rubbed through on the crests and grime in the hollows; a verre églomisé mount, the rebate's shadow on the card and a convex-glass reflection; iron-gall captions in roundhand; a block-printed Regency stripe wallpaper (misregistration, pin dots, mismatched seams, sheet joins) hung from a picture rail on twisted silk cords
Letterpress poster lib/letterpress.py · Letterpress one forme per ink, pressed one pass at a time, and each pass lands a few pixels off: the red tint creeps out from under the black key on one side and leaves a sliver of paper on the other; wood type set to full measure, every letter its own block with wood-grain streaks, an end that prints light, dents, nicked corners and the odd split, shaded letters carrying their drop shade on the other forme; stiff oil ink with a ragged edge, a squeezed darker rim, starved mottled solids that let the paper tooth show through, dust dropouts; brass rules made of several pieces with joints; a woodcut cut the way wood is left standing: key lines thicker on the shadow side, swelling hatching whose line width follows the tone and tapers out in the light, a loose separately cut red block; after printing the bill is folded in thirds (ink cracked along the creases), a date strip is pasted on, tacked up, browned from the edges and foxed
Soviet constructivism lib/constructivism.py · Constructivism one sheet, two plates: everything red is on one plate and everything black (solids, type, every halftone dot) on the other, each laid down with its own registration error, so red and black meet with a sliver of paper or a dark overprint; transparent inks that multiply (black over red is a warm black), a mottled film with voids, fibre-ragged edges and a letterpress halo; the "photographs" are real renders (a tiny z-buffer rasteriser: hyperboloid lattices, lathes, swept tubes, procedural wood grain and dial scales) screened in poster space into one 45° AM halftone and cut out with scissors that leave a paper margin and never cut into a gap; heavy condensed Cyrillic grotesque with a hand-drawn wobble; cheap cream stock yellowed at the edges, folded in four with the ink cracked along the creases, foxing, a tide line and rusty pin holes
Art Deco lib/artdeco.py · ArtDeco nothing is ever outlined: every shape is a knife-cut frisket sprayed with an airbrush, so edges are crisp and every inside is one smooth fade, with droplet grain only where the coat is thin; a sunburst of alternating rays that fades with distance, a moon sprayed off-centre so it reads as a sphere; stepped set-back towers sprayed dark-to-light across each face with fluting, lit ledges, window grids and lit slits, pushed into the haze by distance; a river that mirrors the scene in ripple dashes, bright things reflecting more; the streamliner and its arched viaduct are a real little 3D scene (signed distances, sphere-traced, edge pixels supersampled) but shaded like an illustrator models a cylinder: a poster colour ramp per material, an airbrushed highlight band on the upper shoulder, moon rim light, reflected light under the belly, speed stripes that converge on the raked nose, the headlamp lighting the rails ahead; a Deco display alphabet built from strokes and elliptical bowls, gilt with a hard horizon line
Golden-age comic lib/comic.py · ComicCover made the way the shop made it, printed the way the press printed it: brush key lines on the black plate that land thin, swell, lift off and run heavier on the shadow side, spotted blacks, feathering that grows out of shadow edges in uneven waves; a colour guide in which every area is a mix of Ben-Day tints (0/20/40/70/100 %) of three process inks, skies stepped in bands cut along wavy film edges; each plate screened at its own angle (dots grow, touch at 50 %, turn into holes, overlaps beat into rosettes) and printed a few pixels out of register, the hand-cut flats wandering off the line art; newsprint that has gone tan and drinks the ink (ragged dots, dropped highlights, mottled solids with bare pits); a perspective block logo extruded toward a vanishing point, price box, caption, speech, shout and thought balloons, hand lettering, sound effects; afterwards spine stress ticks, rusted staples, a rubbed corner, a crease and foxing; the stages proof the key plate, then yellow, + red, + blue
Pop silkscreen lib/popart.py · PopSilkscreen the Factory method rebuilt step by step on one gessoed cotton-duck canvas (a plain-weave height field with slubs), taped into a grid with paint creeping under the tape. Each panel is hand-painted first in loud flat acrylic: the background, then loose shapes traced off the photo, a little too big or too small and drifting off it, with faint brush streaks, a dry drag at the edge and a low ridge that catches the light. Then the same photographic key is pulled through it: shadow masses with the grainy edge of a photo threshold, mid-tones as a coarse 45° halftone, dust specks on the film. Every pull lands with its own shift, a hair of rotation and its own ink load: streaks along the squeegee, the skipped line of a nicked blade, a clogged dry patch where the colour shows through the black, or flooded shapes that swell and fill in, and now and then a faint second impression
ASCII art (line printer) lib/lineprinter.py · LinePrinter the scene is never drawn on the paper: it is painted into a hidden role map at six by ten samples per character cell, then every cell picks its character: lines and silhouette turns by their direction measured in real pixels and where they sit in the cell (| / \ for steep, ' - . _ for flat so curves come out as _.-', X where struts cross, ( ) for round sides, one cell kept per row), fills from each role's own ramp with error diffusion inside the role (smoke . : % @ #), the darkest cells overstruck in extra passes; then a drum printer strikes each line through a fabric ribbon: every character slug sits a little high or low the same way each time, a weak hammer leaves a pale column, weak strikes thin out and break up on the ribbon weave and paper tooth instead of turning grey, worn slugs print the same nick, the ribbon fades down the page; a whole greenbar sheet lying on the desk between two tear lines, with feed holes you can see the desk through, micro-perforations, page-break creases and a blank bottom margin; a red ballpoint tick list and a ring around the plotted point
Low poly (1999 3D) lib/lowpoly.py · LowPoly an actual little software rasterizer drawing into a 384×216 framebuffer: a pinhole camera, vertices snapped to whole pixels, back-face culling, every triangle of the scene in one painter's-sorted list (the console ordering table) with a depth bias for decals, near-plane clipping, an optional z-buffer; flat shading per face (hemisphere ambient + sun + a per-facet glint, so gold flashes facet by facet); tiny procedural textures sampled nearest-neighbour and interpolated affinely, so strata bend on big polygons near the camera; per-vertex fog that swallows the far clip plane; alpha-cut crossed-quad trees; the era's four blend modes for a propeller disc, blob shadows, sparkles and a lens flare; then 15-bit colour through the 4×4 ordered dither and a ×5 nearest-neighbour blow-up; a stamped bitmap HUD (italic ramp digits with outline and drop shadow, a stepped speed bar, a minimap)
Stencil graffiti lib/stencil.py · Stencil a board-marked concrete wall built as albedo plus height and lit by a low sun (sawn-plank bands and wood grain pressed into the cement, broken paste fins along the seams, cone-shaped form-tie holes with rusted rods or mortar plugs, bug holes, rust and rain streaks, a damp tide line with efflorescence, a hairline crack); stencils that are real cut card: every island the cuts isolate is found and held by the shortest bridge, letters get bridged counters, and the bridges show as hairlines of bare wall; a picture in tones is several cards sprayed light to dark, each a few pixels off; the can moves in overlapping sweeps whose gaussian cones add up to a paint film, crisp where the card lay flat, creeping under where it lifted, with a drifting overspray halo; coverage is droplets, so thin film is a scatter of dots, not a blur; paint misses the bottom of pits, lies on the relief with a satin sheen, and runs from heavy lower edges as drips with a neck and a bead; freehand skinny-cap lines that follow the hand's speed; a council roller buff in stepped vertical passes with an old tag ghosting through; snapshots with the card still taped up
Embroidered patches lib/patch.py · Patch stitched the way an embroidery machine does it: every shape is cut into parallel rows at its own angle and each row into stitches — short staggered tatami for backgrounds, one long float per row for satin (split above a max length) — so every edge is made of stitch ends; each stitch is a round glossy thread that dives into the cloth at both needle holes and carries an anisotropic (Kajiya–Kay) highlight, so one colour sewn at two angles catches the light differently; padded satin domes into a light-to-dark sheen along each float; merrowed edges are a rolled cord of slanted wraps, die-cut shapes get a hot-cut satin border, both supersampled and faded where stitches crowd into tight corners; a 3/1 right-hand twill denim (warp denser than weft, ~60° wales, ring-dyed slubby warp, worn high points) with a felled seam and double topstitching; one patch still being whip-stitched on, the needle and thread lying on the cloth
Blueprint lib/blueprint.py · Blueprint the drawing is inked first, on tracing linen, with a few fixed ruling-pen weights and single-stroke lettering-guide capitals (pencil guide lines left on the linen, hatching scraped back behind dimension figures), then contact-printed: ink blocks the arc lamp so the iron salts under every line wash out white while everything else turns Prussian blue; density follows a threshold S-curve, so heavy lines print clean white, hairlines print pale blue and the ground saturates; light creeps under line edges, sharp where the glass pressed the linen flat and softer where contact was poor, with a faint halo; the lamp is stronger mid-frame, the coating carries machine streaks, mottle and wash runs from the drying line, and colour is Beer–Lambert Prussian blue on paper with the fibres showing through; drafting conventions throughout (hatching by material, dimension and extension lines, level datums, cutting planes, detail bubbles, a north point, graphic scales, a zoned border, title and revision blocks); then the sheet's life: folded in six with creases cracking the blue to white, the outside panel faded and handled, an alkaline water stain gone rust-brown inside two tide lines, rusty pin holes, and a site engineer's red wax-pencil revision cloud
Children's crayon lib/crayon.py · Crayon rough paper whose tooth is equalised so pressure maps straight to coverage; wax only catches on the peaks, and dragging the stick stretches the bare pits into short streaks along each stroke; a worn, faceted tip lays a bundle of uneven sub-lines, so every stroke carries white streaks; later wax catches on earlier wax (build-up) and mixes semi-opaquely (blue over yellow turns green, black outlines survive the colour); a child's hand: outline first, then back-and-forth scribbles patch by patch at arm's reach, each patch at its own angle, V-turns that overshoot the outline but stop short of anything being coloured round; circle scribbles, strokes along rainbow bands, shapes whose ends miss their starts; letters re-drawn over a thinned glyph with a round crayon, each tilted, resized and coloured differently; burnished wax that closes up and shines; paper and wax lit as one height field; real crayons in printed paper sleeves, one snapped, and wax crumbs lying on the sheet
Green-screen CRT terminal lib/crt.py · CRTTerminal a character terminal, not a picture: 120×36 cells of character memory with dim / normal / bold, reverse video, underline and double-height lines, a 5×7 dot-matrix ROM with descenders plus a graphics set (box drawing, the five scan-line bars for plotting, block eighths). ASCII art comes from a hidden map of materials and tones: interiors pick from a ramp with error diffusion, silhouettes by the edge's direction and height in the cell, and on a screen dense means bright, so a storm cloud is sparse and dim with a lit rim. The beam paints ten scan lines per row: dots stretched by half a dot (before reverse video, so dark strokes survive), smeared by the video amplifier, with a spot that swells with current. P1 phosphor saturates to pale mint and leaves afterglow trails behind falling rain; an old status line is burnt in. The raster is barrel-curved and falls off at the edges, with bloom and halation in the glass, a room window reflected in it, and the bezel's shadow. The putty plastic bezel has a chamfer that catches the green spill, a mould seam, a power LED and two knurled thumbwheels
Thermal camera lib/thermal.py · Thermal never painted in colour: the scene is a temperature field in °C — a room layered warm over cool, every object at its own temperature with its own gradients (a pot hottest at the base, a cat's eye hotter than its nose and ears), polished metal reading the room it reflects through emissivity, rounded bodies cooling toward their outline. Heat then leaks out the way it does: soaking into the wall behind the stove, rising in plumes that widen, cool and break into eddies and wisps, cold air pouring off an open fridge and spreading over the floor in tongues, warm paw prints that fade and spread with age, glazed tiles mirroring the oven. That field is seen by a modelled uncooled camera: lens blur, box sampling onto a 480×270 sensor, temporal noise and column stripes, a centre-cool vignette, detail enhancement, a hand-set tone curve mixed with plateau histogram equalisation, a false-colour palette, and a bilinear upscale that keeps a trace of the pixel grid. The OSD (status bar, spot meters, area box, hottest/coldest markers, a line-profile inset, a non-linear scale bar) reads every number off the same sensor image
Delft tiles lib/delft.py · DelftTile a tin-glazed tile wall made in workshop order: blank tiles on a grid that is never quite straight, the design pounced through a pricked pattern as charcoal dots, outlines with a fine brush (a bead where it lands, a taper where it lifts, heavier on the downstroke, a slow hand wobble), washes that cannot be blended (brush bands, bristle streaks, a darker rim where the water dried last, overlaps that darken, never quite inside the outline, white kept by painting round it); one transparent pigment, so everything is painted front to back with reserves instead of layers; dull grey-black raw pigment that the kiln turns into cobalt by per-channel Beer–Lambert absorption, with a soft bleed into the glaze and a speckle of grains; every tile painted and fired on its own, so lines step at the joints and each tile has its own white and its own blue; quarter ornaments that only become whole where four single tiles meet; recessed lime-mortar joints; every tile a little cushioned and tilted, so a window reflects as bent, broken panes and the rounded edges catch the light; crazing, iron specks, chips showing the buff body, a crack that stops at the joint
Cave painting (ochre) lib/cave.py · CavePainting the opposite of the petroglyph: pigment laid on pale limestone and seen only by a fire. The wall is a height field (broad swells, ridged folds, faint solution scallops, pits that hold clay, calcite crust on the convex parts, wet flowstone drapery) under a cream-to-buff albedo; every pigment is a coverage field multiplied into it, so the rock's mottling shows through even a dense coat. How it was applied decides the look: charcoal searching lines on a wandering contour, a dry stick that catches only the rock's tooth, blown paint with a soft edge, halo and droplet speckle, denser at the rim and on the side of a bulge turned away from the fire, pale bellies left bare; hand stencils sprayed in several puffs aimed at the fingertips. Lit only by a campfire and a fat lamp on the floor: half-Lambert point lights with inverse-square falloff and shadows marched per pixel, so raking light makes every bulge the animals were painted on read as volume; flame tongues, sparks, bloom, a smoke plume, soot on the ceiling, calcite veils, flaked paint and a cave bear's claw marks
1-bit paint program lib/macpaint.py · MacPaint the whole screen of a 1984-style black-and-white paint program, not "pixel art": a 640×360 framebuffer with exactly two values, blown up ×3 with no smoothing; every tone is one of 38 eight-by-eight patterns anchored to the document origin (two fills of one pattern butt seamlessly and never bend with the shape), and gradients are bands of patterns; the tools behave like the originals — square-pen Bresenham lines with stair-step jaggies, shapes filled with a pattern and framed inside their outline at the current line width, a 4-connected paint bucket, a spray can that ORs random pixels in a disc, brush shapes, select-and-drag copies with Flip Horizontal, XOR; a hand-made bold bitmap system face (9-px capitals, 2-px stems), TrueType rendered with antialiasing off, bold / italic / underline / outline / shadow done as bitmap operations; the interface is redrawn for every snapshot: a menu bar with invented menus and rounded black screen corners, a 20-tool palette with the active tool inverted, a line-width box, a pattern palette with the current fill, a striped title bar with a close box, scroll bars with a 50 % track, a pull-down menu that shows each type style in its own style, a fat-bits zoom window, marching ants, cursors with white halos
Greek black-figure vase lib/blackfigure.py · BlackFigure the pot is thrown first — a profile r(y) with two round handles — and everything is painted on its unrolled surface, so the same painting wraps onto the curved pot and lies flat in the rollout without ever disagreeing. Work goes in the workshop's order: bands painted while the wheel spins (dead level, a small lap where the brush lifted), silhouettes in slip that is still a dull brown, details incised through it to the orange clay, matte added red and white laid on last; every figure part is z-ordered, so a nearer black horse hides the farther horse's lines and colour and cuts its own outline — four horses overlap and still read as four. Firing turns the slip into blue-black gloss that fires reddish where thin. Then 2,500 years: flaking white leaving a dull ghost, calcareous crust and root marks, chips showing the fabric, a toned plaster fill with glued cracks, a misfired patch. The photograph is lit like a museum shot (a tall softbox and a strip light reflected in the glaze, satin clay, the pale plinth in the lower glaze, a slight perspective bending every band into an arc), and each frieze is unrolled at its own circumference
Graphite pencil lib/graphite.py · Graphite graphite is a mass on the paper, not a colour: value is Dmax·(1 − e^−m), so layers build up but never reach black, darks stay a cool slate and hard pressure polishes them to a faint silvery sheen; the lead only deposits where it touches the tooth — light pressure grazes the peaks and leaves white specks, soft leads and hard pressure fill the valleys; grades 2H–8B differ in mass, reach and width; every stroke eases in, swells and flicks off; hatching is laid patch by patch with wandering seams and built up in layers (one direction, interleaved, then crossed at two more angles, each only where the tone asks for it); the side of the lead lays a grainy base tone, a blending stump smooths it inside the area it works, a kneaded eraser lifts soft lights and a hard eraser cuts crisp ones; construction lines to the vanishing point and looped wheel ellipses stay visible, and only the middle is finished — tone drops out stroke by stroke toward the edges, leaving bare line drawing, margin notes and a strip of pencil swatches
X-ray lib/xray.py · XRay nothing is drawn as a picture of an object: every object is built as material along the beam (a solid with rounded edges, a hollow shell, a round rod or tube, a spring whose far half dives along the beam, discs seen edge-on or face-on, zips, screws, cables, folded cloth), measured in canvas pixels, and adds μ × density × path length to two attenuation maps, one per beam energy — so overlaps simply add, and outlines glow for a physical reason (the beam runs along a case's side wall, a tube's walls, a lens barrel seen end-on). Beer–Lambert transmission then goes through a modelled line-scan detector (scatter haze at quarter resolution, focal-spot blur, per-row gain streaks and module seams, Poisson noise that grows where few photons get through) and two displays: an edge-enhanced, phosphor-glowing blue film where dense is bright, and the security pseudo-colour where the ratio of the two energies gives Zeff (organic orange, inorganic green, metal blue, opaque black) with the belt calibrated out. The OSD reads Zeff and volume off the picture, background-subtracted around each tagged object
1930s rubber hose lib/rubberhose.py · RubberHose made the way a studio made one frame, then printed and worn: a grey-gouache background painted once on board (washes with a dry-brush streak, airbrushed pools of light and contact shadows, a thin grey outline); actors roughed in pencil, inked on cels in an even, heavy black line and painted on the back in five flat greys with no shading; opaque cels stacked back to front, with clip masks for the overlays they pass behind (a hill, a window bar, a blanket). The vocabulary does the rest: constant-width hose limbs with no elbows, four-fingered white gloves with three stitch lines and a flared cuff, big shiny shoes, pie-cut pupils, open grins, props that come alive. Then the camera and the years: lens softness worse in the corners, halation, lifted blacks and held whites in a silvery-warm print tone, midtone-weighted grain clumps, uneven density, gate weave, a rounded projector gate, white and dark scratches that come and go, dust, lint and a hair in the gate
Linocut lib/linocut.py · Linocut made by subtraction, like the real thing: a rolled-up block prints solid black and every white in the picture is lino a gouge took away. Each block is a relief map; every cut is a tapered polygon with a crumbly edge — a V-gouge dips in to a point, widens and lifts out, a U-gouge bites with a round head and tears off at the tail — so tone is only ever the density and width of cuts (white lines in black) or of ridges left standing (black lines in white). Cleared areas keep a few low ridges of chatter that catch a little ink; a black thing on a black ground gets a carved white halo. Printing is simulated: a brayer film with stop-lines, the circular pressure of a hand baren, and the paper's tooth decide where ink lands, so big blacks go salty while edges stay solid; one spot-colour block is printed under the key, a few pixels out of register; the paper is pressed into the block, and the margin carries the pencil edition number, title, signature and a blind chop
VHS home video lib/vhs.py · VHSCamcorder not a retro filter over a picture but the three steps a home-video frame really went through, each one leaving its own marks. The room is painted as surface colour lit by its lamps (a dim warm ambient, a floor lamp that throws scallops up and down the wall, candle flames that light the cake and the child's hair from the front), with self-lit things in their own buffer and the child right in front of the lens on a defocus layer. A consumer CCD camcorder then sees it: hand-held roll, white balance left on 'outdoor' under tungsten bulbs (an orange room, a blue window), a soft highlight knee, bloom, vertical CCD smear through the flames only, a short lag tail, gain noise in the shadows — and its character generator mixes a chunky dot-matrix OSD into the signal, so REC, the counter and the date stamp go onto tape with the picture. Finally the tape: 480 lines, luma low-passed with the playback sharpness halo, chroma smeared ~6× wider, averaged over two lines and delayed to the right (reds bleed out of their outlines), streaky luma and chroma noise, line-by-line timebase jitter, flagging at the top, a tracking-error band, head-switching tear, dropouts and a lifted black level
Flat vector lib/flatvector.py · FlatVector an artboard of crisp anti-aliased geometric shapes (analytic circles, filleted polygons, tapered capsules, spline land profiles) combined with boolean ops, with no outlines anywhere; seven flat hues, every other colour a tone or mix of them; one light for the whole board, so every object splits into a lit face and a shade face (faceted ridge lines on the mountains, pines split down the middle, a cloud's belly cut from the cloud itself); the vector-paper depth cue: each lifted layer first drops a short, soft, night-blue shadow on what is already there, so every overlap shows a thin seam; glow as stacked flat translucent rings; a faint per-layer fibre and a fine, fixed print grain
Storybook animation lib/storybook.py · Storybook a real animation, not a draw-on: every piece of scenery is pre-painted once with a reveal map (the moment the pen or brush reaches each pixel), so ink lines draw along their length, washes spread with a darker wet front and props pop in with an overshoot — and the hills, flowers and banks are drawn exactly as the character passes (follow). The character is rendered every frame from implicit shapes in its own frame, squashed and stretched with a volume-preserving affine along its motion, rested exactly on the ground, lit by one fixed light so the highlight stays put while it rolls; poses come from eased, sprung and ballistic choreography plus impact lines, dust puffs, speed lines and ripples. The closing line writes itself in stroke order (skeleton walk), and the same scene renders a journey poster with the key poses multiply-exposed on a pencil motion arc
Ballpoint doodle lib/ballpoint.py · Ballpoint ballpoint ink is an oil paste a rolling ball lays down, kept as optical density, so a line drawn twice, a crossing or a blob goes darker and more saturated (blue deepens to blue-violet, never flat black); every stroke starts dry and thin, drifts in pressure and width, skips a few pixels now and then, drops gloops where the pen stops and at sharp turns, and flicks off in a little hook; outlines are gone over twice, slightly off; every stroke presses a groove into the copy paper that catches the raking light, and the sheet carries the blind indentations of a shopping list written on the page above; coloured pencil is wax on the paper tooth, hatched in quick slanted patches that run past the lines, light on big areas and pressed hard on small ones; the handwriting is the skeleton of a thin hand font re-drawn as pen strokes, each letter resized, tilted and lifted off a wandering baseline, with a word scribbled out and written again
Overlay sheets (tracing paper on a light box) lib/overlay.py · Overlay the picture is a product of transmittances: a warm light box glows through a base sheet printed in black line and grey tints, then through translucent sheets that each carry ONE ink, laid down on registration crosses; an ink's coverage is a screen tint (or a double hit above 100 %), and inks on different sheets multiply, so blue over yellow turns green, magenta over yellow red and magenta over blue violet; every sheet has its own paper tint, the cloudy fibre formation you only see against the light, stray fibres, a cut edge that reads as a thin dark line, punched holes that drop onto a steel peg bar; a lifted sheet is a little larger, throws a wide soft shadow you can see through it and blurs everything under it like the diffuser it is, then lands crisp with a thin contact shadow; curled corners, crepe drafting tape with torn ends, a clear film with a gloss sheen; the town under it is cut by recursive street splits into blocks with a ring of buildings and party walls, water-lined round the coast
Pastel UI (product-film interface) lib/pastelui.py · PastelUI one frame of a modern product film: a flat pastel field (blue, pink, yellow, lilac, mint, peach) with one big pool of soft light and a few white bokeh discs; macOS window cards with a frosted rim, a white body, the red / yellow / green lights and split panes, side panels, a dot pill and a step strip, a heavy headline with a translucent marker under the key words, status chips, round check / cross badges, text highlights, an inline reference chip and a callout tag; every shape is a signed-distance field with analytic 1 px anti-aliasing, and shadows follow CSS box-shadow (offset, blur, spread; a wide one tinted with the field colour plus a tight neutral one), so cards float without a grey halo; everything is drawn into named layers with a pose (offset, scale, opacity, left-to-right reveal) and a depth, so the same drawing pops a window up, writes a line, pops a badge or lets a companion rise from behind a card; a magnifier that enlarges the real pixels under it; a circular colour wipe between sections; three flat companions peek over the card edges — a starburst in a cream circle, a violet cloud with a >_ prompt, an orange pixel critter
Exam grading (an answer sheet marked in red) lib/grading.py · Grading an answer sheet on a green felt desk, printed like the real form — timing marks down the edge, a heavy title, fields, a ticket number with its bubbles filled, a score / grader table, numbered sections, ruled answer lines and a hatched grading column — with an answer key held by a black binder clip beside it; every paper has its own frame and pose, so a sheet can come down onto the desk (a little larger with a wide soft shadow while lifted, a thin contact shadow once down); everything written after printing keeps a progress value and a time map, so a stage can show a stroke half drawn: the candidate's blue-black answers, vermilion rubber stamps (ragged edges, clustered pin-holes, one end pressed dry so the thin border breaks, ink pooled at the rims, a wet bleed, a slight tilt, the paper dented round the rubber) and the red pen — a wavy underline, a ring that overshoots its start, a bowed leader, a note set in a bold sans and inked like the pen (no handwriting font), crosses, ticks and a score written stroke by stroke and circled; ink is Beer–Lambert density, so the red deepens where the pen slowed down and where it crosses print; a red pen shaded as a cylinder whose shadow spreads from the tip, and a varnished wooden stamp that comes down, presses and lifts
Shadow puppetry (皮影戏) lib/shadowpuppet.py · ShadowPuppet a shadow play seen from the audience, where everything on the screen is lamp light that came through it: a cloth screen lit by an oil lamp behind the middle (pale gold at the hot spot, deep amber toward the rim, thread slubs, a fold or two); puppets of scraped donkey hide kept as coverage plus an optical density per channel, so vermilion, teal, ochre and green glow, black dye is almost opaque and pieces darken where they overlap, in any order; pieces are cut, dyed in fields, inked along every cut edge and punched with the craft's hollow patterns (dots, rings, plum blossoms, coins, fish scales, ruyi cloud heads, lattice, ice cracks, stripes), and the hide's uneven thickness leaves no dye flat; a figure is a tree of jointed pieces with thread knots and an angle per joint (a hollow-carved or solid face in profile with one long eye and a long brow, a helmet with barred pheasant plumes or a crown with pompoms, cloud collar, breastplate mirror, scale armour, cuffs, thick-soled boots), with control rods tied to the collar and the hands; a puppet off the cloth grows, blurs and splits into two shadows (the lamp has two wicks), the soft double edge of a figure not quite pressed, and rods are sharp where they are tied and soft lower down; props come from the same leather (a pailou goal with a lattice net and a round eye, a stitched ball, a key-fret floor band, hanging name plaques); in front, a carved proscenium (key-fret lintel, a red lacquer plaque with raised gilt characters, an openwork valance and corner brackets the screen glows through) lit only by the light the screen spills onto its edges, and red paper lanterns lit from inside, with tassels and a warm halo
Pen & wash (钢笔淡彩) lib/penwash.py · PenWash small cold-press sketch cards made the way a sketcher makes them — a fineliner line first, loose watercolour after, then the cards photographed on a table. Each card is its own sheet (paper tooth lit by the window, a cut edge that is not quite straight), drawn unturned and laid down at a slight angle. The ink line is near-uniform but hand-made: low-frequency wobble and tremor, width drifting a few per cent, a dot where the tip rested, a flick at some ends; closed shapes are one to three strokes that stop short or run past the join on the tangent, box corners overshoot, a stretch is sometimes gone over twice; parts have a depth, so an outline stops where a part in front covers it. Washes start from the intended region and are then painted loosely: slipped 2–5 px off the line (spilling over on one side, leaving white paper inside the line on the other), an edge re-found on a wandering threshold that follows the tooth, a darker dried rim, granulation in the valleys of the paper, faint flat-brush streaks, density mottle, wet-in-wet drops for cheeks and crust, cockling where the paper got wet — and a gentler slip for small shapes, so a nose never turns into a white ring. A flat background block that does not fill the card is painted around the figure with a white halo; opaque white gouache glints go on last. Ink and pigments are optical densities, so overlaps darken and mix. Helpers for goofy characters: big round glasses, dot eyes, tufts, simple hands, limbs, inked frames, ground lines. The photo: oak planks with cathedral grain and butt joints, soft card shadows and lit cut edges, a fineliner and a water brush shaded as cylinders (the clear barrel refracts what is under it), window fall-off, vignette and grain
Retro gouache (复古水粉) lib/gouache.py · GouachePortrait picture-book character portraits in opaque gouache, painted the way a gouache painter works, dark to light and big to small: a warm imprimatura scrubbed onto the board, an umber underdrawing, a background laid solid and then scumbled with a nearly dry brush in lighter and darker mixes, flat masses, forms modelled in a few value steps, textures, features and dry-brush highlights, then the grain of the printed page. Every coat is opaque (it replaces what is under it), and a wet brush picks up a little of the layer below. One stroke is a flat brush dragged along a short arc: the hairs carry different loads, so streaks run along it; the paint runs out as it goes, so the tail breaks into specks where only the tooth of the board catches it; the sides are ragged and the head is rounded. Edges are crisp but wander and break on the tooth. Forms are inflated into a dome (an exact ellipsoid for noses, bobbles and pearls), lit from the upper left, quantised into soft steps and mapped onto five mixed colours, then brushed over with short strokes that follow the form, so the steps meet in brushy seams; core shadows under a brim, a nose or a beard are thin multiply glazes, and cheeks are powdery blush. Knit is modelled stitch by stitch (V-shaped legs with twisted plies, cables twisting in a column, ribbing with sunken purl columns) and multiplied onto the paint, so the large value steps survive. Hair, brows, beards, curls and bobbles are thousands of tapered strands that follow a flow field and are sorted by the light. Felt is mottle, fibres and a fuzzy silhouette. Helpers for goofy faces: round eyes with lids and catchlights (a look that can go cross-eyed), big bulbous noses with nostrils and a glint, big ears
Blue picture book (蓝调绘本) lib/bluebook.py · BlueBook a page of a soft-blue modern picture book, drawn the way the illustrator works and then printed: colour blocks, a loose ink line, dark masses scribbled in, small accents, chalk whites, weather, print. The palette is held to three blues (powder, cornflower, a deep teal-blue), black ink and paper white, with only a little coral, flesh pink and mustard. Every tool works on one paper tooth, equalised so that "the tool reaches where the tooth is higher than 1 − contact" turns a pressure straight into a coverage fraction, and pre-dragged in eight directions so the bare specks a dry tool skips are drawn out along its stroke. An ink stroke is a brush or ink-pencil line: the path wobbles and trembles, the pressure lands fast, lifts slowly and swells and thins on the way, the hairs carry different loads and run dry along the stroke so the line breaks into dry white streaks, and its edge wanders with the tooth; every pixel knows its arc length and its offset across the mark (Pillow rasterises segment ids, numpy projects exactly). Closed shapes are not closed: a contour is one to three strokes that stop short or run past the join, now and then gone over again a couple of px off. Dark masses are zigzag scribbles that turn past the outline, one wrist-sized patch at a time. Colour is dry crayon, pastel or dry gouache laid loosely after the idea of the shape: the region slips a few px, its edge wanders, its border dries out, it goes on in stroke lanes with a mottled density, and white specks of paper show through; wax is semi-opaque (over white it is the colour, over ink it stays dark, blue over blue goes deeper) and the line always stays on top. The background is a rough-sided block that stops short of the page edge, its border brushed along itself and dragged dry. White chalk sits only on the tooth peaks over the blue; rain is short dry strokes with splashes, ripples, flicked spatter and fine speckle. Character helpers: big round heads drawn open, dot eyes with a white glint, tiny smiles, stippled blush and freckles, and fluffy white animals whose outline is a run of scalloped ink tufts with chalk fur crossing into the blue. The print step adds a slight softness, lifted blacks, paper speck, a centre gutter fold and tiny page numbers
Jiangnan garden (江南园林) lib/jiangnan.py · JiangnanGarden a lush, finely painted spring garden in the manner of a contemporary digital-gouache illustration, painted back to front the way a landscape painter works: sky, far hills, haze, the trees behind, the buildings, the far bank, the water, things on the water, the foreground, the hanging frame, the seal. Every painting call takes a far value that pulls colours toward a pale blue-green haze and flattens their contrast, and haze bands separate the depth planes. The unit of paint is a dab — a pointed leaf, a round petal, a sword blade — and thousands of them are laid at once: Pillow fills every polygon with its own id into a 2× supersampled id map (later ids cover earlier ones), numpy looks the ids up in a colour/alpha table and box-averages back down, so a dab costs well under a microsecond. Trees are sets of clumps, each lit as a dome by one sun from the upper left; a dab takes its colour from a ramp of mixed greens by the light of the clump it sits on, and the tree is built as a gouache painter builds it: a leafy dark underpaint, a mid-dark body, leaves breaking out across the silhouette, small clusters of lit leaves where the light is high, and a few palest dabs on top. Blossom trees are clusters of round petals sorted dark to light over shadowed petals and green leaves, with branches showing through; near branches carry individual five-petal flowers and buds. A weeping willow is a domed crown over hidden boughs with hundreds of hair-thin strands hanging in tresses, darker and bluer behind, lighter and yellower in front. The roof is a real surface S(u, v): concave slope, widening toward the eave, flaring, sharply upturned corners; it is rasterised as a quad mesh and every pixel's (u, v) is recovered by Newton steps, so roll and pan tiles, course lips, tile ends, drip tiles, the soffit with rafter ends, the eave shadow, an openwork ridge with curled ends and hip ridges running up into the flying corners are all shaded analytically. Lattice (grid, lantern frame, cracked ice) is drawn at 3× and lit on its edges; the zigzag bridge, its slabs, piers, posts and pierced panels are projected through a pinhole camera and shaded face by face. The lake mirrors the canvas above the bank line, rippled sideways, blurred vertically, darkened and mixed with the jade body colour toward the viewer; the bridge, a boat and an egret get their own reflections, and lily pads lie foreshortened on the water plane. Dappled leaf shade, a red lantern, a gilded plaque, a tiny worn seal, and a finish of slight softness, a glow around the lights and fine grain complete it
Dry-brush blocks (干刷色块) lib/drybrush.py · DryBrushBlocks a mid-century poster / gouache-collage illustration built from a few big dry-brushed blocks of colour on cream paper, in a strictly limited palette: forest and sage green, teal-blue, navy, a near-black, vermilion, a touch of sky blue and celadon. Every block is painted in its own brush frame: the mask is rotated so the stroke runs along +u, coverage, value and colour mix are computed there with plain arrays and rotated back, so bristle streaks, lanes and dry ends always follow the stroke. A block is laid in parallel passes of a wide brush or roller, each starting loaded and running dry toward its end by its own amount, optionally broken into overlapping strokes of different lengths and tones; the sides come out nearly straight and the ends as a comb of tines, longer at the dry end. Paint only reaches the paper's tooth where the contact pressure is high enough — the tooth texture is histogram-equalised, so pressure maps straight to coverage — which gives scumbled patches and dry stretches with the paper or the colour below showing through; an overloaded brush stays solid. The backdrop slab behind the subject is laid with a roller tooth (nearly flat, clustered speckle, a crisp loaded edge, stippled dry sides, a few fine scratches); torn-paper pieces tear only along some stretches of their outline, with a pale fibrous rim. A person is a few planes — a jacket whose lit and dark halves are brushed in different directions, a head of skin planes with a darker nose side and a warm tip, rough black glasses, a white beard in dry scumble, a hand seen from the thumb side — and bottles are vertically brushed silhouettes with one light streak and a block label. One small vermilion square sits off to the side, and the finish reproduces the painting like an offset print: slight softness, paper grain, specks knocked out of the darks, a little dust
Twilight storybook (暮色微缩绘本) lib/twilight.py · TwilightStorybook a tender dusk picture-book page full of miniature detail, at the hour when day turns to night. The dusk sky is a six-stop gradient (lavender, lilac, rose, peach, apricot, gold) whose stops are warped by horizontally stretched noise, so the colours lie in soft layers, with lens-shaped clouds (soft lumpy tops, flatter and crisper bottoms), thin light streaks and a pale low sun. A feathered night field N (0 dusk – 1 night) is laid across the canvas from a wandering boundary: the night gradient, the Milky Way, the stars and the moon are painted with N as their alpha, so the stars thin out across the boundary instead of stopping at a line, and the band between is re-saturated so dusk passes through mauve, violet and indigo rather than grey. Every lit thing painted later — hills, flowers, figures — is shaded by the same field through a linear 3×3 grade (desaturate, then a cool tint), so a white daisy on the night side turns moonlit blue; emissive things and the plate are painted unlit. The Milky Way is an analytic band with cloudy density, a dark rift and thousands of faint stars sampled from it; stars follow a power law, are splatted with sub-pixel accuracy, and the brightest few get four-point sparkles. Hills are misty ranges and patchwork stripes that widen toward the viewer, cut into slanted fields with crop rows and hedge lines, dotted with tiny round trees. The meadow is placed by perspective with rejection sampling — size grows with depth below the crest, density follows coverage — so the crest is thousands of specks and the bottom a few dozen big flowers of eight species, all sorted by the y of their base and rasterised in one pass into a supersampled id map. Flat, cute figures sit in it: a hooded wanderer, a jar of fireflies, a four-panel kite whose string turns from dark to silver against the sky. Over it all lies the language of a scientific plate: fine ink lines drawn at 3×, hatching, drafting dimensions, a scale bar and a circular "detail a" inset, plus tiny lowercase captions set glyph by glyph from a thin hand font; the finish adds softness, bloom, grain, a plum vignette and a torn paper edge
Hatched nocturne (排线夜景) lib/nocturne.py · Nocturne a small night print built entirely from short directional strokes, the way a pastel or coloured-pencil artist hatches a nocturne, then mounted on cream paper. The sheet has an equalised tooth, mottling and fibres; the picture is underpainted dark and every mark is clipped to it like a taped edge. A stroke is a centreline integrated through an orientation field (angles mod π, so it never flips halfway), bent a little, with a blunt landing and a tapering tail; tens of thousands are rasterised at once by filling each outline with its own id into a 2× supersampled integer map, then, for every covered pixel, numpy looks up that stroke's colour, start, direction, length and width, recovers the position along and across it, and from that its bristle lane — six lanes per stroke with their own value and load, running dry toward the tail, the pigment only catching the paper where the tooth (dragged along the stroke's own direction) is below the pressure — so every stroke is streaky and grainy and the dark ground shows in hairline gaps. Fields set the "wind": the sky streams diagonally, steam rises with its column and curls only at the rims of its billows, slopes follow the fall lines of the cone, the sea drags in long horizontals that lengthen toward the viewer. Each stroke jitters a little in value and in hue (a true rotation about the grey axis). There is one warm light: point and emissive lights sum into a light map, and the glow is laid as strokes whose landing probability follows light × receptivity — added (screen) for air and glare, painted as light × receptivity for lit surfaces, so a blue-grey cloud turns red-orange rather than pink, and the hottest strokes whiten toward warm white. The hot source is a fan of yellow-white, orange and red strokes round a tiny core. Lava runs as braided rivulets — a walk with momentum that keeps turning toward its end and down the fall line, strands drifting apart, low-angle branches fading out or stopping in a bead — drawn as emission with a tight halo and light strokes on the slope; sparks fly on ballistic arcs. The sea reflects the picture above the waterline as horizontal strokes, stretched, rippled, darkened and laid only where the mirror is bright, plus a glitter column under the light. Two tiny seated figures with a red scarf and a warm rim give the scale; a plate mark, a pencilled title and a smaller note in a thin plain face, a restrained bloom and fine grain finish the print

Ask Claude to "draw it yourself", "paint this with code", or "claude绘图", and name a style if you like. Claude then:

  1. Plans the composition: layers, a focal point, breathing space, and a subject that illustrates the idea.
  2. Writes a short scene script using the library.
  3. Renders it, looks at the result, and fixes it against a per-style checklist of real failure modes, usually over 2–4 rounds.

Why code instead of an image model?

  • Directed composition: placement, empty space and accents are exact, not sampled.
  • Reproducible: the same seed gives the same picture.
  • Animatable: stage() snapshots let a video show the picture being made. The GIFs above are exactly that; a generated bitmap can't do it.
  • Runs anywhere: offline, on a CPU, with no GPU, key or quota.

Install

git clone https://github.com/cloveric/claude-drawing-skill.git ~/.claude/skills/claude-drawing
pip install -r ~/.claude/skills/claude-drawing/requirements.txt   # numpy, Pillow

Titles and notes need a CJK font. macOS Kaiti/Songti, Linux Noto CJK and Windows KaiTi/SimSun are found automatically; you can also set INKPAINT_FONT=/path/to/font. Many styles also look for common Latin system fonts (a sans, a rounded bold, a script and a handwriting face, via core.latin_font); override any of them with INKPAINT_FONT_<STYLE>, e.g. INKPAINT_FONT_HAND. No font files are bundled.

Quick start

import sys; sys.path.insert(0, "lib")

# ink wash
from inkpaint import Painting
p = Painting(1920, 1080, seed=7); p.paper()
far = p.ridge(560, peaks=[(420, 150, 330), (1650, 110, 260)]); p.wash(far, dens=0.16, decay=170, mist_y=700)
main = p.peak(1130, 252, shoulders=[(1380, 70, 90)]); p.wash(main, dens=0.46, decay=240, mist_y=920)
p.cun(main, 530, 1730, shadow_x=1130); p.trails(main, (1130, 252), n=16, red_index=7)
p.mist(960, 70, 0.8); p.sun(1500, 190, 46); p.save("ink.png")

# watercolour
from watercolor import Watercolor, hexc
from core import blob_pts
w = Watercolor(1920, 1080, seed=1); w.paper()
w.gradient_wash(0, 540, top=hexc('#8fb0cf'), bottom=hexc('#f2cfae'))
leaf = w.shape(blob_pts(900, 760, 260, 90, rough=0.1), soft=2.5)
w.glaze(leaf, hexc('#a9c46b'), 0.75, edge=0.55, gran=0.35, bloom=1); w.save("watercolour.png")

# paper collage
from papercut import Collage
c = Collage(1920, 1080, seed=2); c.background('#232d66', texture='kraft')
c.piece(mask=c.circle_mask(1360, 300, 150), colour='#f6d77a', texture='crayon')
c.face(1360, 310, 128, mood='sleep'); c.save("collage.png")

Every style has a complete example: python3 examples/<name>.py out.png --stages stages/. --stages also writes the draw-on snapshots.

Principles (the checklist Claude uses)

  • Ink: paint far to near, and each wash occludes what is behind it. Tie dab spacing to bristle size so strokes never look beaded. Paths should be few, smooth and emerge from mist. Texture strokes are long, follow the slope and sit on the shadow side.
  • Watercolour: keep the paper tooth subtle. Pool shadows wet-in-wet on one side, not in bull's-eyes. Keep darker glazes inside the first crown. Use at most three glazes in one place.
  • Collage: big areas use flat or kraft paper, and crayon texture is only for accents. Torn white rims are 5–8 px wide and appear on only part of an edge. Shadows use a zero-padded shift.
  • Coloured pencil: hatch densely enough to saturate, and let pressure decide how deep the wax reaches. White objects are warm off-white with lavender or blue-grey shading, never white on white.
  • Anime: clouds are many lumpy puffs, each with a hard crescent shadow (the puff minus itself shifted toward the sun). Keep character proportions right.
  • Editorial: use 4–5 inks and overlap them on purpose. Every ink layer gets grain, uneven density and a few pixels of mis-registration.
  • Oil: lay big strokes first, then smaller ones, then detail only where it matters. Keep the relief modest (flat-topped ridges, soft speculars), or strokes turn into plastic tubes.
  • Ukiyo-e: flat colour blocks plus bokashi only on skies and seas. Clouds are opaque bands. The key block outlines everything, and a cartouche and seal sit in the empty sky.
  • Pixel art: paint at the true low resolution and dither instead of blending. Keep glows small (a big dither glow turns into a square). Upscale with nearest-neighbour only.
  • Clay: think in heights (px) and let pieces drape over what is below. Finger smears must be wide, soft and few, or the sky turns into crumpled foil. Never wrap non-tileable noise: it leaves straight seams.
  • Cyanotype: think in UV transmission, not paint. Thin leaves ~0.85 opacity with fully blocking veins; lift fluff off the paper for a soft penumbra. A fern pinna is one lobed blade, not a row of separate leaflets. Dry-brush stroke ends are crisp broken streaks, not a blur.
  • Cross-stitch: everything lives on the hole grid. Never lay half stitches over cross stitches (switch floss colour instead). A short diagonal back-stitch is one stitch from hole to hole, or it snaps into L-shaped steps.
  • Panel: one key light for every part: lit upper-left edges, shadows to the lower right. Grille-cloth lurex needs long floats (short ones read as a perforated dot grid). Keep legends off busy textures and away from scale ends.
  • Chalkboard: even full-pressure chalk keeps ~15% pits and soft, broken edges, or it reads as vector lines. Draw ∝ by hand (a bold font's ∝ closes up into ∞). Shade large areas lightly with a pressure gradient. Ghosts of the last lesson stay faint and sit in empty space.
  • Cyberpunk: mirror each object from its own ground row, not one horizon line. Keep shop interiors dim (0.2–0.45) or the street turns into over-exposed walls. Light rain streaks only near the neon. Light trails cross the street instead of all flying into the vanishing point.
  • Hand-drawn cartoon: draw back to front, since every fill knocks out what is behind it; put limbs down before the body so the shoulder hides. Lines are heavier on the shadow side, and colour sits a few pixels off the line. Keep texture where it belongs (toasted edges, not across a face). Boil only the ink between frames: pencil and colour stay on the sheet, which also keeps the GIF small.
  • Isometric: light real solids with one sun instead of painting three face tones by hand. Wall occlusion must look out along the normal and skip the building's own height and eaves, or white walls turn grey; never interpolate column tops and bottoms across an edge. Keep floating cards, clouds and hairlines out of the height map. Lay wave dashes along world y − x (screen horizontal), and leave a wide sea on the two front edges so the island reads as an island.
  • Line art: one path, drawn in order: string shapes with chain(), reach windows with an invisible retrace, let loops ride along the path, and put a loop where the path runs level, not on a climb. Draw motion paths with a lighter hand (~0.6) or they read as one more hill. Keep exactly one accent colour and plenty of empty space.
  • Soft 3D: near a shape, light queries (AO, shadows, dropping a ball) need its exact distance, not its bounding box, or balls rest on thin air. Don't carve a trench around a subject: pile the displaced balls into the hollows at its feet. Fill shade with the material's own hue (grey mint looks dirty). Match the haze to the backdrop, and set the lens with the camera so every stage is soft.
  • Shape morph: every object is one closed outline. Resample both shapes to the same point count, same winding, and align the start point before blending, or the in-betweens collapse into slivers. Keep keyframes around 0.6 of the panel width and show only three ghosts per transition, with the middle one filled. Dash the motion path so it doesn't mix with the dotted matched points. Shapes stay perfectly flat: paper tooth only where bare paper shows.
  • Newspaper collage: print first, then tear or cut, then glue. The pale torn core shows only along stretches of a tear; scissor cuts are chains of short straight snips with a margin that wanders. Halftone subjects must be a step darker than their backdrop, and gear teeth or spring coils need about 4 screen cells of spacing or they turn to grey mush. Fake newspaper text is generated pseudo-words only.
  • Aurora glass: blur what is really under the pane, then veil it lightly (tint ~0.24, saturate ~1.5), or it turns into milky plastic. Let orbs pass a third or more behind the glass and never touch an edge tangentially. Overlap cards only inside each other's padding. Give each gradient one meaning. For the GIF, weight saturated pixels in the palette sample and add one static Bayer pattern.
  • Bauhaus: print light to dark, one ink per screen, and keep everything of one colour on its screen so misregistration moves it together. Keep bare-paper pits to ~2% and only in thin-film streaks, or solids turn to sandpaper and type to a worn rubber stamp. Use a light 3×3 edge blur (a big blur rounds the corners). Knock labels out of dark solids instead of printing black on blue, and keep margin text clear of the crop marks.
  • Synthwave: keep the sun's base colour low and let the bloom lift it, or it burns to white and the slits fill in. Break the sea's reflection into bands stretched about the sun's column, and let light sources reflect more strongly than the sky. Measure grid lines in screen pixels and swap dense cells for their average. Keep tape damage mild: one tracking band, sub-pixel jitter.
  • Perler beads: build real tubes and let the light make the bead: the hole, the peg inside it and a sliver of side wall are what separate it from pixel art. Iron with melt, not paint: 0.4 is the half-melt (holes open, beads stuck, diamond gaps), 0.7 a finished piece; drop seam grooves and fine grain once it is flat, or it turns into hex nuts and frosting. Shade walls from smoothed maps sampled at their foot, never from the anti-aliased edge row. Keep heaps about one bead deep. Gloss comes from a soft box seen in reflection (an arc on the upper-left rim), not a Fresnel ring around every hole.
  • Petroglyph: knock the varnish off, don't paint light on: pits break through to paler stone and the low sun shades each one. Peck densely (about 3× the pit area) or it reads as sprinkled chalk. Varnish is a near-uniform dark coat; streaks are separate crisp-edged runs that narrow and fade downward — full-frame stripe noise turns into wood grain, hard-topped rectangles into a barcode, blur into smoke. Spalls need small scalloped lips and fresh orange stone; keep AO light or every step grows a black ring. Pad the height map by edge before marching shadows. Show at least three ages (fresh, centuries, ghost).
  • Egyptian tomb painting: declare everything first, then paint in the old order (grid, red sketch, ground round the figures, one pigment per pass, outlines, text, age) and keep every layer, so damage can uncover the one beneath. Bending figures must turn their shoulders toward profile, or the back shoulder rides above the head. Labourers go bare-chested; collars and size belong to the overseer and the scribe. A plaster loss needs depth (a height field and a cast shadow on its upper-left wall), not a brown patch with a bright rim. Keep detail z-offsets tiny (+0.002), so a basket's weave never jumps over the arm that holds it.
  • Roman mosaic: let the rows do the drawing: eyes and details first, then the outline row, then fill inward along the outline, halo the figures, and only then lay the background — the flow of the rows (andamento) is what reads as mosaic. Keep stone tops polished and low (1.5–2 px) or the floor turns into cobbles. Match stones on hue before lightness so greys stay grey. The spine filter must see past the next row, or outline rows swell. Set whatever must stay whole (eyes, the fish in a net) before the lines that cross it. Age it last: lacunae with sockets in the old bed, one crack, dirt in patches.
  • Stained glass: every colour edge is a lead, so plan the pieces like a glazier: one glass() call per area of one glass (a separate region always leaves a ring of lead), cut only what glass can be cut (trunks and boughs about 16 px and wider; paint the twigs), and model volume with matt and sticklight, not extra pieces. Keep the leads near-black and let halation eat only their edges. Fix the saddle-bar heights first and keep birds, faces and words clear of them. Light the room only at daylight(), so the stone stays still between stages.
  • Illuminated manuscript: work in the scriptorium's order: rule, write (leaving the rubrics and initials blank), rubricate, draw the diagrams, gild, paint, then pen. Gold goes down before any paint, and the paint goes round it. Treat burnished gold as a mirror whose colour is the room it reflects: give the gesso a gentle burnished wave and put flat gold on the slope of the window light, and keep the camera far away so one side of the spread doesn't turn olive. Measure every line before writing (about 45 characters at an 18 px x-height), hyphenate rather than over-justify, and keep the sprays clear of the text and of the bar.
  • Leonardo codex: hatch the way a left hand does: '\' everywhere, laid in bands with shared, slightly staggered breaks, never a chain of bowed dashes (that reads as fur). Model a form by where hatching stops, not by darkening everything: across a membrane panel use t² from one rib to the next, and cross-hatch only the deepest band. Bat-wing edges sag inward between rib tips. In a fanned wing draw only what shows of each feather and keep the tips round. Keep the paper old (yellowed clouds, crisp foxing, a tide line) and the ink warm. Let the pen run dry and be re-dipped; mirror-write the notes right to left, ragged on the left.
  • Silhouette: write each profile once as control points and splined outlines, and fix proportions with warp= instead of retyping coordinates. Cut fine detail rather than drawing it: plumes, lashes, whiskers and rigging are separate snips at 4×, and one cut-out (an eye, the slit in a bow loop) does more than ten lines. Bronze sparingly: six strands of hair, a brim edge, a few folds; dense parallel lines read as a striped helmet and random arcs as bubbles. Leave a sliver of card between overlapping shapes (sails, jibs, ribbon loops) or they fuse into one black mass. Size each caption to the oval's half-width at its height.
  • Letterpress poster: press one ink at a time and let the second pass land a few pixels off; never draw the misregistration by hand. Set every wood-type line to the full measure (squeeze or stretch the face, then letter-space) and ink each letter as its own block. Keep salt to the inside of solids, about 1–5 %; any more and it reads as a noise filter. Hatch with line width following a tone so lines taper out in the light instead of stopping. Build an animal as one silhouette with a single outer key line plus a few internal contours; the legs stand vertical under a body tilted about its hip.
  • Constructivism: keep every colour on its own plate and only misregister whole plates, so red and black move against each other together. Black on black cannot be knocked out: keep wave lines and slabs clear of labels with reversed numbers. Lattice photos need sparse, thick members, a paler far side and a light pre-screen blur, or the halftone fills in to a dotted cone. Put cut-out photos over red or black, or the paper margin disappears; let the scissors bridge narrow gaps and fill enclosed holes. Hide the end of a wedge under the photo it points at. Pad the plates before shifting them, or the edge of the sheet shows bare paper.
  • Art Deco: never draw a line; cut a frisket and spray a fade into it, and let form come from light and dark only. Keep droplet grain to the thin part of a coat (noise × d(1 − d)); everywhere-grain reads as sand. For the 3D machine, build an exact distance field (a core segment dilated by a radius, stretched only along the track) — scaling a cross-section toward a point gives fingerprint artefacts on the nose. Measure where the nose surface really is before placing the headlamp and ending the stripes. Make bright things reflect more than dark sky in the river. Keep the towers below the title band and put the clock on the tower face, not above it.
  • Golden-age comic: let the press make the look: give flats as Ben-Day tint mixes, screen each plate at its own angle and print it a few pixels off; never paint dots or misregistration by hand. Keep the blue plate out of browns (C+M+Y rosettes read green at a coarse screen) and keep two-plate tints to a few areas so the figures stay legible. Draw what is behind first and let each part erase the lines it covers (the crew before the hull). Feathering lengths should drift in waves, not tick like a ruler, and must not run through lettering. Make sure wind-blown props (scarves, ears) don't cover the next character's face.
  • Pop silkscreen: paint first, print last, and never trace the colour shapes from the key: simplify them, make them a little too big or too small, and give each panel its own paint drift and key shift, so the misregistration changes from panel to panel. Put the expression in the key and the mood in the colour scheme. Draw closed eyes as bold arcs, never as a thin line over an eye-shaped patch, which reads as a brow. Keep the ink believable: density 0.92–0.95 is starved but legible, 1.1–1.15 is heavy, and flood above about 0.5 fills half the face. Starved ink should break into squeegee streaks and clumps, not into the canvas weave (that reads as a digital grid). Build masks with a running np.maximum, not a list of full-size masks.
  • ASCII art (line printer): paint roles and tones into the hidden map, never characters by hand; give each material its own symbol ramp (letters in a fill read as words). Pick line characters by direction in real pixels, not by template match, and keep one cell per row; run lattice braces one column per row so crossings land in a cell centre and print X. Outline lit puff tops only and let tone carry the shadows. A flame is a column that widens from the nozzle: sparse ! | ' . streaks inside, a % @ # smoke sheath at the rim, running into the cloud. Weak strikes must break up on the ribbon and paper tooth, not go grey.
  • Low poly (1999 3D): build the frame the way the hardware did and let its limits show: a small framebuffer blown up with no smoothing, flat-shaded facets, blocky texels, fog that hides the far plane, 15-bit dither. Don't make the painter's sort fight hidden geometry: leave out faces nobody sees (the river bed under the water) and give decals a depth bias. Compose with the camera: put the hero on a third with aim(), bend the track so the targets step away diagonally, and keep some sky for the sun and its flare. Gold wants a thick tube, few facets, a low-shine glint and a warm base, or the blue sky light turns it olive; if the sun is in frame, light the scene from higher than the sun you see. Keep the flare to dots and solid hexagons, away from the subject.
  • Stencil graffiti: cut it like a real stencil: run bridges() (or check islands() is 0) on every card, or the middle of every O and every gap between an arm and the body silently falls out. Do tones as separate cards, light to dark, with shade_side() for the grey and black plates; make the black plate bold (a third of the figure), keep the grey clearly between white and black. Keep the card mostly flat: the crisp core is the point, and a lifted card everywhere turns every edge furry. Spend drips where they tell (the black plate, the lettering, under the reel), a couple at most on the light plate, never from bridges. Things that stick out of a figure (a scarf, a fringe) must not read as limbs: two tails from one knot, stripes, fringe strands that do not touch.
  • Embroidered patches: give every shape its own stitch angle and change it between neighbours — the angle, not the colour, is what separates two pieces of thread. Tatami for anything wider than ~60 px; satin for letters, peaks, flames and other narrow shapes, laid across the narrow dimension (flames sideways, not up). Keep the lit face of a mountain mid-tone so white satin snowcaps pop. Draw small details before whatever sits on top of them, and clip running stitches to the patch. Die-cut corners need a radius of at least twice the border width. Merrow for circles, ovals and rockers; a hot-cut satin border for any other outline.
  • Blueprint: ink the tracing and let the print make the look — never paint white lines on blue. Stick to a few pen weights (heavy for cut outlines, medium for edges, thin for hatching and dimensions) and keep small lettering at a pen of at least 1 px, or poor-contact areas blur it away. Make every view obey drafting conventions and agree with the others: the same levels across elevation and section, cutting planes marked where they cut, hatching scraped back behind figures (clear=True). Give the sheet one small story told by a labelled detail (here: how the lamp, the prisms and the lens make one beam). Age it only after printing — folds, a faded outside panel, a stain, pin holes — and keep red pencil as the single accent; reserve palette slots for it in the GIF.
  • Children's crayon: draw it the way a child does: outline the things first, then colour the big areas (sky, hills, grass) around everything already on the paper with avoid=U(OBJ, c.drawn()), and colour the things last on bare paper; crayon over crayon is semi-opaque, so a red tulip coloured on top of green grass turns brown. Big areas want a wide crayon (20–22 px), low density (0.55–0.65) and a reach of 240–300 px, so the patchwork of stroke directions and the white gaps show; small things get reach=None, a narrower crayon and higher density. Keep the hand naive (big heads, stick arms with rake fingers, a sun in the corner, everyone in a row) and let some colour overshoot. Leave a clear patch round the title and the signature, and stop background lines behind people with line(avoid=...). Real crayons on the sheet are a strong material cue but keep them to a corner.
  • Green-screen CRT terminal: think in light, not ink — dense characters are bright, so dark things (a storm cloud) get a sparse dim fill and a bold rim only where lit. Brighten with attributes (dim → normal → bold) rather than busier characters, and keep line-like characters (- = +) out of fills. Outline clouds with 'cloud' (every slope a ( or ), flat tops and bases _ . - ') and put cloud bases on whole rows so they print as one _. Thin outlines don't survive a 5×7 font: fill small shapes such as a crescent moon with bold % # @. Stretch dots before reverse video and keep reverse bars dim. Downscale the GIF with BOX and a Bayer dither.
  • Thermal camera: paint temperatures, not colours: decide what temperature every object has and how it varies (base vs. rim, face vs. back, top vs. bottom of a window), then let the heat leak out (soak, plume, pool, prints). Use a hand-set curve= so the room, the warm bodies and the stove each get their own band of the palette — automatic histogram equalisation turns a room-temperature scene garish and gives the cat the same colour as the wall. Only flames should reach the white end; break up big uniform warm areas (a damp towel on the oven door); low emissivity (a polished lid, steel handles) separates parts for free. Put the OSD over the boring parts of the picture and let spot, box and profile read the numbers off it — never type them in.
  • Delft tiles: paint in workshop order and keep outlines and washes apart (every layer has a trek and a wash part), so the stages can replay pounce → outline → wash → kiln. Draw front to back and occlude() every silhouette: there is one transparent pigment and nothing can be painted over. Get the blue from absorption, not from a colour pick (pale washes are grey-blue, thick lines violet-navy). Let every tile shift its paint by a pixel or two and fire to its own strength — that is what makes a tableau read as tiles rather than a print on a grid. Keep the glaze smooth at small scales: orange-peel noise turns the window reflection into glitter; only the tile's cushion, tilt and a slow ripple should bend it. Screen the reflection over the glaze (never add pure white) and put it over painted sky or border, so the blue shows through and it breaks at the joints. Cracks stop at the joint.
  • Cave painting: paint on the rock, don't cut it: pigment multiplies into a pale limestone albedo and the only light is a low fire, so relief does the modelling — put the bison on a real bulge and let raking light round it. Keep fine height grain tiny (grazing light turns it into sandpaper) and the big swells moderate (a low lamp drags them into dirty shadows; let only the fire cast shadows). Blow paint densely (≈0.95) with a light rim; a whole-hand blur makes stencils into red rings — spray several puffs aimed at the fingertips and let 1 − exp(−c) fade them. Black legs must stop at the body line or the thighs turn into two black blobs. Cracks must be thin zigzags, or they read as twigs and strings.
  • 1-bit paint program: tone is patterns only — choose a lighter or darker pattern per region, build skies with bands(), and make the window (the light) the brightest area in the picture. Put small subjects on the emptiest ground (a white butterfly in front of gingham vanishes) and separate dark shapes with white lines or XOR, never grey. Spray sparingly — one soft edge under a ledge, a shadow beside a black shape; on a patterned ground it reads as dirt. Draw one of a symmetric pair and copy(..., flip=True, mask=...) the other. Keep distant objects out from behind foreground plants. Let the snapshots show the work: change the tool, pattern and cursor at every stage, open a menu or a zoom window once, and end on a selection.
  • Greek black-figure vase: paint on the unrolled surface and let the pot and the rollout share it; put the figures you want seen on the front half (x from 0 to C/2) and let the back carry the rest of the story — the rollout is where it gets told. Declare figures far to near and keep incision and added colour as separate passes: overlaps are told apart only by incised outlines, never by a second shade of black. Horses need their bellies well off the ground line and legs angled down to it, or the team looks like it is swimming; put a white horse farthest and raise its head. Narrow the softbox reflection to a vertical strip, or the glaze highlight reads as an extra white figure. Age gently: a little flaked white, crust low on the body, a mend toned close to the clay.
  • Graphite pencil: work like a pencil artist — construction lines first (horizon, lines to the vanishing point, ellipses with their axes), then contours, then the side of the lead for a base tone, hatching layers for the middle values, the darks pressed in last; blend with the stump inside each area (contain=True) and pull the lights out with erasers (rims, tube highlights, the lit edge of a corner, glints on glass) rather than leaving holes. Paint dark objects (a painted frame, tyres, a saddle) as real values, not white cut-outs with outlines. Keep cast shadows hatched, crisp-edged and lighter than the object that casts them, or they read as a blurred double. Finish only the middle (focus): let strokes drop out toward the edges so the sheet ends in bare lines — fading the tone smoothly looks airbrushed.
  • X-ray: build things the way they are made, not the way they look: a case is a thin shell 25 cm deep, a trolley rail is two nested aluminium tubes, a lens is rings seen end-on plus glass that is thickest in the middle, a heating element is a coil of coil — the X-ray look (glowing outlines, double edges, bright spring turns, white bolt ends) then comes out of the path lengths by itself. Give the story object the most attenuation per pixel (chunky bones, a steel pin) and keep big organic masses (clothes) faint but textured. Let several things overlap — it is additive, and overlap is what makes it read as X-ray — but keep the hero clear of the brightest metal. Tag what the OSD talks about and write {tag.z} / {tag.ml} instead of typing numbers.
  • Rubber hose: keep the cels flat and the background soft — five flat cel greys with a heavy black line, sitting on a grey-gouache background with thin grey lines, is what reads as "1930s"; shading a character makes it modern. Ink only outside the fill, paint the pieces of a glove or shoe as one union so no line splits them, and draw back to front with clip masks for whatever an actor passes behind. Never put a flat ellipse over a head (it reads as a halo) or a crown of triangle rays on a sun — give the sun a scalloped corona with short, bold dashes. Age the print last: midtone-weighted grain, lifted blacks, gate weave and a rounded gate do more than piling on scratches.
  • Linocut: start from a solid black block and only ever cut — tone is the spacing and width of gouge marks, never grey. Keep most of the sky black (a few hundred thin wind streaks in bands, nothing near the moon) or the big black-and-white contrast is lost. Give black things on black ground a carved white halo, and white things crossing white ground (smoke over a snowy hill) a thin black edge. Keep the spot colour to a few small, meaningful places (lit windows, a lamp, a spill of light) and let the key block's ridges run over it. Let the print do the ageing: salty blacks, solid edges, faint chatter, a light emboss — don't paint them in.
  • VHS home video: light the room, don't tint it: give the scene real lamps (light, floor_lamp, a light on every flame cake returns) and keep the ambient low, so the camcorder has something to clip and the corners have something to be noisy in. Let only point sources go far over the top — anything big over ~2 turns the CCD smear into a pillar across the frame. One strong complementary colour against the tungsten orange (a blue window, a green sofa, a teal shirt) does more than any filter. Paint the near subject on layer(defocus=), tilt the camera a degree or two, and put the OSD in through the camera (rec, datestamp, zoom_bar) so it smears with the tape; keep the tracking band at the bottom, off the subject. Make OSD text from the dot-matrix font only — 1-dot gaps fill in, so check 0/8, W, M after the tape.
  • Flat vector: win with a few big shapes and empty space, not with detail: three or four land layers, one moon, a generous sky, and one small story told with one or two warm accents. Seven colours; every other shade is a tone of one of them. One light for the whole board, with the shade faces always on the far side. With no outlines, choose each object's colour against what sits behind it (an orange tent goes on the sand, not in front of the orange hills). Lift layers a few pixels for a soft seam of shadow, and keep texture around 1% so flat fields still read as flat. Put translucent shapes over a single background colour only. People, if any, are tiny silhouettes.
  • Storybook animation: the story is the acting, so choreograph first — anticipation before every big move (squash and lean away), stretch along the velocity, squash on every landing with impact lines and dust, a spring settle afterwards — and let the world be drawn by the character (follow= with a lead of 150–350 px, pre= for what is left of the start). Give soft in pixels, not as a fraction of a 2000-px layer, or the paint front turns into fog. Keep the camera still: only what moves is re-encoded, so 151 frames stay near 0.6 MB. On the poster, pick poses that sit apart along the path, draw the end state itself instead of a ghost on top of it, and hide the props' final positions.
  • Ballpoint doodle: draw what sits in front first (the pieces), then let every later line stop at it with clip — the snakes, the ladders, the grid and the pencil all go round the pieces, the way a pen lifts at something already drawn. Keep big pencil areas light (pressure ~0.4) and small ones saturated (0.7–0.9), and let the hatching run a few px past the lines. Use red only for "this move" (hops, ring, arrow, the conclusion) and blue/black for everything else. Put every label inside an empty square or the margin — text split by a grid line or crowded by a sweat drop reads as a mistake. Keep the fold and the blind indentations faint; they should be found, not seen.
  • Overlay sheets: think in light, not paint — every sheet only takes light away, so tints are coverage and overlaps come out of the multiply on their own. Draw every separation in the same laid-down canvas coordinates and print the same registration crosses on each, so they register by construction. Keep tracing paper clear (transmittance ~0.98, formation ~2 %), or three sheets turn the town grey. Reversed-out numbers show whatever is underneath, so keep stop markers off dark landmarks, and give a tram and a walking route their own side of the same road. Put tape and curled corners where there is nothing printed. Lift a sheet only a little (σ ~3 px of blur, a 20–35 px offset): it should read as hovering, not as a second picture.
  • Pastel UI: one screen, one idea — a headline, one main window, one side panel and a status, with few words set large. Keep the field flat and the cards solid white; colour lives in the accents (the step strip, chips, badges, markers), and green is reserved for a pass, so use a blue field when there are checks and crosses. Put companions on a lower layer than the card they peek over, so the card itself hides the rest of them. Give a magnifier room: centre it on one thing with its labels outside the rim (a lens over a narrow column cuts its label and temperature in half). Draw each state of a thing as its own layer and switch them; for the draw-on GIF, give anything that moves a few in-between poses instead of a cross-fade.
  • Exam grading: tell one grading story on one sheet — a few answers, one mistake, and every red mark pointing at it: a wave under it, a ring round it, a leader out to the grading column, and the note and the cross on the same row as the error (put that row first in the column so the leader stays short). Keep the words few and large and let the form itself (bubbles, timing marks, hatching) carry the texture. Give a ring room: it needs ~8 px of clear paper on each side, so leave the candidate a wider gap before the wrong figure. Stamps should be uneven but still legible (pressure ~0.64 at the light end). Red ink is Beer–Lambert density and only darkens a little above ~0.8, so light and dark passages come from the density range (about 0.4–1.2), not from the colour. In the GIF, give the pen and the stamps real in-between frames (~ motion stages) instead of cross-fades.
  • Shadow puppetry: keep the screen dark at the rim and pale gold only round the lamp, so dyed leather glows instead of looking printed. Leave big fields of solid dye and put the hollow patterns in bands; a pattern cell under ~12 px on the canvas turns a robe into fishnet. In profile the shoulder sits right under the head, so a near arm raised past ~140° crosses the face: raise the far arm up and back and keep the near one forward (130–147°). The classic 亮相 is one arm high behind, one low in front and a knee up. Give each figure room for its plumes, and keep the shoulder guard on the near arm only. A puppet slightly off the cloth (d ≈ 0.05) should read as a sharp shadow with a soft double edge, not as out of focus. In the GIF, everything that moves gets real in-between frames (~ motion stages): the lamp glow spreading, players sliding in from the wings blurred and doubled until they are pressed sharp, the kick, the 亮相 snap.
  • Pen & wash: ink first, paint second, and let the paint miss: slip each wash a few px off its line so one side spills and the other leaves white paper — but shrink the slip for tiny shapes, or a nose or a crumb becomes a white ring. Keep tooth and granulation quiet; at full strength the card looks like stucco and the washes like coloured pencil. Give parts a depth so outlines break where something is in front, and keep the features inside the head (only the nose may bulge past it). Watch for accidental reads: a small circle under a moustache becomes a letter, a red dome with white spots a toadstool, a white oval belly a snowman, and a scooter stem must not cross a face. Paint the background block around the figure with a halo, never out to the card edge. Draw the tools at real scale (a fineliner is longer than the card is tall). In the GIF, give the bare table a small palette share of its own and cut the rest only from pixels that change, or the oak eats the colours of the pale blocks.
  • Retro gouache: paint dark to light and let every coat cover the one before. The dry brush is what makes it gouache: lay the background solid with loaded strokes, then scumble it with a brush that is already half dry (load ≈ 0.7) in a lighter and a darker mix; strokes that start fully loaded read as sausages. Model forms in three or four soft value steps on a dome, with the light partly frontal, or hats and faces turn into flat discs with a bright rim. Give skin a warm shadow ramp, because the default cool ramp goes violet on skin. Model big noses with small, semi-opaque strokes, or they look like camouflage. Every texture works on the paint already under its mask, so subtract whatever lies in front before you call knit, rib or dry_highlight. Watch for accidental reads:
    • oilskin beads in a row become rivets;
    • a scarf with round ends becomes a neck pillow;
    • steam that touches the nose becomes a runny nose;
    • concentric curls become cinnamon rolls (make each curl a ring round a dark hollow);
    • two rounded collar flaps become cushions. Finish with dry-brush highlights on the lit side; on domes, drag them down the slope. For the GIF, force a few true dark neutrals into the palette, or the pupils turn navy.
  • Blue picture book: keep the palette honest — three blues, black ink, paper white and only a touch of coral, pink and mustard; a fourth hue makes it a different book. Coverage comes from pressure alone (about 0.95 leaves only fine specks of paper); let mottle and stroke lanes change the density of the pigment, not the coverage, or the blue field turns into scratched chalk. Reserve the white things (the bear, faces, the umbrella, the hair) when you lay the background block and colour those accents on white paper: wax over blue goes muddy, so a small accent on a dark ground needs opaque gouache. Draw the ink after the colour blocks and let colour laid later slide off it (over_ink), so the line stays on top. Dark masses should be clumps, not a band: threshold "darker toward the bottom + low-frequency noise", and keep blades and scribbles off the characters with clip. Watch for accidental reads:
    • an arm raised across the face hides the face (route both arms on the far side of the head);
    • a snail on a dark bench is a mustard disc (put it in front of something pale);
    • flat, round, mid-blue trees are balloons;
    • rain of one length and one colour is digital rain (use three values and a wide range of lengths). Leave the print step (gutter, page numbers, lifted blacks) for last, and lift only the blacks, or the white paper goes grey.
  • Jiangnan garden: paint strictly back to front and give every plane its own far: the back trees must be bluer, paler and flatter than the buildings, or the picture turns into a sticker sheet. Build foliage from dabs, never from a filled blob with noise on it: a leafy dark underpaint, a body, leaves across the rim, and lit leaves only in small clusters where the clump faces the sun; more, smaller clumps give a broken, living silhouette. A willow is tresses of thin strands with gaps between them — leaves on random sides of the stem, not a herringbone — and its boughs belong under the crown, or they read as umbrella ribs. Blossom needs a dark underpaint made of dabs too (a smooth one shows through as mauve blotches). From an eye 3 m above the water a near balustrade hides the whole deck of a low bridge: keep only the far railing so the slabs and the zigzag read, and check that the faces turned toward the camera are the ones that survive culling. Keep the water's streaks faint (about 1%) or it rains; reflections must mirror what stands above them, softer and darker. Watch for accidental reads:
    • lily pads with a full red rim and a hard inner line are cartoon plates;
    • a lantern-frame window with a large empty centre over paper is a blank sign;
    • a flying egret with one narrow upright wing is a feather;
    • a pale empty band on a far bank is a wall of fog — plant it down to the water. Finish with dappled leaf shade on the sunlit walls and a soft glow, and keep the seal tiny.
  • Dry-brush blocks: build the picture from a few big blocks and keep to the poster's six or seven colours; no outlines and no gradients — forms read from the edges and overlaps of the blocks. Make the texture with the stroke, not on top of it: work in the block's own brush frame so streaks and dry ends follow the stroke, let coverage come only from contact pressure against the paper's tooth, and keep the sides nearly straight while the ends comb out. The noise behind that tooth must be stationary and periodic (blurred white noise, wrapped): an upsampled coarse grid thresholds into rungs that read as crayon hatching, and zero-padded tiles leave empty columns. A big backdrop wants a roller (flat, clustered speckle, dry only along the sides), not bristle streaks, or it rains; a solid object over a dark ground (a porcelain bowl) needs an overloaded brush (load > 1), or the dark shows through its specks. Break long passes into strokes of different lengths and tones, or a jacket turns into stripes. Watch for accidental reads:
    • wisps of low-load strokes are wire, a scumbled band is grey fog — leave the steam out;
    • lenses tinted much darker than about a fifth (0.45 did it) turn glasses into sunglasses;
    • a nose whose shadow side matches the cheek disappears, and its warm tip becomes a mouth;
    • a dry fringe on a small object reads as motion lines. Put one small vermilion square in the empty paper, and print last.
  • Twilight storybook: set the night field first and paint everything that is lit through it, so the dusk side and the night side share one light — a white daisy goes moonlit blue, not grey — and keep emissive things (stars, fireflies, the lantern) and the plate unlit. The transition must pass through mauve, violet and indigo: re-saturate it, but gently, or it becomes a neon wall; let it arc in like a dome rather than run as a straight diagonal, and keep the dusk pale enough that the clouds still read against it. Keep the four-point sparkles few and small, deep in the night. Let perspective set the meadow: specks at the crest, whole flowers at the bottom, far flowers sunk into the hazy ground, or the crest turns into a bright band. Put a coloured prop (the kite) where the night grade will not grey it. Watch for accidental reads:
    • thin unbroken lines in the sky are wires, not clouds — clouds are soft lenses with flatter bottoms;
    • a hard tan stripe along a figure's sunset side is a band, not a rim light;
    • patchwork stripes in saturated, contrasting colours read as flags;
    • a marker ring in a mid tone vanishes on a coral kite — draw markers and leaders in dark ink. In the inset, keep labels inside the disc and numbers off the lines, and call finish() before the first stroke so the stage snapshots match the final.
  • Hatched nocturne: no smooth gradient anywhere — every area is several passes of short strokes along one field, a dark dense underlayer, a mid layer and a few sparse light streaks, with the dark ground showing in hairline gaps. Keep it night: deep indigo and navy with exactly one warm light, and lay that light on top as strokes that thin out into the dark, never as a blob; keep the smooth core tiny. Paint lit surfaces as light × receptivity (adding orange to a blue-grey cloud makes it pink), and let the strokes nearest the source go warm white. Inside a billow let the strokes run with the rising column and curl only at its rim, or every puff becomes a whirlpool. Watch for accidental reads:
    • glowing threads drawn as straight segments with sharp forks are lightning — let them meander with momentum and branch at low angles; too much wander and they loop like spaghetti;
    • pale sky dashes that are short, bright and evenly spread are falling snow — cluster them in bands and keep them only a little lighter;
    • isolated one-pixel gaps are dirt — drag the tooth along each stroke so the gaps become streaks;
    • a rim light on a far rock reads as more lava — keep it faint;
    • a reflection that samples beyond the picture pulls the cream margin into the sea. Keep the people a few dozen pixels tall with one small accent, and the captions small, grey and in a thin plain face.

Roadmap

  • Per-stroke layer export, for stroke-by-stroke animation in Motion Canvas or Remotion.

中文

这是什么

一个 Claude Code skill,加上一个小巧的绘图库,内置七十种画风:

画风 模块 为什么看起来像真的
水墨 lib/inkpaint.py · Painting 宣纸纹理;会遮挡身后的墨染山体,带水痕边和雾;分笔毛的毛笔与飞白;皴擦、苔点;松、孤舟、芦苇;题字与印章
水彩 lib/watercolor.py · Watercolor 冷压水彩纸纹理;透明罩染,叠色像真颜料一样变深、混色;水痕边;颜料颗粒;水渍花;湿画晕开;倒影;提白
剪纸拼贴 lib/papercut.py · Collage 撕纸露出的白色纤维边;纸片层叠的阴影;牛皮纸、蜡笔、报纸、笔记本横线纸;蜡笔线条;可爱圆脸
韩国彩铅 lib/colorpencil.py · ColorPencil 细密的短排线;蜡挂在纸纹凸起上,用力越大越能压进凹处;柔和叠色;浅褐色铅笔勾线;白色高光笔
日本动漫 lib/anime.py · Anime 天空渐变;每个鼓包都带月牙形硬边暗面的积雨云;泛光、光束、镜头光斑;平涂田野、透视公路、电线;线稿角色
编辑风手绘 lib/editorial.py · Editorial 4–5 种专色,每层带颗粒、浓淡不匀和套色错位;叠印出新颜色;半调网点;歪扭的手绘墨线;几何人物
油画厚涂 lib/oilpaint.py · OilPainting 几万道笔触顺着流向图排列;每个像素都知道自己在笔触里的位置,算出平顶鼓边的颜料、笔毛沟、落笔处更厚的颜料,再打光出凸起
浮世绘木版画 lib/ukiyoe.py · Ukiyoe 每种颜色一块版,印在和纸上,带木纹和套印偏移;天空和海面用晕色(bokashi);墨色主版勾线;青海波纹;横向云带;标题签和朱印
像素风 lib/pixelart.py · PixelArt 在 320×180 的小画布上逐像素作画;有限调色板;渐变、光晕、倒影都用 Bayer 抖动;3×5 像素字体;无插值放大 6 倍
黏土定格 lib/clay.py · Clay 用高度图一块块捏:压平的泥片、小球、搓条、鼓起的黏土字、手指抹开的泥面、刻线和戳洞,表面带小疙瘩和指纹;再像拍定格动画一样打光:暖色主光+冷色补光、蜡质光泽、沿光线步进算出的投影、缝隙里的环境光遮蔽
蓝晒 lib/cyanotype.py · Cyanotype 药水一笔笔刷上去,笔尾是干刷的断续刷丝;放上去的东西挡紫外线(透过率相乘):薄叶透一点光、叶脉更白,蒲公英绒毛离纸有距离、边缘柔和,边缘下还有散射;按普鲁士蓝的显影曲线上色;白色手写字一起晒出来,纸边再加铅笔字
十字绣 lib/stitch.py · Stitch Aida 布,每个布块四角有孔;每格一个 X,线按扭绞的圆线打光并投下小影子,还有几种手工误差;半针;回针沿孔走、一针从孔到孔;鼓起有光泽的缎面绣;法式结;字符图样和 5×7 刺绣字母;缝上去的织标
复古仪器面板 lib/panel.py · Panel 柚木贴皮、拉丝铝、注塑塑料、带金丝的喇叭布、冲孔网;同一盏主光照出倒角、凹槽和投影;车削旋钮、琴键、拨杆开关、宝石指示灯、绿色魔眼管、指针表;丝印刻度、玻璃后面的背光刻度窗
贴纸拼贴 · 小票 lib/sticker.py · Sticker 奶油卡纸底板,带纸纹、斑驳和纤维;平面矢量图模切成乙烯贴纸:圆角白边、切口厚度、覆膜光泽和斜向反光、贴地阴影加投影,翻起一角露出浅色背面;热敏小票:锯齿撕边、灰色断针热敏字、点线引导、删除线、折痕和卷翘;半透明和纸胶带;麻绳吊牌;油墨不匀的圆形橡皮章;红色圆珠笔勾选
实验笔记本 · 贴纸 lib/notebook.py · Notebook 石墨蓝灰桌面上的线圈方格本:硬封底、错开的页边、分隔标签、折角,线圈按金属管打光;石墨只挂在纸纹凸起上,有压力、收笔和手抖;靠尺直线、排线、铅笔折线图、勾选框;荧光笔正片叠底,起笔积墨、纤维条纹、尾部干涩;红笔圈故意不闭合;翘角便利贴、模切贴纸、标签机压印胶带、咖啡杯印;六棱铅笔
黑板板书 lib/chalk.py · Chalkboard 云状不匀的墨绿石板漆;粉笔只挂在板面「齿」的凸起上,有压力、颗粒和断口;粉笔横躺的侧锋铺色;板擦真的能擦掉粉笔,顺着擦的方向拖出残迹,留下上节课的残影;越往下越厚的粉笔灰;每个字微转、错位、轻重不一;手写 ∝、波浪线、箭头和不闭合的圈;斜接木框,粉笔槽里放着粉笔和板擦
赛博朋克 lib/cyberpunk.py · Cyberpunk 一台针孔相机看向雨夜街道深处,HDR 缓冲加深度遮挡:玻璃管霓虹中心过曝、边缘彩色光晕,还有坏管和闪烁管;背光灯箱;半透明全息广告,带扫描线、撕裂切片和色边;每样东西按自己的着地行翻出湿路面和水洼里的倒影;被城市灯光照亮的深度雾;被招牌照亮的井盖蒸汽;三层雨,只在霓虹附近看得见;飞车光轨;泛光、胶片红晕、颗粒和一道故障扫描线
卡通手绘 lib/cartoon.py · Cartoon 照动画师画一张原画的办法画:蓝铅笔稿留在底下;毛笔线落笔细、中段粗、收笔尖,闭合轮廓一笔画完、首尾交叠,背光一侧更粗;平涂颜色略微错开线(这边露一条纸白,那边压过线);一到两层硬边赛璐璐阴影和白色高光;只挂在纸纹凸起上的蜡笔、网点纸、墨线排线;表情、橡皮管手臂和带拇指的白手套、闪光星、速度线、爆炸框;带挤出阴影的粗描边大字;墨线每一帧都轻微抖动;能按 起稿 → 勾线 → 上色 → 阴影 → 特效 → 字 的顺序回放
等轴 2.5D lib/isometric.py · Isometric 正等轴正交相机加一个小光线追踪器:每个部件都是精确的解析实体(倒角盒子、屋顶、礁石、船体用凸多面体;任意轴向的圆柱圆锥;可被平面切开的椭球),写进 G-buffer,遮挡与绘制顺序无关;一个柔和的太阳照出三个面三种明度,PCSS 软阴影随遮挡距离变宽;AO 来自记得屋檐和树冠是悬空的顶视高度图;粉彩反照率配淡紫天光、倒角高光、岸边浪花、透亮的水体侧壁,漂浮底座的影子落在背景上;数据卡的文字印在等轴平面上
单线画 lib/lineart.py · LineArt 整幅画是一条路径:各个形状按作画顺序串起来,断开处用切线连续的曲线接上,翻圈沿路径插入,够不到的窗户用看不见的原路折返;一次栅格化成「时间图」,每个动画阶段都是整条线精确的前一段;带手感的线宽(起笔轻、收笔尖、压力缓慢起伏、急转处变粗、原路折返处提笔收尖、航迹这类运动轨迹用轻手);深蓝底上是随角度变亮、只带一点柔光的金线(奶油底上是墨线);画的时候笔尖发光;唯一一处发光的点睛色;字距拉开的 Didot 标题
柔光 3D lib/soft3d.py · Soft3D 真的是一台小光线追踪器:几万颗球靠逐格查找(DDA)加精确的光线–球求交;鼓鼓的字是有向距离场(字形精确距离变换→挤出、倒圆、吹胀);摄影棚天光穹顶,环境光遮蔽在场景自己的距离场里采样;大柔光箱主光投下边缘渐软的阴影,加轮廓光;光面上映出灯片,边缘有菲涅尔亮边;阴影和缝隙变深变饱和而不发灰;被挤开的球真的落进窝里堆起来;远处空气雾、分层景深、1.5 倍超采样
形变动画 lib/morph.py · Morph 每样东西都是一条闭合轮廓:按弧长等距重采样成 256 个点、统一绕向、用 FFT 互相关对齐起点,再逐点插值;质心沿缓动的运动路径走,快的时候沿运动方向挤压拉伸;云、雪花这类组合形状用圆、线、多边形拼好后描出外轮廓;颜色在 OKLab 里切换;海报把动画定格成一条胶片:每个关键帧一块纯色面板,洋葱皮残影跨面板时跟着换色,中间帧标出对应点,加虚线轨迹和缓动曲线时间轴
报刊拼贴 lib/newscollage.py · NewsCollage 所有东西都是「先印、再撕或剪、最后粘」的纸:带纤维的牛皮纸底;手撕的伪词报纸,撕口一段段露出毛糙的白色纸芯;「老照片」是真的布光渲染(高度图、主光、镀铬反射、投影),印成 45° 网点(毛边网点、网点扩大),再用剪刀一段段直线剪下;每个字来自不同杂志的勒索信拼贴字;透出底下纸边的美纹纸胶带;压力不匀的橡皮章
弥散玻璃 lib/aurora.py · Aurora 网格渐变:几团色光在 OKLab 里混色,坐标扭曲成流动的形状,加极光光带和细颗粒;虹彩光泽小球;磨砂玻璃模糊的是它下面真实的像素(背景、小球、后面的卡片和字),提高饱和度,蒙一层近光源更厚的白纱;边缘斜面向外折射并带一点色散,朝光的边有 1 px 高光,玻璃上有磨砂颗粒,投影颜色取自下面的背景;界面用距离场画,边缘干净:渐变开关、滑块、锥形渐变进度环、胶囊柱状图、折线图、玻璃小胶囊、躲在玻璃云后的光泽太阳;SF + 苹方字体
包豪斯几何 lib/bauhaus.py · Bauhaus 在奶油色未涂布纸(云状纸浆、纤维、纸屑、纸齿、微微不平)上按色版先浅后深逐版刮印;每块网版有自己的套准误差,色块和黑线相接处露出一丝纸白或压出一道深边,套准十字叠成几色错开的样子;墨膜顺刮板方向有条纹、行程末端变薄,薄处露出纸齿坑点和针孔,版边有网目锯齿;墨半透明,叠印变深;圆、扇形、三角、粗黑条都落在严格的模数网格上;Futura 式几何无衬线大写和粗黑体,可从色块里挖空;裁切线、色标条和铅笔版号
复古 Synthwave lib/synthwave.py · Synthwave 针孔相机看 80 年代复古未来的黄昏:横条切口越往下越厚的渐变落日;逐像素解析的霓虹网格,线宽准确,远处换成平均值不出摩尔纹;从品红渐变到青色的线框山脉;倒影按横带拉伸、碎成一条条光带的海面;带落日轮廓光的棕榈剪影;上映天空、下映地面、中间一道锐利地平线的镀铬大字,带挤出和星闪;霓虹手写字;最后「过一遍录像带」:色度渗色、跟踪噪带、磁头噪声、屏显字和扫描线
拼豆 lib/perler.py · Perler 整张桌面是高度图,豆子是真的短管,相机略向后仰、逐列找最近的表面:每颗豆露一条侧壁,孔里看得到内壁和被塑料透光染色的钉子,珠间缝里露出钉板;半透明钉板(方、圆、六边形)上的空钉;每颗豆色号深浅略有不同、在钉上略有歪斜;不透明、珠光、透明、夜光几种塑料;熨烫是真的熔化:管子塌低变宽、孔从边缘收小、相邻的豆通过平滑并集流到一起,缝缩成小菱形直到合拢,顶面变成一片带纸纹的蜡质平面;半透明熨烫纸顺着豆子盖下去,可以卷边揭开;镜面里看得到灯箱(亮面豆沿上一道锐利高光弧,熔化后变成一片蜡光);分色收纳盒里的豆堆、散落的豆、悬空带投影的镊子、带铅笔勾的图纸
岩画 lib/petroglyph.py · Petroglyph 图是从石头上敲出来的,不是画上去的:砂岩高度图(大起伏、淡层理、砂粒、溶蚀浅坑、一道岩檐台阶)上长着沙漠漆,近乎均匀的深色漆膜加一条条清晰的蓝黑流痕;每个图形先起稿成遮罩,再用成百上千个不规则凹坑敲出来,凹坑打穿漆层、把砂粒碾白,所以轮廓在一锤的尺度上毛糙、内部是浅浅的颗粒状凹面;计日刻痕则是磨出来的 V 形槽;年代让旧图慢慢被漆盖回成鬼影,叠刻的层次自然出现;裂缝往下渗出漆痕;剥落是带小贝壳弧唇口的台阶疤,露出鲜橙色石面并带走部分旧图;壳状地衣;一盏低角度侧光,每个凹坑都有自己的投影
古埃及墓室壁画 lib/tomb.py · TombPainting 按古代画工的工序一层层做墙,每层都留着:草筋泥上一层石膏灰泥,红赭石弹线的比例格(一格一个比例单位),带「找形」的红稿,绕开人物刷的底色,一罐颜料一遍的干壁画平涂(男子红赭、女子黄赭、半透明的褶裥亚麻、带亮晶的埃及蓝、绿釉料),按 z 叠放所以先上哪种颜色都不会叠错,最后是均匀的黑线和红褐线;人物照「正面律」画在可摆姿势的比例骨架上(侧脸正眼带眼线、正面肩膀和项圈、弯腰时肩膀转向侧面、两只脚都露大脚趾一侧、IK 求肘),按身份放大;四条腿都看得见的牛、被割麦人攥在拳里的二粒小麦、按方块排的彩色伪象形文字、凯凯尔饰带和色块边框;然后按地层做旧:成簇剥落到底色,或者剥到灰泥、露出红格和红稿,灰泥脱落到草筋泥(真的高度图:断续的白边和投影),裂缝、埃及蓝发灰绿、烟熏、潮痕、盐霜和蝇斑
罗马马赛克 lib/mosaic.py · Mosaic 一张看不见的底稿,每块石子取脚下的平均色,从有限的石料盒(石灰石、带纹大理石、smalti 玻璃、陶片)里挑最接近的一种,先比色相再比亮度;石子沿距离场的等值线(marching squares)一排排铺,绕着每条轮廓、一圈圈围住眼睛(opus vermiculatum),图形外留一两圈光环,背景平铺或沿波浪排(opus tessellatum),边框排在转角斜接;每排切成整数块手凿石子,弯处变成楔形、在图形脊线处停住;后铺的石子贴着先铺的切掉一角并留灰缝;燕尾铭牌里的罗马大写字一笔一排石子;高度场打光:打磨过、微拱的石面和磨圆的边,下凹带砂的灰缝,每块石子略有倾斜,同色石子在斜光下明暗不一,灰缝里有投影;湿灰浆上的赭红起稿;脱落处露出旧灰浆床和石子留下的方坑,一道沉降裂缝,成片积灰
彩色玻璃花窗 lib/stainedglass.py · StainedGlass 照玻璃匠的工序:画稿切块(Voronoi 拼块、边框按点切、切不出来的碎块自动并掉);通体着色的玻璃,每块深浅厚薄不同(透光率 ** 厚度),每块一个方向的条纹和顺纹拉长的气泡;grisaille 描线、带点彩颗粒的 matt 和木签刮白、银染;每条交界都上铅,按 H 形铅条打光,焊点更亮更鼓,窗边一圈宽铅;横铁条用铜丝扎在铅上,裂片用细铅条补;方石墙、斜面窗侧和楔石缝;日光从背后透进来:石头上的彩色溢光、发亮的窗侧、斜窗台上倒过来的柔和投影、亮玻璃吃掉一点铅条的光晕、积灰和腐蚀麻点
泥金手抄本 lib/illuminated.py · Illuminated 字是一支模拟的宽头鹅毛笔写的:笔画是斜握的笔尖扫过的面积,菱形头脚和发丝连笔都出自笔,不是字体;有长 s、提罗速记的 et,每个字母略有抖动。铁胆墨随笔里的墨变干而由黑转褐,笔画边缘积墨。朱红标题、首字母点红、红蓝段落符、行尾填充、断词连字号。打磨金箔是凸起石膏底上的镜子:每个像素按石膏底的法线映出房间里的大窗,所以有明暗带、鼓边的反光和闪烁的打孔纹;壳金则是哑光颗粒。带颗粒的石青,玫瑰色配铅白描线。条形边框上递归长出常春藤花枝。尺规画的图解,星盘盘面是真实的球极投影。羊皮纸有毛孔、筋脉、起伏、针孔、打格线、背面透字和天然破洞;还有狐斑、翻页手印,金箔剥落处露出红色底料
达·芬奇手稿 lib/codex.py · Codex 裱在卡纸上的帘纹碎布纸(帘纹、链线、纤维纸齿),不均匀地老化:发褐的毛边、缺一角、泛黄云斑、清楚的霉斑、潮线更深的水渍、背面的字透过来;铁胆墨水和鹅毛笔:笔宽随宽笔尖方向变化,墨一笔笔用干、再蘸又变浓(偶尔落笔积一个墨珠),薄处琥珀褐、厚处深赭,交叉处更深;左手「\」排线一排排下笔,越暗插得越密,只有最暗处才交叉;红粉笔只挂在纸齿上,再用手指揉开;尖笔和圆规的无色刻痕靠侧光显形,圆心有针孔,底下有铅笔起稿;轮廓先找两遍再定线;右到左的意大利语伪文镜像手写;齿轮、灯笼齿轮、冠齿轮、曲柄、滑轮由带 z-buffer 的笔绘渲染器画出:被挡住的线不画,面按背光程度排线,只描轮廓和折边;墨点和被划掉的废稿
剪影 lib/silhouette.py · Silhouette 黑纸是真「剪」出来的:贴平的主轮廓重采样成一小段一小段剪口;单独剪下的细丝(羽枝、睫毛、胡须、垂卷、缆绳)微微翘起、影子更长;剪空处露出底卡(眼睛、蕾丝孔);全部 4× 超采样,1 像素的细丝也留得住;薄金粉只留在黑纸上;椭圆金框按真实线脚剖面(内口圆珠、凹槽、珠饰、绳纹大圆脚)建高度图,金面映出一扇窗照亮的房间,有金箔方块接缝、棱顶磨出的红色底漆、凹处积灰;玻璃背面的黑底金线圈(verre églomisé)、框口投在卡纸上的影子、凸面玻璃反光;铁胆墨圆体手写题签;木版印花的摄政时期条纹墙纸(错版、定位针点、对花略错、拼纸接缝),挂镜线铜钩垂下绞丝绳
凸版印刷海报 lib/letterpress.py · Letterpress 每种油墨一块版,一次压一色,每次纸张落点都差几像素:红色套色块从黑轮廓下面一边探出来、另一边露出一线白纸;木活字一行排满版心,每个字是一块木头:木纹条痕、一端偏浅、凹坑、缺角、偶有顺纹裂缝,带投影的字把投影印在另一块版上;油墨边缘参差、边上挤出一圈深墨、大实地缺墨发花露出纸齿、灰尘留下圆形漏印;几段拼成的铜线,接头有细缝;木刻按「留下木头」的方式画:背光一侧加粗的轮廓线,线宽随明暗胀缩、亮处收尖的排线,另刻的松动红色色块;印完以后三折(折痕处油墨裂开)、贴日期条、钉上墙、边缘泛黄、长霉斑
苏联构成主义 lib/constructivism.py · Constructivism 一张纸两块版:红的都在红版、黑的(色块、字、每个网点)都在黑版,每块版整体带自己的套印误差,红黑相接处一边露纸、一边叠出深色;墨是透明的、相乘叠印(黑压红是暖黑),墨层有浓淡、有漏墨小白点、边缘随纸纤维毛糙、色块边缘略积墨;「照片」是真渲染出来的(小型 z-buffer 光栅器:双曲面网格、旋转体、变径管、程序木纹和刻度盘),在海报坐标里统一加 45° 网点,再用剪刀沿轮廓留边剪下,剪刀进不去的窄缝和洞不剪;粗体压缩西里尔字带一点手绘抖动;便宜的奶油色纸边缘发黄,对折两次、折痕处墨层裂开,有霉斑、水渍潮线和图钉锈孔
装饰艺术 lib/artdeco.py · ArtDeco 从不描边:每个形状都是刀刻的遮片,用喷枪喷色,所以边缘锐利、里面是一段平滑渐变,只有薄涂处才有雾滴颗粒;交替射线随距离变淡,月亮偏心喷涂出球感;阶梯退台高楼每层从暗侧喷到亮侧,带竖向凹槽、受光的退台边、窗格和竖条灯带,越远越淡入雾里;河面把画面镜像成一道道横向波纹,亮的东西反射更强;流线型列车和拱桥是真的小 3D 场景(距离场、球面步进、边缘像素超采样),但按插画家画圆柱的方式上色:每种材质一条海报色阶、上肩一道喷枪高光、月光轮廓光、下腹反光,速度线在倾斜车鼻上收拢,头灯照亮前方铁轨;Deco 展示字母由笔画和椭圆字碗拼成,金色渐变中间一道硬分界
黄金时代漫画 lib/comic.py · ComicCover 按当年的分工做、按当年的印法印:黑版上的毛笔墨线起笔细、中段鼓、收笔尖,背光一侧加粗,实黑块,从阴影边长出来、长短成波浪起伏的羽状排线;色稿里每块颜色都是三原色 Ben-Day 网点比例(0/20/40/70/100%)的组合,天空是沿手裁波浪边分档的色带;每版按自己的角度加网(网点逐渐变大、50% 相接、再变成白孔,两版叠加出玫瑰斑),各自错开几像素,手绘分色还会游离墨线;新闻纸已经泛黄,并且吸墨(网点毛边、亮部小点丢失、实地发花、露出纸坑);朝灭点挤出的透视立体刊名、价格框、旁白框、对白 / 喊叫 / 想法框、手写字、拟声字;印完后书脊白色裂纹、生锈订书钉、磨角、折痕、霉斑;阶段动图先出黑版线稿,再依次叠印黄、红、蓝
波普丝网 lib/popart.py · PopSilkscreen 按「工厂」的做法,在一张刷了白底漆的棉帆布上一步步重做(平纹布纹高度场和粗节);胶带隔出格子,颜料渗进胶带下。每格先手涂撞色丙烯:先是底色,再是照着照片描得很松的形状,偏大或偏小、和照片对不准,带顺笔的轻微明暗、边缘干笔拖痕和一道受光的漆脊。然后把同一块照相黑版刮印上去:阴影块带照相阈值的颗粒边,中间调变成 45° 粗网点,膜上有灰尘点。每次放版都有自己的偏移、极小的转角和自己的墨量:顺刮板方向的条纹、刮板缺口留下的细白线、墨干在网上的一块露底,或者墨多糊版、形状变胖、细缝填死,偶尔还印了两次,留下一层灰影
ASCII 字符画(行式打印机) lib/lineprinter.py · LinePrinter 画面不直接画在纸上,而是画进一张隐藏的角色图(每个字符格 6×10 个采样),再逐格选字:线条和剪影转折按真实像素里的方向和在格里的位置选字(陡的 | / \,平的 ' - . _,曲线自然成 _.-',交叉处 X,圆的侧边 ( ),每行只留一格),填色按各自角色的字符阶梯、在角色内做误差扩散(烟是 . : % @ #),最暗的格多走几遍叠打;然后鼓式打印机隔着布色带一行行击打:同一个字总是偏高或偏低一点,弱锤留下一道淡列,力度弱的字变细、在色带织纹和纸纹上断开起麻点而不是变灰,磨损的字模每次缺同一块,色带越往下越淡;桌上一整张绿条连续纸,上下两道撕线和折痕、底部留页边,导孔里看得到桌面,两侧微孔撕线;读的人用红圆珠笔打勾、圈出绘图里的点
低多边形(1999 年代 3D) lib/lowpoly.py · LowPoly 一个真的软件光栅化器,画进 384×216 的帧缓冲:针孔相机,顶点吸附到整像素,背面剔除,整个场景的三角形排成一张按深度排序的表(主机的 ordering table)从远到近画,贴花带排序偏置,近平面裁剪,可选 z-buffer;每个面一个颜色的平面着色(半球环境光 + 太阳 + 逐面闪光,金环一面一面地闪);几十像素的程序贴图最近邻取样、仿射插值,靠近镜头的大三角形上岩层会弯;逐顶点雾吞掉远裁剪面;alpha 硬裁切的十字插片树;当年的四种半透明模式画螺旋桨盘、圆斑影子、星光和镜头光晕;最后 15 位色加 4×4 有序抖动,最近邻放大 5 倍;点阵 HUD(带描边和投影的渐变斜体数字、阶梯速度条、小地图)
喷漆模板涂鸦 lib/stencil.py · Stencil 木纹模板清水混凝土墙是反照率加高度图、低太阳打光(木板压出的色带和木纹、板缝的断续水泥浆棱、锥形对拉螺栓孔里的锈铁头或灰浆堵头、气泡孔、锈水和雨痕、返潮水线和泛碱、发丝裂缝);模板是真的刻开的卡纸:刻断的孤岛自动找出来、补最短的桥,字腔自带桥,桥在漆上是露墙的细缝;多层就是多张卡纸先浅后深、每张贴歪几像素;喷罐来回扫,高斯喷锥叠成漆膜,卡纸贴平处边缘锐利、翘起处往里渗、外面一圈雾化;漆是雾滴,薄处是散点不是模糊;盖不进小孔、贴着墙面起伏、带缎面光泽,下边缘太厚就流成带细颈和圆珠的滴痕;徒手细喷嘴线条随手速变粗变重;竖向滚道的市政灰漆,底下的旧签名还透出来;快照里模板还贴在墙上
刺绣徽章 lib/patch.py · Patch 像绣花机一样绣:每块形状按自己的针向切成平行的行、每行再切成针——大面积用短针错位的填充绣(tatami),细长形用一行一根长线的缎面绣(太长自动拆成分段缎面),所以形状的边缘就是一排针脚;每针都是一根有光泽的圆线,两头扎进布里,高光是各向异性的(Kajiya–Kay),同一种颜色换个针向亮度就不同;缎面按衬垫拱起,一根线上从亮到暗;圆章、弧形条章包锁边(斜着一圈圈绕的圆绳),异形章包热切缎面边,两者都做了子采样,在急弯处针距过密时把线的起伏淡成平滑的扇形;3/1 右斜纹牛仔布(经密纬疏、斜纹约 60°、环染竹节纱、高处磨白),折边缝压双道明线;最后一枚徽章正在手缝,针和线还躺在布上
蓝图工程图 lib/blueprint.py · Blueprint 先在描图布上画墨线:几种固定粗细的鸭嘴笔、字模板式的单笔画大写字(描图布上留着铅笔导线,尺寸数字后面的剖面线刮掉),再接触晒图:墨挡住弧光灯,线底下的铁盐冲洗后是白的,其余地方生成普鲁士蓝;显影按有阈值的 S 曲线,粗线纯白、发丝线发浅蓝、底色饱和;光从线边爬进去,玻璃压紧处锐、接触不良处软,外面一圈淡光晕;灯在中间强、四周弱,药面有涂布条纹、斑驳和晾干时的流痕,颜色按普鲁士蓝在纸上的比尔–朗伯吸收算,纸纤维透出来;处处守制图规范(按材料分的剖面线、尺寸线与尺寸界线、标高、剖切符号、详图索引圈、指北针、比例尺、带分区编号的图框、标题栏和修改栏);再过图纸的一生:折成六折,折痕把蓝色裂成白线,朝外那格褪色发灰,碱性水渍变成锈褐色、留下两道潮线,图钉孔生锈,工地工程师的红蜡笔修改云线
儿童蜡笔画 lib/crayon.py · Crayon 糙纸纸纹均衡过,压力直接对应覆盖率;蜡只挂在纸纹凸起上,拖着走时露白的小坑被拉成顺着笔道的短条;用秃的笔头是带棱的平面,一笔是一束强弱不一的细线,笔道里有白色细纹;后涂的蜡更容易挂在先涂的蜡上(蜡层堆积),半透明叠色(黄上涂蓝变绿,黑线涂不掉);小孩的手:先勾线,再按胳膊够得着的一块块来回涂,每块各自的角度,转折处出界,绕着要留白的东西小心停住;绕圈涂、顺着彩虹带子涂、形状首尾对不上;字是细化后的中心线用圆头蜡笔重描,每个字歪的方向、大小、颜色都不同;使劲压过的蜡白点合上、发亮;纸和蜡一起当高度图打光;纸上躺着带印花包装纸的真蜡笔(一根断了)和蜡屑
绿屏终端 CRT(荧光字符画) lib/crt.py · CRTTerminal 重做一台字符终端,而不是画一张图:120×36 格字符内存,每格有 dim / normal / bold、反白、下划线,行可以双倍高;5×7 点阵字库(小写带下伸部),加一套图形字符(框线、画曲线的五档扫描线横条、八分块)。字符画先画进隐藏的「材质 + 调子」图:里面的格子按阶梯选字并做误差扩散,剪影按边在格里的方向和高低选字;屏幕上「密 = 亮」,所以雷暴云稀而暗、只有受光的边亮。电子束每行扫 10 条扫描线:点拉伸半个点(在反白之前做,暗笔画不被吃掉),视频放大器拖尾,光斑随电流变粗。P1 荧光粉亮到发白,落雨留下上一帧的余辉,状态栏里烧着一行旧字。光栅桶形外鼓、边缘变暗,玻璃里有光晕、窗户倒影和机壳的阴影。米色塑料机壳的斜面映着绿光,还有合模线、电源灯和两个滚花拨轮
热成像 lib/thermal.py · Thermal 从头到尾不画颜色,画的是一张摄氏度的温度场:房间上暖下凉,每样东西有自己的温度和温度分布(锅底最烫,猫的眼睛比鼻子和耳朵热),抛光金属按发射率读出的是它反射的房间,圆形物体越到轮廓越凉;然后让热按真实的方式往外走:渗进灶后的墙,热气和蒸汽成羽流往上飘、越来越宽、越来越凉、碎成涡和丝,打开的冰箱往下淌冷气、在地上铺成冷舌,暖爪印越旧越淡越散,釉面地砖倒映烤箱;这张温度场再交给一台模拟的非制冷热像仪:镜头模糊、按 480×270 像元采样、时间噪声和竖条纹、中心偏凉、细节增强、手调色调曲线混平台直方图均衡、伪彩色板、双线性放大并留一点像素格;OSD(状态栏、点测温、区域框、最热 / 最冷标记、线剖面插图、非线性色标)上的每个数字都从同一张传感器图像上读出来
代尔夫特蓝瓷砖 lib/delft.py · DelftTile 照作坊工序做一面锡釉砖墙:白坯砖排在一张从来不完全横平竖直的网格上;刺孔纸样拍出炭粉点线;细笔勾线(落笔一颗墨珠、收笔变尖、往下的笔画更粗、手微微抖);晕染没法晕开(笔道、鬃毛丝、最后干的边缘积色、叠染变深、总和轮廓差一点,留白靠绕着画);只有一种透明颜料,所以从前往后画、靠留白而不是覆盖;生颜料是灰黑色,入窑后按每通道 Beer–Lambert 吸收变成钴蓝,洇进釉里、带细颗粒;每块砖单独画、单独烧,线条在砖缝处错开,每块砖的白和蓝都不一样;单块砖四角各画四分之一,四块拼起来才是一朵角饰;下凹的石灰浆砖缝;每块砖略鼓略斜,窗户倒影碎成弯曲的几片,圆倒角接住光;开片、铁斑、崩瓷露出浅褐坯体、裂纹到砖缝就停
洞穴壁画(赭石颜料) lib/cave.py · CavePainting 和岩画正相反:颜料是涂在浅色石灰岩上的,只有火光照着。洞壁是高度图(大起伏、岩脊、淡淡的溶蚀扇贝纹、积了泥的小坑、凸处的钙华皮、湿亮的钟乳石帘),颜料是一层层覆盖场乘进 albedo,再浓也透出石头的斑驳。怎么上的色决定了样子:炭条沿游移轮廓找形,干炭条只挂在岩面的「牙口」上,吹喷的颜料有软边、晕和雾点,靠轮廓和鼓包背光的一侧更浓,肚子留出浅色;手印是对着指尖和手侧吹几口气喷出来的。只用地上的篝火和油灯照明:点光源半 Lambert + 平方反比衰减 + 逐像素步进的投影,掠射光让画在鼓包上的动物自己鼓起来;火舌、火星、泛光、烟柱、熏黑的顶壁、钙华薄膜、零星掉色和洞熊爪痕
1-bit 早期画图软件 lib/macpaint.py · MacPaint 画的是一台 1984 年式黑白画图软件的整屏,不是「像素风插画」:640×360 帧缓冲只有黑白两值,×3 无平滑放大;所有色调都来自 38 种 8×8 图案,图案贴着文档原点平铺(同一图案的两块天然对缝,不随形状弯),渐变是几条图案带;工具照当年的规矩:方笔头 Bresenham 线和台阶状锯齿,形状是图案填充加画在轮廓内侧的当前线宽边框,4 连通油漆桶,往圆盘里随机撒点(OR)的喷枪,笔刷形状,选取拖动复制和左右翻转,XOR;手工点阵的粗体系统字(大写 9 px、竖笔 2 px),TrueType 关掉抗锯齿,粗体 / 斜体 / 下划线 / 空心 / 阴影都是对字形遮罩的位运算;界面每个快照重画:自编菜单名的菜单栏和屏幕黑圆角、当前工具反白的 20 件工具栏、线宽框、带当前填充框的图案板、带关闭框的条纹标题栏、50% 灰轨滚动条、每项按自身样式书写的下拉菜单、放大镜窗、行军蚁、带白边的光标
古希腊黑绘陶瓶 lib/blackfigure.py · BlackFigure 先在轮上拉出瓶子(轮廓 r(y) 加两只圆把手),所有彩绘都画在它的展开面上,所以同一幅画既包在曲面瓶上、又能平铺成展开图,两边永远对得上;按作坊的工序画:转着轮画的饰带(绝对水平,收笔处有一点搭接),泥釉剪影(这时还是暗褐色),刻刀划透泥釉露出橙色细节,最后上哑光的加红加白;人物的每个部件按远近排序,近处的黑马盖住远处那匹的刻线和加彩、再刻出自己的轮廓——四匹马叠在一起仍然分得清;烧成后泥釉变成泛蓝的亮黑,薄处发红;然后过两千五百年:加白剥落留下哑光残影,钙质结壳和根痕,缺口露出胎土,调色补土的修补和胶合裂缝,一片没烧透的发红釉;照片按博物馆的打光(黑釉里一长条柔光箱和一条侧光的反射,粘土是缎面微光,下半身映着浅色展台,一点透视让每条饰带弯成弧),每一圈饰带按自己的周长展开
铅笔素描 lib/graphite.py · Graphite 石墨是纸上的一层「量」而不是颜色:深浅是 Dmax·(1 − e^−m),越叠越深但到不了黑,暗部是冷灰,重压处被压亮、带一点银灰反光;铅只在碰到纸纹的地方留下:轻压擦过纸纹的峰、留下白点,软铅和重压才填进谷;2H–8B 的石墨量、压进纸纹的深度和线宽各不相同;每一笔起笔、加力、收笔;排线一块一块地排,块与块的接缝略有漂移,一层层加(先一个方向、再插密、再从两个角度交叉,只在需要那么暗的地方下笔);侧锋铺出带颗粒的底色,纸擦笔只在它擦的那块里匀开,可塑橡皮按出柔和的亮,硬橡皮擦出清楚的白线;通往灭点的透视线和绕几圈的车轮椭圆留在画面上,只有中间画完——越往纸边调子一笔笔地少下去,只剩线稿、页边笔记和一排试笔色阶
X 光片 lib/xray.py · XRay 不画物体的样子:每样东西都是「沿射线方向的材料」(倒圆边的实心体、空心壳、圆棒和管子、远半圈潜下去的弹簧、侧看 / 正看的圆片、拉链、螺钉、电线、叠好的衣服),按画布像素量,把 μ × 密度 × 路径长度加进高低两种能量的衰减图——所以重叠就是相加,轮廓发亮也有物理原因(射线顺着箱子侧壁、管壁、正对着的镜筒穿过);比尔定律透射后经过一台模拟的线阵探测器(1/4 分辨率的散射雾、焦点模糊、逐行增益条纹和模块缝、光子少的地方噪声大),再进两种显示:越密越亮、带边缘增强和荧光辉光的蓝色胶片,以及按双能比值算 Zeff 的安检伪彩(有机橙、无机绿、金属蓝、穿不透黑,传送带当空气校准扣掉);OSD 上的 Zeff 和体积都是在物体外一圈扣掉背景后从画面上量的
1930 年代黑白橡皮管动画 lib/rubberhose.py · RubberHose 照动画厂做一格画面的方式做,再印成拷贝、放旧:背景在板上用灰色水粉画一次(平涂带干笔刷纹、喷枪光斑和接触阴影、细灰轮廓);角色先铅笔起稿,再用粗而均匀的黑墨描到赛璐璐上,背面涂五档平灰,不画明暗;赛璐璐不透明、从后往前叠,角色要从后面经过的山、窗档、被子存成遮罩。剩下的靠这套词汇:等粗无关节的橡皮管四肢、三道缝线加外翻袖口的四指白手套、发亮的大圆鞋、切掉一角的饼切瞳孔、张大的笑嘴、活过来的家什。最后是镜头和岁月:四角更软的柔焦、高光晕、抬起的黑位和压住的白位、银灰偏暖的拷贝色调、中间调最重的团粒颗粒、密度不匀、片门晃动、圆角片门,时有时无的白 / 黑划痕、灰尘、纤维和片门里的一根头发
黑白麻胶版画 lib/linocut.py · Linocut 和真的一样是减法:滚上墨的整块版印出来是一片黑,画里每一处白都是刻刀挖掉的。每块版是一张浮雕图,每一刀是两头收尖、边缘带碎口的多边形——V 口刀尖着下去、越刻越宽、提刀收尖,U 口刀圆头咬进去、尾巴崩断——所以明暗只能靠刀痕的疏密和粗细(黑里刻白线,或白里留黑线)。清掉的大片白里留着几道残刀印,吃一点墨;黑东西压在黑底上,就在外面刻一圈白边。印刷是算出来的:墨辊滚出的墨层和停辊横纹、木蘑菇一圈圈的压力、纸纹的高低决定哪里吃墨,大片实地发花、边缘始终是实的;一块套色版垫在黑版下面印,错开几像素;纸被压进版里,页边有铅笔版次、题名、签名和一枚钢印
VHS 家庭录像 lib/vhs.py · VHSCamcorder 不是在画面上盖一层复古滤镜,而是照一帧家庭录像真实经过的三步来做,每一步留下自己的痕迹:房间画成表面颜色,再由屋里的灯照亮(暗暗的暖色环境光,落地灯在墙上照出上下两片扇形光,烛焰从前面照亮蛋糕和孩子的头发),会发光的东西单独一层,镜头跟前的孩子画在离焦图层里;然后交给一台家用 CCD 摄像机:手持微倾,白平衡停在「室外」拍钨丝灯(屋里发橙、窗外发蓝),高光软膝、泛光,只有烛焰拉出竖向拖影,高光身后一小段拖尾,暗处增益噪声——摄像机的字符发生器把粗点阵 OSD 混进信号,REC、计数器和日期跟画面一起上带;最后是录像带:480 行,亮度低通再加回放锐化光晕,色度宽约 6 倍、隔行平均、往右延迟(红色渗出轮廓),条状亮度噪声和横向色度噪声、逐行时基抖动、顶部偏摆、跟踪噪带、磁头切换撕裂、掉磁白点、抬高的黑电平
扁平矢量 lib/flatvector.py · FlatVector 矢量软件的画板:边缘干净、抗锯齿的几何形(解析圆、圆角多边形、锥形胶囊、样条地块),可以并、交、减,全画没有一根描边;七种平涂色,其余颜色都是它们的深浅或相互调和;整幅只有一个光源,每样东西都分成亮面和暗面(山的折线山脊,松树从中间劈开,云的暗面是云减去挪动后的自己);「矢量纸片」的层次:每抬起一层,先往已有画面投一道短而柔的夜蓝色阴影,所以每处重叠都有一道细缝;光是一圈圈叠起来的平涂半透明光环;每层极淡的纤维纹,加固定的细颗粒
绘本角色动画 lib/storybook.py · Storybook 是真动画,不是阶段叠化:每样风景都预画一次,并记一张「揭示图」(笔或刷子在第几时刻碰到每个像素),所以墨线沿着笔路画出来、水彩带着一道略深的湿边晕开、小物件回弹着冒出来;山坡、小花、河岸正好在角色经过时画上(follow)。角色每帧用隐式曲面现画,沿运动方向做保体积的挤压拉伸,最低点正好贴地,光照固定在世界里(滚动时高光不跟着转);动作由缓动、弹簧和抛物线编排,配冲击线、白色尘团、速度线和水波。结尾一行字按笔顺一笔笔写出来(走骨架),同一个场景还能出一张旅程总图:关键姿态多次曝光在铅笔运动弧上
圆珠笔涂鸦 lib/ballpoint.py · Ballpoint 圆珠笔墨是滚珠压上去的油性墨膏,按光密度叠加:描两遍、交叉、墨团都会更深更饱和(蓝色叠成深蓝紫,不会是死黑);每一笔起笔干而细,压力和线宽一路漂移,偶尔断墨几像素,停笔和急转弯处掉墨团,抬笔甩出小钩;轮廓描两遍、略微错开;每一笔都在复印纸上压出凹槽,侧光下看得见,纸上还留着上一页购物单的无墨压痕;彩铅是挂在纸纹上的蜡,一块块斜向快速排线、出界,大面积轻、小面积重;手写字是细手写字体的骨架重新用笔描出来,每个字母各自缩放、倾斜、上下浮动,还有一个词划掉重写
描图纸叠层 lib/overlay.py · Overlay 画面就是一路透过率相乘:暖白灯箱从下面照上来,先透过一张黑线灰调的底图,再透过一张张只印一种油墨的半透明叠片,叠片对着套准十字放下;油墨按网点覆盖率算(超过 100% 是叠印加深),不同叠片的油墨正片叠底,蓝叠黄成绿、品红叠黄成红、品红叠蓝成紫;每张纸有自己的纸色、只有背光才看得见的云状纤维和零星纤维丝、一道细暗的裁切边、落在钢定位钉上的打孔;抬起的纸略放大、投一片透过纸也看得见的宽软阴影,并像漫射片一样把下面的东西都模糊掉,放下后才清晰,只剩一道贴边细影;卷角、撕口的皱纹绘图胶带、带光泽的透明胶片;底图里的小城用递归切分的街道切出街区,沿街一圈房屋和分户墙,海岸外一圈圈水线
粉彩界面 lib/pastelui.py · PastelUI 产品发布片里的一帧界面:整片纯色粉彩底(蓝 / 粉 / 黄 / 淡紫 / 薄荷 / 桃)加一大片柔光和几颗白色光斑;macOS 窗口卡片(磨砂外框、白色窗体、红黄绿三点、分栏)、侧面板、带圆点的小胶囊和步骤条、粗黑大标题压一条半透明色条、状态标签、圆形 ✓ / ✗ 徽章、文字高亮、嵌在正文里的引用标签和带尖角的小标签;所有形状都是有符号距离场、1 px 解析抗锯齿,阴影按 CSS box-shadow 算(偏移、模糊、扩展;一层染着底色的宽阴影加一层中性的近阴影),卡片浮起来却没有灰边;一切画进带姿态(位移、缩放、不透明度、从左往右揭开)和前后层次的图层,同一套画面既能弹出窗口、逐行写字、弹出徽章,也能让小图标从卡片后面探头;放大镜放大的是它下面真实的像素;节与节之间圆形擦除换底色;三个扁平小图标从卡片边探头——奶油色圆里的橙色星芒、紫色云朵里的 >_、橙色像素小怪
阅卷批改 lib/grading.py · Grading 绿毛毡桌上的一张答题卡,照真表格印:左边一排定位黑块、粗黑标题、姓名班级栏、考号格和涂好的圆泡、得分 / 阅卷人表格、分节、作答横线、斜纹阅卷栏;旁边是长尾夹夹住的标准答案卡。每张纸有自己的坐标和位姿,能从空中落到桌上(抬着时略大、投一片宽软的影,放下后只剩贴边细影);印刷之后写上去的东西都带「写到第几成」的进度和时间图,阶段快照能画出写到一半的笔画:考生的蓝黑作答、朱红橡皮章(毛边、成簇针孔、一头压得轻而细框断开飞白、边缘积墨、刚盖下的湿晕、轻微歪斜、纸面压出的凹痕),以及红笔的波浪线、越过起点的手画圈、弧形引线、用粗黑体按红墨处理的批注(不用手写字体)、叉、勾、一笔笔写出再圈起来的分数;墨按比尔定律算密度,笔走慢的拐弯处、压在印刷上都会更深;红笔按圆柱打光、投影从笔尖散开,上漆木章落下、压一下、再抬起
皮影戏 lib/shadowpuppet.py · ShadowPuppet 观众这边看到的一场皮影,幕布上的一切都是透过来的灯光。幕布由一盏油灯从背后照亮:灯后面淡金,往外深琥珀,带纱线粗节和一两道折痕。人偶是刮薄的驴皮,按覆盖率加每个通道的光密度来算,所以朱红、青绿、赭黄、绿色透亮,黑色几乎不透,两块皮相叠处更深,和先后顺序无关;每块皮可以剪、分区染色、沿剪边描黑,打出皮影的各种镂空纹样(圆点、圆环、梅花、铜钱、鱼鳞、如意云头、方格、冰裂、条孔),皮厚不匀让染色不会死平。关节人偶是一棵带线结、每个关节一个角度的皮件树(阳刻空脸或阴刻脸的侧面像,一只长眼一道长眉;带黑横斑的雉翎盔或绒球三叉冠;云肩、护心镜、鱼鳞甲、袖口、厚底靴),操纵杆绑在领口和手上。离开幕布的人偶会变大、变虚,又因为灯有两个灯芯分成两个影,就是没贴紧时那种软的双边;操纵杆绑的地方清楚,往下越来越虚。同一套皮还做道具:牌楼式球门(窗棂网和风流眼)、缝线的鞠、回纹底带、挂在线上的小牌。幕前是雕花戏台(回纹横楣、红漆凸起金字牌匾、透空挂落和花牙子,幕布的光从镂空处透出来),只被幕布溢出的光照亮边缘;还有内有烛光的红纸灯笼,带穗子和一圈暖光
钢笔淡彩 lib/penwash.py · PenWash 照速写人的顺序画在冷压水彩小卡上:先针管笔线稿,再松散淡彩,最后把卡片放在桌上拍下来。每张卡是独立的一张纸(窗光照出的纸纹、略不直的切边),不转着画,放下时才带一个小角度。墨线几乎等宽但是手画的:低频手抖加颤动、线宽漂几个百分点、落笔一个小墨点、有的收尾一甩;闭合形状由一到三笔组成,接口停早留缺口或冲过头沿切线出头,方框的角相互出头,偶尔一段描两遍;部件分前后,被前面部件盖住的轮廓线自动断开。淡彩先算「本来要涂的区域」,再像手快那样涂:整块错位 2–5 px(一边出线、另一边在线里留白缝),边缘用游走的阈值重新取、顺着纸纹,干边更深,颗粒沉在纸纹的谷里,淡淡的平刷条纹,浓淡斑驳,腮红和面包烤色湿中湿滴进去,打湿处纸面起皱;小形状错位缩小,鼻子不会变成白圈。不铺满卡片的背景色块绕开人物、留一圈白边;白色水粉高光最后上。墨和颜料都按光密度叠加,相叠变深、混色。带画呆萌小人的部件:大圆眼镜、点点眼、翘头发、简单的手、四肢、手绘边框、地线。照片:带「山纹」年轮和拼接缝的橡木桌、卡片的软阴影和受光的切边、按圆柱打光的针管笔和水笔(透明水杆折射下面的东西)、窗光衰减、暗角和颗粒
复古水粉 lib/gouache.py · GouachePortrait 用不透明水粉画复古绘本里的大头像,照水粉画家的顺序从暗到亮、从大到小:画板上先刷一层暖色托底,用赭色起稿;背景先满载铺平,再用半干的笔蘸亮一点、暗一点的同色皴擦;然后平涂大块,用几阶色值塑形,再上质感、五官和干笔高光,最后是印刷书页的颗粒。每一层都不透明(盖住下面),湿笔会带起一点底色。一笔是扁笔沿短弧拖过去:鬃毛含色不同,所以顺着笔有条纹;颜料越拖越少,笔尾只在纸纹凸起上留下断续的丝和点;两侧毛边,落笔处圆头。边缘利落,但会游走、在纸纹上断开。形体先鼓成穹顶(鼻子、绒球、珍珠用精确的椭球),左上方一盏灯,受光分成几个软台阶、映射到五个调出来的颜色,再用顺着形体的短笔一笔笔盖上去,台阶之间是带笔触的接缝;帽檐、鼻子、胡子下面的暗部是一层薄薄的正片叠底,腮红是粉状的。毛衣一针一针地算:V 字两条带捻股的纱线、交替在前的麻花、凹下去的反针罗纹,乘到已有的颜料上,大的明暗不丢。头发、眉毛、胡子、卷发、绒球是成千上万根锥形细线,沿流向场走、按受光分档。毛毡是斑驳、短纤维和毛茸茸的轮廓。呆萌五官:带眼皮和高光的圆眼(look 可以对成斗鸡眼)、带鼻孔和亮点的大鼻子、大耳朵
蓝调绘本 lib/bluebook.py · BlueBook 一页软蓝色调的现代绘本,照绘本画家的顺序画、再印出来:先上色块,再松松地勾墨线,乱线排出暗部,加一点点睛色,压白粉笔,然后是天气,最后印刷。颜色守在三阶蓝(粉蓝、矢车菊蓝、深青蓝)、黑墨和纸白,只点一点珊瑚红、粉色腮红和芥末黄。所有工具都落在同一张纸纹上:纸纹做过直方图均衡,「工具碰到纸纹高于 1 − 接触压力的地方」就直接等于覆盖率;纸纹还预先沿八个方向拖开,干的工具漏掉的白点会顺着笔拉成短道。一笔墨线是毛笔或墨铅笔:路径带手抖和细颤,落笔快、收笔慢,沿途粗细起伏;几根笔毛含墨不同、越画越干,线会断成顺着笔的干白道,边缘随纸纹游走;每个像素都知道自己在这一笔上的弧长和横向偏移(Pillow 画线段序号,numpy 精确投影)。闭合的形状不闭合:一个轮廓分一到三笔,在接头前停下或冲过接头,偶尔再描一遍、偏开一两 px。暗部是转折冲出轮廓的之字乱线,一次一个手腕的范围。颜色是干蜡笔、粉彩或干水粉,按大概的形状松松地涂:整体错开几 px,边缘游走,靠边处变干,一道道笔道、浓淡斑驳,纸纹白点透出来;蜡是半透明的(白纸上是本色,墨上仍是黑,蓝上加蓝更深),墨线永远在颜色上面。背景是一块毛边、不到纸边的色块,边缘顺着边刷、拖干。白粉笔只挂在纸纹凸起上,压在蓝上;雨是短的干笔,加水花、水纹、甩点和细尘。角色部件:开口的大圆脑袋、带白高光的点点眼、小小的笑、点彩腮红和雀斑,白色毛绒动物的轮廓是一串扇贝形的墨线小弧,白毛越过边缘压在蓝上。印刷一步加轻微柔化、抬黑、细纸点、中缝折痕和小页码
江南园林 lib/jiangnan.py · JiangnanGarden 一幅繁茂、细腻的园林春景,像当代的数字水粉插画,照风景插画家的顺序从后往前画:天空、远山、雾、屋后的树、建筑、对岸、水、水上的东西、前景、垂挂的画框、印章。每个画法都带 far,越远颜色越往淡青绿的雾色靠、对比越低,深度层之间再铺雾带。颜料的单位是一笔:尖叶、圆花瓣、剑形叶;成千上万笔一次画完:Pillow 把每个多边形按序号填进 2 倍超采样的 id 图(后画的盖住先画的),numpy 按 id 查颜色和透明度再缩回来,一笔不到 1 微秒。树是一组团块,每块当成被左上方太阳照亮的穹顶;每一笔按它所在团块的光从一条混好的绿色色阶取色,整棵树照水粉画家的画法堆出来:叶片打的暗底、中暗的叶、穿出轮廓的叶、光强处一簇簇亮叶、顶上几笔最亮的。繁花树是一簇簇圆花瓣按明暗排序压在暗花瓣和绿叶上,枝条从缝里露出来;近处花枝是一朵朵五瓣花和花苞。垂柳是盖住枝的垂叶树冠,加几百根发丝细的柳丝一绺一绺垂下,后排暗、偏蓝,前排亮、偏黄。屋顶是一张真的曲面 S(u, v):上陡下缓、越往下越宽、翼角外甩、檐角急翘;曲面拆成网格画进 id 图,每个像素用牛顿迭代反求 (u, v),于是筒瓦板瓦、瓦口亮边、瓦当滴水、椽头和檐底、檐影、镂空花脊和卷起的脊头、一直通到翼角尖的戗脊都按解析式上色。槅扇(方格、灯笼锦、冰裂纹)在 3 倍图上画、棂条边上有明暗;九曲桥的石板、桥墩、望柱和镂空栏板经针孔相机投影、逐面上色。湖面按岸线镜像岸上的画面,横向被细浪推开、竖向模糊、压暗,越往近处越多地混进碧绿的本色;桥、船和白鹭各有自己的倒影,睡莲叶按透视压扁躺在水面上。再加墙上桥上的叶影、红灯笼、描金匾额、一方磨损的小红印,最后轻微柔化、亮部光晕和细颗粒
干刷色块 lib/drybrush.py · DryBrushBlocks mid-century 海报 / 水粉拼贴式的编辑插画:米白纸上几大块干笔刷出的色块,颜色严格限定:森林绿、鼠尾草绿、青蓝、藏蓝、近黑、朱红,外加一点天蓝和淡青瓷。每块颜色在自己的笔刷坐标系里刷:把遮罩转到笔触方向沿 +u,在里面用普通数组算覆盖率、明暗和混色,再转回去,所以鬃毛纹、笔道和干笔收尾永远顺着笔走。一块颜色是一道道平行的宽笔或滚筒,每道起笔饱满、往收笔各干各的,也可以打断成长短不一、各有明暗的短笔;两侧几乎是直边,两端梳成长短不一的毛齿,干的一端更长。颜料只在接触压力够的地方挂上纸纹的齿——纸纹做过直方图均衡,压力直接就是覆盖率——于是有皴擦的斑和干擦的边,露出纸色或下层颜色;蘸满的笔照样实。主体背后的大色板用滚筒刷(近乎平涂、成簇细点、起笔边干净、干的两侧、几道细刮痕);撕纸片只有部分轮廓是撕口,带一圈浅色纤维边。人物是几块面:亮暗两半朝不同方向刷的外套,几块肤色平面拼的头(更暗的鼻侧、暖色鼻头),粗黑框眼镜,干笔皴擦的白胡子,从拇指一侧看的手;瓶子是竖刷的深色剪影,一道高光、一小块标签。一旁一个小朱红方块,最后像这幅画的胶印:轻微柔化、纸纹、暗部零星白点、一点细尘
暮色微缩绘本 lib/twilight.py · TwilightStorybook 一页温柔的黄昏绘本,满是微缩细节,画的是白天转入黑夜的那一刻。黄昏天空是六段渐变(薰衣草紫、丁香、玫瑰、蜜桃、杏、金),分段位置被横向拉长的噪声扰动,颜色一层层是软的;云是透镜形的带(顶上软而起伏,底部更平更清),加细细的光线和一轮低垂的淡日。一条游走的边界在整幅画上定出带羽化的夜度场 N(0 黄昏 – 1 夜):夜空渐变、银河、星星和月亮按 N 当透明度铺上去,星星越过边界慢慢变稀,不会停在一条线上;交界带补饱和度,黄昏经过淡紫、紫、靛蓝再到黑,不发灰。之后画的受光的东西(山、花、人物)都按同一个场经一个 3×3 线性变换(先降饱和、再偏冷)着色,夜的一侧的白雏菊成了月光蓝;发光的东西和图版不受影响。银河是解析的带,云状密度、一条暗带,几千颗暗星按它的密度抽样;星星是幂律亮度、亚像素溅射,最亮的几颗加四芒星。山是带雾的远山和越近越宽的拼布条纹,切成斜的田,有细垄和树篱线,点着小圆树。花坡按透视拒绝采样:大小随离坡顶的深度增长,密度按覆盖率定,所以坡顶是几千个色点、底边是几十朵八种大花;所有形状按根部的 y 排序,一次光栅化进超采样的 id 图。里面坐着扁平可爱的角色:小斗篷角色、一罐萤火虫、一只四片的风筝,风筝线跟着天色从深变银。上面叠一层科学图版的语言:3 倍图上画的细墨线、排线、制图尺寸标注、比例尺和圆形的「detail a」放大图,再加逐个字母排的细手写体小写英文;最后是柔化、光晕、颗粒、梅紫色暗角和一道撕纸边
排线夜景 lib/nocturne.py · Nocturne 一张全部由短方向笔触叠成的小幅夜景版画,像粉彩或彩铅画家排线画夜景,最后装在米白纸上。纸有直方图均衡过的纸纹、斑驳和纤维;画心先铺深色底,每一笔都裁在画心里,像贴了胶带。一笔是在方向场里积分出来的中心线(方向按 mod π 处理,中途不会掉头),带一点弯,落笔钝、收笔尖;几万笔一次画完:每一笔的轮廓按序号填进 2 倍超采样的整数 id 图,numpy 再对每个像素查出那一笔的颜色、起点、方向、长和宽,算出它在笔上的沿笔和横向位置,从而得到笔毛道——每笔 6 道,各有深浅和含量,越往笔尾越干,颜料只落在纸纹(沿这一笔自己的方向拖开)低于压力的地方——所以每一笔都有条纹和颗粒,深色的底从细缝里透出来。方向场定下「风」:天空斜着流,蒸汽顺着柱子往上、只在团块边上卷,山坡顺着锥形山的坡向,海面横着长拖、越近越长。每一笔的明度和色相(绕灰轴真正转色相)都抖一点。全画只有一个暖光:点光源和发光遮罩合成一张光照图,光用笔触铺,落笔的概率跟着「光 × 受光」走——空气和眩光用加光,被照亮的表面直接按「光 × 受光」上色,所以蓝灰的云变成红橙而不是粉,离热源最近的笔再偏向暖白。热源是一小撮黄白、外圈橙红的放射笔触,中间一个很小的白芯。熔岩是分股的细流:带惯性、一直转向终点并顺坡而下的游走,分股越往下分得越开,小角度的支流渐隐或停在一颗亮珠上,画成带紧贴光晕的发光线,再在山坡上铺光笔触;火星沿抛物线飞。海面把水线以上的画面镜像成横向笔触,被浪拉长、被涟漪推开、压暗,只在镜像亮的地方落笔,光源下面再拉一条碎的光柱。两个围着红围巾、带暖色轮廓光的坐着的小人给出尺度;压印的版痕、细体铅笔小标题和更小的说明、克制的辉光和细颗粒收尾

对 Claude 说「claude绘图」「你自己画」「用代码画」,也可以指定画风。它会:

  1. 先定构图:层次、焦点、留白,而且画面要图解内容本身;
  2. 写一段场景脚本,调用绘图库;
  3. 渲染并自己看图,对照该画风的毛病清单修改,一般改 2–4 轮。

为什么用代码画,而不用生图模型

  • 构图可控:位置、留白、点睛色都精确可控,不靠抽卡。
  • 可复现:同一个随机种子,画出同一幅画。
  • 能做「作画过程」动画:用 stage() 存下每一步,视频里就能看到画被一步步画出来。上面的动图就是这样做的,生图模型只能给一整张画。
  • 哪里都能跑:离线、只用 CPU,不需要显卡、API Key 或额度。

安装

git clone https://github.com/cloveric/claude-drawing-skill.git ~/.claude/skills/claude-drawing
pip install -r ~/.claude/skills/claude-drawing/requirements.txt   # numpy、Pillow

题字和纸条需要中文字体。macOS 的楷体/宋体、Linux 的 Noto CJK、Windows 的楷体/宋体都会自动找到,也可以用 INKPAINT_FONT=字体路径 指定。不少画风还会找常见的西文字体(无衬线、圆体、花体、手写体,见 core.latin_font),可用 INKPAINT_FONT_<风格> 指定,比如 INKPAINT_FONT_HAND。仓库里不附带任何字体文件。

快速上手

水墨、水彩、剪纸的最小示例见上方英文部分的代码。每种画风都有完整范例:

python3 examples/bawansiqian.py         out.png --stages stages/   # 水墨:八万四千法门
python3 examples/moon_river.py          out.png                    # 水墨:月印万川
python3 examples/watercolor_autumn.py   out.png                    # 水彩:秋日湖畔
python3 examples/watercolor_washes.py   out.png --layout cover     # 水彩:底纹背景(--layout bill、--seed N 出变体)
python3 examples/papercut_balloons.py   out.png                    # 剪纸:热气球小镇
python3 examples/colorpencil_dessert.py out.png                    # 韩国彩铅:午后甜点
python3 examples/anime_summer.py        out.png                    # 日本动漫:夏空
python3 examples/editorial_ideas.py     out.png                    # 编辑风:灵感生长
python3 examples/oil_wheatfield.py      out.png                    # 油画厚涂:麦田星空
python3 examples/ukiyoe_fuji.py         out.png                    # 浮世绘:富士曙
python3 examples/pixel_rainy_cafe.py    out.png                    # 像素风:雨夜咖啡店
python3 examples/clay_lighthouse.py     out.png                    # 黏土定格:灯塔岛
python3 examples/cyanotype_botanicals.py out.png                   # 蓝晒:蓝晒植物
python3 examples/stitch_sampler.py      out.png                    # 十字绣:家
python3 examples/panel_radio.py         out.png                    # 复古仪器面板:Aurora 64 收音机
python3 examples/sticker_market.py      out.png                    # 贴纸拼贴 · 小票:周末市集
python3 examples/notebook_brewing.py    out.png                    # 实验笔记本 · 贴纸:咖啡萃取实验
python3 examples/chalk_lesson.py        out.png                    # 黑板板书:为什么天空是蓝的
python3 examples/cyberpunk_neon_street.py out.png                  # 赛博朋克:霓虹不夜城
python3 examples/cartoon_toaster.py     out.png                    # 卡通手绘:早安吐司
python3 examples/isometric_weather_island.py out.png               # 等轴 2.5D:岛上的气象站
python3 examples/lineart_paper_plane.py out.png                    # 单线画:从这扇窗到那扇窗
python3 examples/soft3d_rise.py         out.png                    # 柔光 3D:浮出
python3 examples/morph_water_cycle.py   out.png                    # 形变动画:一滴水的旅程
python3 examples/newscollage_curiosity.py out.png                  # 报刊拼贴:好奇心周刊 · 拆开看看
python3 examples/aurora_morning.py      out.png                    # 弥散玻璃:晨间计划
python3 examples/bauhaus_form_colour.py out.png                    # 包豪斯几何:形与色
python3 examples/synthwave_coastline.py out.png                    # 复古 Synthwave:海岸线 1987
python3 examples/perler_strawberry_coaster.py out.png              # 拼豆:草莓杯垫
python3 examples/petroglyph_migration.py out.png                   # 岩画:迁徙季
python3 examples/tomb_harvest.py        out.png                    # 古埃及墓室壁画:尼罗河丰收
python3 examples/mosaic_harbor.py       out.png                    # 罗马马赛克:港口渔获
python3 examples/stainedglass_seasons.py out.png                   # 彩色玻璃花窗:四季之窗
python3 examples/illuminated_starchart.py out.png                  # 泥金手抄本:星辰之书
python3 examples/codex_ornithopter.py   out.png                    # 达·芬奇手稿:扑翼机
python3 examples/silhouette_family.py   out.png                    # 剪影:剪影小像
python3 examples/letterpress_circus.py  out.png                    # 凸版印刷海报:马戏团来了
python3 examples/constructivism_radio.py out.png                   # 苏联构成主义:无线电
python3 examples/artdeco_express.py     out.png                    # 装饰艺术:夜行快车
python3 examples/comic_rocket.py        out.png                    # 黄金时代漫画:火箭小队
python3 examples/popart_cat_moods.py    out.png                    # 波普丝网:猫的六种心情
python3 examples/lineprinter_launch.py  out.png                    # ASCII 字符画(行式打印机):发射记录
python3 examples/lowpoly_canyon.py      out.png                    # 低多边形:峡谷飞行
python3 examples/stencil_kite.py        out.png                    # 喷漆模板涂鸦:放风筝
python3 examples/patch_camping.py       out.png                    # 刺绣徽章:三晚露营
python3 examples/blueprint_lighthouse.py out.png                   # 蓝图工程图:灯塔剖面
python3 examples/crayon_picnic.py       out.png                    # 儿童蜡笔画:我的周末
python3 examples/crt_weather.py         out.png                    # 绿屏终端 CRT:今天带伞吗
python3 examples/thermal_kitchen.py     out.png                    # 热成像:厨房里的温度
python3 examples/delft_canal.py         out.png                    # 代尔夫特蓝瓷砖:运河小镇 · 一阵风
python3 examples/cave_hunt.py           out.png                    # 洞穴壁画:篝火旁的岩洞
python3 examples/macpaint_garden.py     out.png                    # 1-bit 早期画图软件:窗台花园
python3 examples/blackfigure_games.py   out.png                    # 古希腊黑绘陶瓶:赛跑与赛车
python3 examples/graphite_bicycle.py    out.png                    # 铅笔素描:老街角的自行车
python3 examples/xray_luggage.py        out.png                    # X 光片:行李安检
python3 examples/rubberhose_morning.py  out.png                    # 1930 年代黑白橡皮管动画:早晨的闹钟
python3 examples/linocut_snowy_village.py out.png                  # 黑白麻胶版画:雪夜归途
python3 examples/vhs_birthday.py        out.png                    # VHS 家庭录像:吹蜡烛
python3 examples/flatvector_night_camp.py out.png                  # 扁平矢量:山间夜营
python3 examples/storybook_acorn.py     out.jpg --gif out.gif      # 绘本角色动画:小橡果的秋天
python3 examples/ballpoint_board_game.py out.png                   # 圆珠笔涂鸦:蛇梯棋大冒险
python3 examples/overlay_city_map.py    out.jpg --stages stages/   # 描图纸叠层:海港步行图
python3 examples/pastelui_packing.py    out.jpg --stages stages/   # 粉彩界面:出发前,再查一遍行李
python3 examples/grading_math_quiz.py   out.jpg --stages stages/   # 阅卷批改:数学单元测验
python3 examples/shadowpuppet_cuju.py  out.jpg --stages stages/   # 皮影戏:蹴鞠
python3 examples/penwash_neighbours.py  out.jpg --stages stages/   # 钢笔淡彩:街角速写
python3 examples/gouache_rainy_day.py   out.jpg --stages stages/   # 复古水粉:雨天三人像
python3 examples/bluebook_shared_umbrella.py out.jpg --stages stages/   # 蓝调绘本:借伞
python3 examples/jiangnan_spring_water.py out.jpg --stages stages/   # 江南园林:春水园林
python3 examples/drybrush_noodle_counter.py out.jpg --stages stages/   # 干刷色块:面馆
python3 examples/twilight_paper_kite.py out.jpg --stages stages/   # 暮色微缩绘本:夜的边上
python3 examples/nocturne_lava_sea.py out.jpg --stages stages/   # 排线夜景:熔岩入海

作画要点(Claude 交图前逐条自查)

  • 水墨:先远后近,每层墨染遮挡身后;落笔间距跟笔毛挂钩,笔画不会一节一节;小路要少、平滑、从雾里伸出来;皴擦长而顺坡、集中在阴面。
  • 水彩:纸纹要细;阴影用湿画偏一侧积色,不要画成靶心;深色罩染只积在树冠内;同一处罩染不超过三层。
  • 剪纸:大色块用平纸或牛皮纸,蜡笔只做点缀;撕口白边宽 5–8 像素,只出现在部分边缘;阴影偏移要补零。
  • 彩铅:排线要够密,颜色才能叠到饱和,用力大小决定能压进多少纸纹;白色物体用暖奶白色配淡紫灰或淡蓝灰阴影。
  • 动漫:云要用许多不规则团块,每团带月牙形的硬边暗面;人物比例要对。
  • 编辑风:专色 4–5 种,刻意让它们重叠;每层油墨都要有颗粒、浓淡不匀和几像素的套色错位。
  • 油画:先大笔铺底,再中笔,细节笔只用在要紧处;颜料凸起要克制(平顶、弱高光),否则笔触像塑料管。
  • 浮世绘:平涂色块,晕色只用在天空和海面;云带不透明;墨线勾住一切;标题签和印章放在天空留白处。
  • 像素风:在真正的低分辨率上画,用抖动代替渐变;光晕要小(大面积抖动会变成方块);放大只能用无插值。
  • 黏土:按高度(像素)思考,部件顺着下面的东西铺;手指抹痕要宽、要柔、要少,否则天空像揉皱的锡纸;不可平铺的噪声不能循环平移,会留下笔直的接缝。
  • 蓝晒:想的是挡紫外线,不是上颜料:薄叶不透明度约 0.85、叶脉完全挡光;绒毛要离纸,边缘才柔;蕨类羽片是一整片带圆齿的叶子,不是一排分开的小叶;干刷的笔尾是利落的断续刷丝,不是一片模糊。
  • 十字绣:一切都在布孔的格子上;半针不要叠在十字绣上(亮部换浅色线);短的斜向回针一针从孔到孔,否则会被吸附成 L 形台阶。
  • 复古面板:所有部件同一盏主光:左上边亮、向右下投影;喇叭布的金丝要长浮,短了像冲孔板;丝印字别压在花纹上,也别挤到刻度末端。
  • 黑板:满压的粉笔也要留约 15% 的坑点和毛边,否则像矢量线;∝ 要手写一笔(粗体字形会糊成 ∞);大面积用轻压力加渐变铺色;上节课的残影要淡,放在空白处。
  • 赛博朋克:倒影按每样东西自己的着地行翻转,不能按一条地平线整体翻;店内亮度压在 0.2–0.45,否则街面成了过曝的墙;雨丝只在霓虹附近被照亮;飞车光轨横穿街道,不要全都飞向灭点。
  • 卡通手绘:先远后近,因为每次平涂都会挖掉身后的东西;手臂先画、身体后画,把肩膀藏起来。背光一侧的线更粗,颜色错开线几像素。质感放在该在的地方(烤边,而不是脸上)。帧与帧之间只抖墨线,铅笔稿和颜色不动,动图也小。
  • 等轴 2.5D:三个面的明度靠一个太阳照出来,不要手涂;墙面 AO 要沿法线往外看,不能把楼自己和屋檐的高度算进去,否则白墙发灰;柱子的顶和底不能跨边插值;悬浮卡片、云和细线不进高度图;海浪短线沿世界 y − x(屏幕水平)画;岛的前两条边留宽海面,才看得出是岛。
  • 单线画:整幅画只有一条线,按作画顺序串:用 chain() 串形状,够不到的窗户原路进出,翻圈沿路径插入,放在路径平缓处,别放在爬升段;航迹这类运动轨迹用轻手(约 0.6 倍),否则会读成又一座山;点睛色只留一处,留白要多。
  • 柔光 3D:AO、阴影、落球这些查询在物体附近要用精确距离,不能用包围盒,否则球会停在半空;主体周围别挖一圈空槽,把挤开的球堆进脚边的窝里;阴影用材质自身的色调去补(发灰的薄荷色很脏);雾色和背景一致;景深跟相机一起先设好,每个阶段都是柔的。
  • 形变动画:每样东西只用一条闭合轮廓;插值前先重采样成同样点数、统一绕向、对齐起点,否则中间帧会塌成碎片;关键帧约占面板宽的六成,每段只画三个残影,中间那帧填色;轨迹用虚线,别和对应点的圆点混;形状保持纯平,纸纹只加在露出的纸面上。
  • 报刊拼贴:先印、再撕或剪、最后粘;手撕的白色纸芯只出现在一段段边上,剪刀边是一串短直线,白边宽窄随手变化;网点照片里的物件要比背景深一档,齿、发条圈这类细节间距至少约 4 个网点,否则糊成灰;报纸正文只用生成的伪词。
  • 弥散玻璃:玻璃要模糊它下面真实的东西,白纱要薄(约 0.24,饱和度约 1.5),否则像奶白塑料;小球要有三四成压在玻璃后面,别和卡片边相切;卡片只在对方的内边距里重叠;一种渐变只代表一件事;动图调色板给饱和像素加权,再叠同一张 Bayer 抖动。
  • 包豪斯:先浅后深,一种颜色一块版,同色的东西放在同一块版上,错位才会整体一起动;露纸坑点约 2%、只在墨膜薄的条纹里,否则色块像砂纸、字像旧橡皮章;版边只做 3×3 轻模糊(大模糊会把直角磨圆);深色块上的标注用挖空,不要黑字压蓝;页边小字让开裁切线。
  • 复古 Synthwave:太阳底色压低、靠泛光提亮,否则冲成白团、切口被填平;海面倒影按横带以太阳所在列为中心拉伸打碎,光源的倒影比天空更强;网格线按屏幕像素算宽度,格子太密就换成平均值;录像带损伤要轻:一条跟踪噪带、不到一像素的逐行抖动。
  • 拼豆:先搭出真的管子,让光把豆子「画」出来:孔、孔里的钉子和那一条侧壁,才是它和像素风的区别。熨烫用 melt 控制,不要手涂:0.4 是半熔(孔在、珠粘、留菱形缝),0.7 是成品;熨平后去掉接缝沟和细纹,否则像六角螺母、像糖霜。侧壁从平滑后的图、在墙脚取样着色,别用抗锯齿的边缘行。豆堆只堆一层左右。光泽靠镜面里的灯箱(左上沿一道弧),不要每个孔一圈菲涅尔白环。
  • 岩画:是把漆敲掉,不是往上画亮色:凹坑打穿到浅色石头,低角度侧光给每个坑打出明暗。凿点要密(约单坑面积的 3 倍数量),否则像撒了一层粉笔末。沙漠漆是近乎均匀的深色漆膜,流痕是一条条边缘清楚、往下变窄变淡的独立痕迹:全幅竖条噪声会变木纹,硬顶矩形会变条形码,糊开会变烟。剥落要有小贝壳弧唇口和鲜橙色石面;AO 要轻,否则每个台阶都长一圈黑边。投影步进前先用边缘复制 pad 高度图。至少给三档年代(新凿、几百年、鬼影)。
  • 古埃及墓室壁画:先把东西都声明好,再按古代工序画(比例格、红稿、绕开人物刷底色、一种颜料一遍、勾线、写字、做旧),每层都留着,剥落时才露得出下面那层。弯腰的人肩膀要往侧面转,否则后肩会翘到头顶上。劳工赤膊,项圈和放大的身形留给总管和书吏。灰泥脱落要有深度(高度图加左上内壁的投影),不是一块带亮边的褐色补丁。部件细节的 z 只加 0.002,扛着的筐的编织纹才不会跳到手臂上面。
  • 罗马马赛克:让石子的排向去画:先眼睛和细节,再轮廓一排,再沿轮廓往里填,再给图形加光环,最后才铺背景——排向(andamento)才是马赛克的样子。石面要低而平(1.5–2 px),否则成了碎石路。取石先比色相再比亮度,灰色里才不会混进蓝粉。判断脊线的滤波要看得到下一排,否则轮廓排会变胖。要保持完整的东西(眼睛、网里的鱼)先铺,横穿它的线后铺。最后才做旧:脱落处露出旧灰浆床和石子方坑,一道裂缝,成片积灰。
  • 彩色玻璃花窗:每条色边都是一条铅,要像玻璃匠一样分块:同一种料只用一次 glass()(另起一块区域就会多一圈铅);只切玻璃切得出来的形状(树干、大枝宽 16 px 以上,细枝用画的);体积靠 matt 和刮白,不靠多切块。铅条要接近黑,光晕只吃掉一点边。先定铁条高度,鸟、脸、字都避开它。daylight() 时才点亮室内,阶段之间石墙不动。
  • 泥金手抄本:照作坊的顺序来:打格 → 抄写(红字和首字母留空)→ 朱笔 → 画图 → 贴金 → 上色 → 勾线。先贴金后上色,颜料要绕开金。打磨金箔当镜子算,颜色就是它映出的房间:给石膏底一点打磨留下的起伏,让平面的反射落在窗光的斜坡上,才有明暗带;相机放远,免得跨页一侧的金发黑。动笔前先量行宽(x 高 18 px 时一行约 45 个字符),宁可断词加连字号,也不要硬撑词距;花枝离正文和边框条都要留空。
  • 达·芬奇手稿:照左手的习惯排线:处处是「\」,一排一排下笔,同一排共用略有错位的断点,别把弯弯的短笔首尾接成一串(会像卷毛);明暗靠排线停在哪里,而不是整片加深:蒙皮从前一根肋到后一根肋取 t²,只在最深的一条交叉;蝙蝠翼的后缘在两个肋尖之间往里凹;扇形展开的翅膀每根羽毛只画露出来的部分,羽尖要圆;纸要旧(泛黄云斑、清楚的霉斑、潮线),墨要暖;让笔里的墨用干再蘸;笔记右到左镜像书写,左边参差。
  • 剪影:轮廓用控制点一次写好再样条化,比例不对用 warp= 改,别逐点重敲。细节要「剪」出来而不是画:羽毛、睫毛、胡须、缆绳都是 4× 超采样的单独细条,剪一个空(眼睛、蝴蝶结里的缝)比画十条线都管用。金粉要省:六根发丝、一道帽檐、几道衣褶就够,密排平行线像条纹头盔,随机小弧像气泡。互相重叠的形状(帆、三角帆、蝴蝶结环)之间留一道卡纸缝,否则连成一块黑。题签字号按那一行椭圆的半宽来定。
  • 凸版印刷海报:一次只压一种油墨,让第二次压印自己差几像素,不要手画错位。每行木活字都排满版心(先压扁或拉宽字面,再加字距),每个字当成一块木头单独上墨。漏白只放在实地内部、约 1%–5%,多了就像噪点滤镜。排线的线宽跟着明暗走,亮处收尖消失,不要一刀切断。动物合成一个剪影只刻一圈外轮廓,再补几笔内部轮廓;身体绕髋抬起,腿竖直落下。
  • 苏联构成主义:一种颜色一块版,套印误差只按整块版加,红黑才会整体错开。黑上加黑挖不出空:电波线、黑条要让开带反白数字的标注。网格类照片要杆件少而粗、远侧变浅、加网前少模糊,否则网点糊成一根点状锥体。剪下的照片要压在红或黑上,否则白边看不出;剪刀进不去的窄缝要桥接,围住的洞要填平。楔形末端藏到它指向的照片下面。错位前先 pad 版,否则纸边露白。
  • 装饰艺术:不画线,先刻遮片再往里喷渐变,形体只靠明暗。雾滴颗粒只留在薄涂处(噪声 × d(1−d)),处处都有就像撒沙。3D 列车要用合格的距离场(核心线段膨胀一个半径,只沿轨道拉伸),把截面朝一个点缩放会在车鼻上出指纹纹。先实测车鼻表面在哪,再放头灯、收条纹。河面里亮的东西要比黑天空反射得多。高楼都压在标题带下面,钟画在楼身上,别浮在楼顶上。
  • 黄金时代漫画:网点和错版交给印刷模型,不要手画:色块只给 Ben-Day 比例,每版按自己的角度加网、错开几像素去印。棕色别带蓝版(粗网下 C+M+Y 的玫瑰斑发绿),两版叠网只留在少数区域,人物才看得清。先画后面的东西,让 part 擦掉被挡住的墨线(先画座舱里的人,再画船体)。羽状排线的长短要成波浪起伏,别像尺子刻度,也别穿过字。顺风飘的围巾、耳朵别挡住后面角色的脸。
  • 波普丝网:先涂色、后印黑。颜色形状别照着黑版描:要简化,偏大或偏小,每格的颜色漂移和放版偏移都不一样,错位才会一格一个样。表情放在黑版里,心情交给配色。闭眼要画成粗弧线,别在眼睛形状的色块上压一道细线,那样会读成眉毛。墨量要可信:density 0.92–0.95 缺墨但认得出,1.1–1.15 墨多,flood 超过约 0.5 会糊掉半张脸。缺墨时要碎成刮板条纹和团块,别碎成布纹方格(像数码图案)。遮罩用 np.maximum 就地累积,别把几十张整幅遮罩放进列表。
  • ASCII 字符画(行式打印机):把角色和调子画进隐藏的角色图,不要手摆字符;每种材料一套符号阶梯,填色里用字母远看就成了单词。线条字符按真实像素里的方向选、不用模板匹配,每行只留一格;桁架斜撑一列一行地走,交点落在格心才打得出 X。云团只在亮顶描边,阴影交给调子。尾焰是从喷口往下变宽的亮柱:里面稀疏的 ! | ' . 条纹,边缘一圈 % @ # 烟套,接进烟云。弱的击打要在色带和纸纹上断开起麻点,不是变灰。
  • 低多边形:照当年硬件的做法画,并且让它的局限露出来:小帧缓冲无平滑放大、平面着色的小面、块状纹素、用雾藏住远裁剪面、15 位色抖动;别让画家排序去和看不见的几何打架:没人看得见的面(水下的河床)干脆不生成,贴花加排序偏置;构图靠相机:用 aim() 把主角放到三分点,让赛道转弯、目标沿对角线排开,留出天空给太阳和光晕;金环要粗管、少面、低 shine 的闪光和偏暖的底色,否则蓝天光一照就发橄榄色;太阳在画里时,着色光比看得见的太阳抬高一些;光晕只用小圆点和实心六边形,别压在主体上。
  • 喷漆模板涂鸦:照真模板来刻:每张卡纸都跑一遍 bridges()(或者确认 islands() 是 0),否则每个 O 的中间、手臂和身体之间的卡纸都会悄悄掉掉。分几个色调就分几张卡纸,先浅后深,灰版、黑版用 shade_side() 切;黑版要大胆(约占人物三分之一),灰色要明显介于黑白之间。卡纸以平贴为主:清晰的核心是这种画风的看点,到处翘起来,所有边都会长毛。滴痕用在有戏的地方(黑版、字、线轮下),白版最多一两道,桥上不起滴。从人物身上伸出去的东西(围巾、流苏)别让它像胳膊:一个结里分出两条尾巴、画横条纹、流苏散开别碰在一起。
  • 刺绣徽章:每块形状给自己的针向,相邻的要换角度——分开两块线的是针向,不是颜色。宽过约 60 px 的用填充绣;字、山尖、火焰等细长形用缎面绣,针横跨窄的那一边(火焰横着走,不是竖着)。山的亮面用中间调,白色缎面雪顶才跳得出来。小细节要先于压在它上面的东西画,平针用 clip= 限在徽章里。异形章的圆角半径至少是边框宽度的两倍。圆、椭圆、弧形条章用锁边,其他轮廓用热切缎面边。
  • 蓝图工程图:只画墨线,让晒图出效果——不要直接在蓝底上画白线。笔只用几种固定粗细(剖切轮廓粗、可见边中、剖面线和尺寸细),小字的笔宽至少 1 像素,否则接触不良的区域会把它糊掉。每张图都守制图规范、互相对得上:立面和剖面用同一套标高,剖切符号画在真正剖开的位置,尺寸数字后面的剖面线刮掉(clear=True)。整张图讲一件小事,用一张带标注的详图讲清楚(这里是灯、棱镜和透镜怎样做出一束光)。老化只在晒好之后做——折痕、朝外那格褪色、水渍、图钉孔;红铅笔是唯一的点睛色,动图里给它单独留调色板位。
  • 儿童蜡笔画:照小孩的顺序画:先把东西勾出来,再涂大片(天空、山坡、草地),用 avoid=U(OBJ, c.drawn()) 绕开纸上已有的一切,最后在白纸上给东西上色;蜡笔叠蜡笔是半透明的,红郁金香涂在绿草上会发褐。大片用宽笔(20–22 px)、低密度(0.55–0.65)、reach 240–300 px,笔道方向一块块不同、留出白缝;小东西 reach=None、笔窄一点、密度高一点。画法要天真(大头、火柴棍胳膊加耙子手指、角上的太阳、一家人站成一排),让一些颜色涂出界。标题和签名周围留一圈空白;背景的线用 line(avoid=...) 停在人后面。纸上放真蜡笔很能说明材料,但只放在一个角落。
  • 绿屏终端 CRT:按「光」想,不按「墨」想——字越密越亮,所以暗的东西(雷暴云)用稀疏的 dim 填充,只在受光的边上用 bold。提亮靠属性(dim → normal → bold),不靠更花的字;填充里不要用 - = + 这种像线的字。云用 'cloud' 轮廓(斜坡一律 ( ),平顶平底 _ . - '),云底放在整数行上,才能打成一根 _。细线在 5×7 字里留不住,月牙这类小形状用 bold 的 % # @ 填满。点拉伸要在反白之前做,反白条用 dim。动图缩小用 BOX 加 Bayer 抖动。
  • 热成像:画温度,不画颜色:先想清楚每样东西多少度、温度怎么分布(锅底和锅沿、脸和背、窗玻璃的上和下),再让热往外走(soak、plume、pool、prints)。用手调的 curve= 让房间、温暖的身体、灶台各占色板的一段——自动直方图均衡会把室温场景拉得花哨,还让猫和墙同一个颜色。只有火焰可以到白;大块一样暖的面要打断(烤箱门上搭一条湿抹布);低发射率(抛光锅盖、钢把手)能白送一层区分。OSD 放在画面里没戏的地方,数字一律用 spot、box、profile 从画面上读,不要手写。
  • 代尔夫特蓝瓷砖:按作坊工序画,线和晕染分开存(每层都有 trek 和 wash 两份),动图才能重演粉印 → 勾线 → 晕染 → 入窑。从前往后画,每画完一样东西就 occlude() 它的轮廓——只有一种透明颜料,后画的盖不住先画的。蓝色靠吸收算出来,不要直接挑色(淡染是灰蓝,浓线是紫藏青)。每块砖的画面错开一两像素、各烧各的浓淡,砖画才像一块块砖,而不是印在格子上的图。釉面小尺度要平:橘皮噪声会把窗户倒影变成闪粉,只让砖的鼓起、倾斜和缓慢的起伏去弯它。倒影按滤色叠上去、不要加成纯白,放在画了东西的天空或边框上,底下的蓝透得出来、在砖缝处断开。裂纹到砖缝就停。
  • 洞穴壁画:是涂在石头上,不是凿:颜料乘进浅色石灰岩的 albedo,唯一的光是地上的低矮火光,所以体积靠岩面起伏——把野牛画在真的鼓包上,让掠射光把它照圆。细颗粒高度要极小(掠射光会把它放大成砂纸),大起伏要适中(低矮油灯会把它拖成一团团脏影子,只让篝火投影)。吹喷要浓(约 0.95)、rim 要轻;手印别用整只手模糊一次(会变成红圈),要对着指尖和手侧吹几口气、用 1 − exp(−c) 自然淡出。黑腿要停在身体轮廓线下,否则大腿变成两团黑。裂缝要细而成之字形,否则像小树枝、像吊绳。
  • 1-bit 早期画图软件:色调只靠图案——每块区域挑浅一点或深一点的图案,天空用 bands() 分带,窗户(光源)要是全画最亮的地方。小东西放在最空的底上(白蝴蝶放在格子布前就没了),深色形体之间用白线或 XOR 分开,不用灰。喷枪少用:窗台下一道软边、黑色形体旁一片影子就够,在图案底上喷多了像脏。对称的一对只画一个,另一个 copy(..., flip=True, mask=...)。远景小物别躲在前景植物后面。快照里要看得出在操作:每一阶段换工具、图案和光标,中间开一次菜单或放大镜窗,最后停在一个选区上。
  • 古希腊黑绘陶瓶:画在展开面上,瓶子和展开图共用一张;想让人看见的人物放在正面半圈(x 从 0 到 C/2),背面留给故事的后半段,展开图负责把它讲完。人物从远到近声明,刻线和加彩各走一遍:叠在一起的部件只靠刻线分开,不要用第二种黑。马肚子要离地线足够高、腿斜着够到地线,不然整队马像在游泳;白马放在最远一匹并把头抬高。柔光箱的反射收成一条竖光,否则黑釉上的高光会被看成多出来的白色人物。做旧要轻:加白剥一点,结壳只在下半身,补土颜色贴近胎色。
  • 铅笔素描:照画素描的顺序来——先起形(视平线、通往灭点的透视线、带轴线的椭圆),再勾轮廓、侧锋铺底、排线铺中间调、最后压暗部;纸擦笔只在一块里匀(contain=True),亮部用橡皮提出来(轮圈、管子高光、墙角亮边、玻璃反光),不要靠留白挖洞。深色的东西(漆过的车架、车胎、车座)要画出真实的深浅,别成了带轮廓的白剪影。投影用排线、边要清楚、比投影的东西浅,否则像一个糊掉的重影。只画完中间(focus):往纸边让笔画整笔整笔地少下去,最后只剩线稿——调子平滑地渐隐会像喷枪。
  • X 光片:按东西的造法建模,别按长相画:箱子是 25 cm 深的薄壳,拉杆是两层套着的铝管,镜头是正对射线的圆环加中间厚的玻璃,电热丝是螺旋上再绕螺旋——轮廓发光、双边线、弹簧亮点、螺栓白点这些 X 光的样子会从路径长度里自己长出来。讲故事的那样东西每个像素的衰减要最大(骨头做粗、里面穿钢销),大团的有机物(衣服)保持淡但有纹理。让几样东西互相重叠——X 光是相加的,重叠正是它像 X 光的地方——但主角别压在最亮的金属上。OSD 要说的东西加 tag,数字写 {tag.z} / {tag.ml},不要手填。
  • 橡皮管动画:赛璐璐要平、背景要软——五档平灰加粗黑线的角色压在细灰线的灰色水粉背景上,这个反差就是「30 年代」,给角色加明暗就变现代了。墨线只在填色外侧,手套、鞋这类几块拼起来的东西用 union 一次画成,中间不出线;从后往前画,角色要从后面经过的东西用 clip 遮罩。头顶不要放扁椭圆(像光环),太阳不要一圈尖三角,用扇贝边光晕加粗短的放射短线。胶片老化放最后:中间调颗粒、抬起的黑位、片门晃动和圆角片门比堆划痕更管用。
  • 黑白麻胶版画:从一整块黑开始,只做减法——明暗靠刀痕的疏密和粗细,不用灰。天空大部分要留黑(几百道细风痕、只刻在几条云带里,月亮周围不刻),否则大块黑白对比就没了。黑东西压在黑底上要刻一圈白边,白东西穿过白底(雪坡前的炊烟)要留一圈黑边。套色只放在几处有意义的小地方(亮窗、灯、门前那摊光),让黑版的线从它上面穿过。发花、实边、残刀印、压印都让「印刷」这一步算出来,别手画。
  • VHS 家庭录像:给房间打光,不要给画面调色:放真实的灯(light、floor_lamp,cake 返回的每个火苗各放一盏 light),环境光压低,摄像机才有东西可以过曝、暗角才有地方出噪点。只让点光源远远超出上限——大面积超过约 2 的地方会把 CCD 拖影拉成一根贯穿画面的光柱。在钨丝灯的满屏橙里放一块强补色(蓝色的窗、绿色的沙发、青绿的衣服),比任何滤镜都管用。离镜头太近的主体画在 layer(defocus=) 里,镜头歪一两度,OSD 通过摄像机加(rec、datestamp、zoom_bar),让它跟着录像带一起糊;跟踪噪带放在底边,别压主体。OSD 只用点阵字库,1 点宽的缝会被填死,过了录像带检查 0/8、W、M 读不读得出来。
  • 扁平矢量:靠几个大形状和留白取胜,不靠细节:三四层地形、一个月亮、大片天空,用一两处暖色讲一件小事。只用 7 色,其余都是它们的深浅。整幅一个光源,暗面永远在背光那边。没有描边,所以每样东西的颜色要对着它身后的颜色来定(橙色帐篷放在黄沙上,别放在橙色山丘前)。每层抬起几像素,留一道柔和的阴影缝;纹理控制在 1% 左右,平涂看上去还得是平的。半透明形状只放在单一底色上。要画人,只画很小的剪影。
  • 绘本角色动画:故事靠表演,先编排动作——每个大动作前都要有预备(压扁、往反方向后仰),沿速度方向拉伸,每次落地压扁并配冲击线和尘团,之后用弹簧回稳——再让世界跟着角色画出来(follow= 提前量 150–350 px,起点左边那段用 pre=)。柔边按像素给,别写成 2000 px 宽层的比例,否则湿边变成一团雾。镜头别动:只有动的地方重新编码,151 帧才能压在 0.6 MB 左右。总图里选沿路分得开的姿态,终点画最后一帧本身,别再叠残影,道具终点位置也藏掉。
  • 圆珠笔涂鸦:先画在前面的东西(棋子),后画的线都用 clip 在它前面停住——蛇、梯子、格线、彩铅都绕开棋子,就像笔走到已经画好的东西前会抬起来。大面积彩铅轻压(约 0.4),小面积压重(0.7–0.9),排线出界几像素。红笔只留给「这一步」(跳格、圈、箭头、结论),其余用蓝、黑。每个标注都放进空格子或页边:被格线劈开、被汗滴挤住的字看起来像画错了。折痕和无墨压痕要淡,是「找得到」而不是「一眼看见」。
  • 描图纸叠层:按「光」想,不按「颜料」想——每张纸只会挡光,所以浅色是网点覆盖率,叠色交给正片叠底自己算。所有分色片都用纸放下时的同一套画布坐标画,每张都印同一组套准十字,天然对得上。描图纸要透(透过率约 0.98、云纹约 2%),否则三张叠下来整座城发灰。反白数字露出的是下面那一层,所以站点别压在深色地标上;电车和步行路线在同一条路上要各走一边。胶带和卷角放在没印东西的地方。纸只抬一点(模糊 σ 约 3 px、偏 20–35 px),看上去是「悬着」,不是又一张画。
  • 粉彩界面:一屏只讲一件事——一个大标题、一个主窗口、一个侧面板、一个状态,字少而大。底色平、卡片实心白,颜色只放在强调处(步骤条、标签、徽章、色条);绿色只留给「通过」,所以有 ✓ / ✗ 的画面用蓝底。小图标放在它探头的那张卡片下一层,让卡片自己挡住其余部分。放大镜要有地方放:对准一样东西,标签放在镜框外(镜片压在窄窄一列上会把日期和温度切成两半)。同一样东西的不同状态各画一层再切换;做动图时,会动的东西给几个中间姿态,不要叠化。
  • 阅卷批改:一张卷子讲一件批改的事——几道作答、一处错,所有红笔都指向它:下面波浪线、外面一个圈、一道引线拉到阅卷栏,批注和叉跟出错那行同高(把批注行排在阅卷栏第一行,引线才短)。字少而大,纹理交给表格本身(涂卡圆泡、定位黑块、斜纹)。圈要有地方:两边各要约 8 px 空白,所以让考生在写错的那个数前多空一格。印章要不匀但认得出(轻的那头压力约 0.64)。红墨按比尔定律算密度,0.8 以上只是略微变深,浓淡要靠密度范围(约 0.4–1.2)拉开,而不是换颜色。做动图时,笔和章给真正的中间帧(~ 运动阶段),不要叠化。
  • 皮影戏:幕布边缘要暗,只在灯后面那一块发淡金,染色的皮才会「透亮」,而不是像印上去的。大面积留实色,镂空纹样只放在一段里:画布上一个纹样单元小于约 12 px,袍子就成了渔网。侧身时肩就在头的正下方,近侧手臂抬过约 140° 会从脸前过:要高举就举远侧那只往后上方,近侧手臂斜向前上(130–147°);亮相就是一手高(远侧向后上)、一手低(近侧向前下),再提膝。给翎子留地方;护肩花只放在近侧手臂上。离幕一点(d ≈ 0.05)的人应该是一个清楚的影加一条软的双边,不是失焦。做动图时,会动的都给真正的中间帧(~ 运动阶段):光晕铺开,人从侧幕滑进来由虚变实,起脚,亮相定住。
  • 钢笔淡彩:先墨后彩,让颜色「涂歪」:每块淡彩错开线条几 px,一边出线、另一边留白缝;但小形状要把错位缩小,否则鼻子、面包屑会变成白圈。纸纹和颗粒要收着,开满了卡片像拉毛墙、淡彩像彩铅。部件要分前后,被挡住的轮廓线才会断开;五官收在头的轮廓里(只有鼻子可以鼓出去)。小心看错:胡子下面的小圆圈会读成字母,红圆顶加白点是毒蘑菇,白色椭圆肚子是雪人,滑板车立杆不能穿过脸。背景色块绕开人物留白边,不要铺到卡边。桌上的笔按真实比例画(针管笔比卡片还长)。做动图时空桌面单独分少量色位,其余只从变化的像素里切,否则橡木会吃掉淡色背景块的色位。
  • 复古水粉:从暗到亮,每层盖住上一层。让它像水粉的是干笔:背景先用满载的笔铺平,再用一落笔就半干(load 约 0.7)的笔蘸亮一点、暗一点的同色皴擦;每笔都满载落笔,就成了一根根香肠。形体在穹顶上分三四个软台阶,光要带正面分量,否则帽子和脸是扁盘子、亮的是轮廓边。皮肤给暖的暗部,默认的冷色在皮肤上发紫。大鼻子用小的半透明笔触,否则像迷彩。所有质感都是对遮罩里已有的颜料做乘法或加笔,调 knit、rib、dry_highlight 前先把前面的部件从遮罩里减掉。小心看错:
    • 排成一排的雨珠像铆钉;
    • 两端圆头的围巾像颈枕;
    • 热气碰到鼻子像鼻涕;
    • 同心的卷发像肉桂卷(让每个卷是绕着暗色空洞的环);
    • 两片鼓鼓的衣领像靠垫。 最后在受光面拖干笔高光,穹顶要顺坡拖。做动图时强制放几个深中性色,否则瞳孔会被量化成藏青。
  • 蓝调绘本:颜色要守住:三阶蓝、黑墨、纸白,珊瑚红、粉色、芥末黄只点一点;多一种颜色就是另一本书了。覆盖率只由压力决定(0.95 左右只留细白点),斑驳和笔道只改颜料浓淡、不改覆盖,否则整片蓝像刮花的粉笔。铺背景色块时先把白的东西留出来(熊、脸、伞、头发),这些点缀色涂在白纸上:蜡笔盖在蓝上会发闷,深底上的小点缀要用不透明的水粉。墨线在色块之后画,之后再上的颜色在墨上挂不住(over_ink),线才一直在上面。暗部要一团一团,不要一条带:按「越往下越暗 + 低频噪声」取阈值,草叶和乱线用 clip 避开角色。小心看错:
    • 举起的胳膊从脸前横过去,脸就没了(两只胳膊都走头的另一侧);
    • 深色长椅上的蜗牛只是一个芥末黄圆盘(让它落在浅色的东西前面);
    • 平涂的圆形中蓝远树像气球;
    • 一样长、一样颜色的雨是数码雨(用三种深浅,长短拉开)。 印刷(中缝、页码、抬黑)放到最后,而且只抬黑,否则白纸会变灰。
  • 江南园林:严格从后往前画,每一层给自己的 far:屋后的树要比建筑更蓝、更淡、更平,不然整幅画像一张贴纸。树冠只能用笔触堆,不要平涂一团再撒噪点:叶片打的暗底、满冠的叶、穿出轮廓的叶,亮叶只在团块朝阳的地方一小簇一小簇地落;团块多一点、小一点,轮廓才碎、才活。垂柳是一绺一绺的细柳丝,绺间留缝,叶子随机挂在茎的两侧、不要人字纹;枝要压在树冠下面,露出来就成了伞骨。繁花的暗底也要用笔触,平涂的暗底会从花缝里透出一块块紫褐色。眼高 3 m 时,近侧栏杆会挡住低平曲桥的整个桥面:只留远侧栏杆,石板和折线才读得出来,并确认朝向镜头的面没有被剔掉。水面的竖纹要很淡(1% 左右),不然像下雨;倒影要对得上岸上的东西,只是更柔、更暗。小心看错:
    • 一圈红边、一道硬内线的睡莲叶是卡通盘子;
    • 灯笼锦窗中间留一大块空框、底下是窗纸,就成了空白牌子;
    • 只有一只窄而竖的翅膀的飞鹭是一根羽毛;
    • 对岸一条发白的空带是一堵雾墙,要种满到水边。 最后在受光的墙上加叶影、整体加一点光晕,印章要小。
  • 干刷色块:几块大色块撑起整张画,颜色守住海报的六七种;不勾线、不做渐变,形体全靠色块的边和叠压。纹理要「刷出来」而不是事后撒上去:每块在自己的笔刷坐标系里刷,鬃毛纹和干尾才顺着笔走;覆盖率只由接触压力和纸纹的齿决定;两侧几乎是直边,两端梳开。纸纹背后的噪声要平稳、能循环(白噪声模糊、循环边界):放大粗网格一阈值化就是一道道横档,像蜡笔排线;补零的纹理块边缘会空出整列。大背景色板用滚筒(平涂、成簇细点、只在两侧发干),用鬃毛条纹就像在下雨;压在深色上的实心东西(瓷碗)要用蘸满的笔(load > 1),不然深色从细点里透出来。长的笔道要打断成长短、明暗不一的短笔,不然外套成了条纹。小心看错:
    • 低压力的细笔是铁丝,皴擦带是一团灰雾,热气干脆不画;
    • 镜片里的暗色明显超过两成(0.45 那版),眼镜就成了墨镜;
    • 鼻子的暗面和脸颊一样深就不见了,暖色鼻头还会被看成嘴;
    • 小东西边上的干笔毛齿像速度线。 在空白的纸上放一个小朱红方块,印刷放到最后。
  • 暮色微缩绘本:先定夜度场,所有受光的东西都按它着色,黄昏和夜才是同一束光——白雏菊到夜里是月光蓝,不是灰;星星、萤火虫、灯和图版不受它影响。交界要经过淡紫、紫和靛蓝:补饱和度,但要轻,不然成了一堵霓虹墙;边界要像穹顶一样弧着压过来,别是一条直斜线;黄昏要够浅,云才看得出来。四芒星少而小,只放在夜深处。花坡交给透视:坡顶是色点、底边是整朵的花,远处的花沉进雾色,不然坡顶是一条又密又亮的带。有颜色的道具(风筝)放在夜度着色压不灰的地方。小心看错:
    • 天上一条条连续的细线是电线,不是云——云是底部更平的柔和透镜;
    • 角色夕阳一侧一道硬的棕色条是一条带子,不是边光;
    • 饱和、对比强的拼布条纹像一面面旗;
    • 中间色调的标记圈落在珊瑚色风筝上就看不见了,标记圈和引线用深墨色。 放大图里标签不出圆片、数字不压线;finish() 在画第一笔之前调用,阶段快照才和成品一致。
  • 排线夜景:任何地方都不要平滑渐变——每片区域都是顺着同一个方向场的几遍短笔触:密的深色底层、中间层、少量稀疏的浅色笔道,深色的底从细缝里透出来。守住夜色:深靛蓝和藏青,只有一个暖光,光要作为一层层越往外越稀的笔触加上去,不要一团光晕;平滑的白芯要很小。被照亮的表面按「光 × 受光」直接上色(橙光加到蓝灰的云上会变粉),离热源最近的笔偏暖白。云团里的笔顺着上升的柱子走,只在团边上卷,不然每一团都是一个漩涡。小心看错:
    • 直线段加大角度分叉的发光细丝是闪电——让它带惯性地蜿蜒、小角度分叉;游走太大又会打圈成意面;
    • 天上又短又亮、均匀撒开的浅色笔是在下雪——成片成带地放,只比底色亮一点;
    • 孤立的单像素缝隙是脏点——纸纹顺着每一笔拖开,缝隙才是一道道的;
    • 远处礁石上的轮廓光会被看成也有熔岩——要很淡;
    • 倒影取样跑出画心,会把米白纸边拉进海里。 小人几十像素高、只有一点亮色,题字要小、灰、用细的普通字体。

计划

  • 按笔画分层导出,方便在 Motion Canvas / Remotion 里做逐笔动画。

MIT License · Made by Claude (Opus 5.5) with @cloveric

友链

本开源项目已链接并认可 LINUX DO 社区。https://linux.do/

About

Claude paints with code: a Claude Code skill for procedural illustration in 70 styles, from ink wash (水墨), watercolour and ukiyo-e to stained glass, Roman mosaic, Art Deco, shadow puppets, X-ray, VHS tape, pastel UI, retro gouache, dry-brush blocks, a twilight storybook and hatched nocturnes. No image model: numpy + Pillow on a CPU, draw-on GIFs.

Topics

Resources

Stars

35 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages