ImageScript decodes, edits and encodes images in pure TypeScript: no WebAssembly, no native binaries, no
dependencies. It runs in Node.js 22.13+, Deno, Bun and browsers, with import or require(), and includes type
definitions.
npm install imagescript # Node.js, Bun and bundlers
deno add jsr:@matmen/imagescript # Denoimport { Image } from 'imagescript';
import { readFile, writeFile } from 'node:fs/promises';
const image = await Image.decode(await readFile('input.jpg'));
image.resize(256, Image.RESIZE_AUTO).roundCorners(16);
await writeFile('output.png', await image.encode());Coordinates are 0-based, (0, 0) is the top left pixel. A bigger example is the
README image generation:
| Format | Decode | Encode |
|---|---|---|
| PNG | ✓ | ✓ |
| JPEG | ✓ | ✓ |
| WebP | ✓ | ✓ (lossless and lossy) |
| AVIF | ✓ | ✓ (lossless and lossy) |
| JPEG XL | ✓ | ✓ (lossless and lossy) |
| GIF, APNG (animations) | ✓ | ✓ |
| BMP, QOI, TGA, Netpbm | ✓ | ✓ |
| TIFF, ICO/CUR, Radiance HDR | ✓ |
Animated WebPs and JPEG XLs decode too, and animations encode as GIF, APNG or WebP, also a frame at a time.
- Text rendering with TrueType and OpenType fonts, in every script, with color emoji
- SVG rendering (no text)
- Resizing, cropping, rotating, trimming, rounded corners, ...
- Compositing with opacity and blend modes
- Filters and color adjustments: blur, sharpen, brightness, hueShift, ...
See the documentation for everything else, and the changelog when upgrading from an older major version. bench/ compares ImageScript to Jimp, sharp and others.
ImageScript builds on fflate, libjpeg, pdf.js, font-rs, libwebp, HarfBuzz, dav1d, libavif, libaom, jxl-oxide and libjxl. The TrueType hinting follows FreeType: portions of this software are copyright © 2026 The FreeType Project (www.freetype.org). All rights reserved. See THIRD_PARTY_NOTICES.md for the licenses.
Questions? Join the Discord server.

