A browser-based Atkinson-dithering bitmap generator. Upload an image or a short video and export as SVG or GIF.
No build step, no server — plain HTML/CSS/JS. To run locally:
python3 -m http.server 8000Then open http://localhost:8000.
- Still mode rasterizes/vectorizes at a fixed 4000px long edge — smaller images are upscaled and larger ones downscaled to hit it. Exports as SVG (run-length-optimized rects) or GIF.
- Video mode (MP4/WebM/MOV) samples the first 7 seconds at 15fps (max 105 frames) at a 1080px short edge, reprocesses every frame through the same pipeline, and exports as an animated GIF only (no SVG — a still-frame vector doesn't apply to video).
- Dithers against a removable palette of 2–7 colors chosen from a fixed set (white + 6 brand colors) — no free-form hex entry. White and near-black are excluded by default but can be added back.
- Resolution controls the pixelation block count along the long edge; Fuzz applies a pre-dither blur; Exposure shifts overall brightness before dithering; Highlights/Shadows pull down the bright end / lift the dark end independently (tapered, monotonic — they can't invert tonal order); Contrast stretches/compresses values around the midpoint; Invert values negates the source before any of that runs.
- Dithering is fixed to Atkinson at full strength (no other method, no strength slider).
- Palette generation is a simple nearest-color match (no k-means method picker to configure).
- Both GIF variants (static and animated) come from a hand-rolled indexed-color GIF89a encoder — no image or video ever leaves the browser. Filenames are timestamped and include the current settings, e.g.
hs-bitmaker-aug-14-4_57pm-res1200-exp0-hi0-sh0-cont0-fuzz21.gif.
.github/workflows/deploy.yml publishes the site to GitHub Pages on every push to main. To enable it:
- In the repo, go to Settings → Pages.
- Under Build and deployment → Source, select GitHub Actions.
- Push to
main(or run the workflow manually from the Actions tab).