Skip to main content

Image Library (Image)

Image needs the image feature flag, which isn't part of this docs site's browser build — every example below is reference only, not runnable here. Images load into a document as a Data<Image> value, which every function on this page operates on directly.

Loading

Image.from_blob(bytes: blob) -> Data<Image>

Creates an image on the calling object from raw bytes, auto-detecting the format. fs.read is the natural pairing here, since both are CLI-only anyway:

const bytes = fs.read("photo.png");
const img = Image.from_blob(bytes);

Reading Dimensions

Image.width(img: Data<Image>) -> int

const width = Image.width(img);

Image.height(img: Data<Image>) -> int

const height = Image.height(img);

Transformations

Every function in this section mutates the image in place and returns nothing — call it, then export or continue transforming the same img value.

Image.grayscale(img: Data<Image>) -> void

Image.grayscale(img);

Image.invert(img: Data<Image>) -> void

Image.invert(img);

Image.blur(img: Data<Image>, blur: float) -> void

Gaussian blur — blur is the sigma value.

Image.blur(img, 2.5);

Image.fast_blur(img: Data<Image>, blur: float) -> void

Same gaussian blur as Image.blur, trading some quality for speed — reach for this one over blur if you're processing images in bulk and the difference isn't visually significant for your use case.

Image.fast_blur(img, 2.5);

Image.brighten(img: Data<Image>, brighten: int) -> void

Positive brightens, negative darkens.

Image.brighten(img, 20);

Image.contrast(img: Data<Image>, contrast: float) -> void

Positive increases contrast, negative decreases it.

Image.contrast(img, 15.0);

Image.flip_horizontal(img: Data<Image>) -> void

Image.flip_horizontal(img);

Image.flip_vertical(img: Data<Image>) -> void

Image.flip_vertical(img);

Image.rotate_90(img: Data<Image>) -> void

Clockwise.

Image.rotate_90(img);

Image.rotate_180(img: Data<Image>) -> void

Image.rotate_180(img);

Image.rotate_270(img: Data<Image>) -> void

Clockwise — equivalent to a 90° counter-clockwise rotation.

Image.rotate_270(img);

Resizing

Each of these returns a bool — whether the resize actually succeeded.

Image.resize(img: Data<Image>, width: int, height: int) -> bool

Preserves aspect ratio — the result fits within width × height but may not match it exactly.

const resized = Image.resize(img, 800, 600);

Image.resize_exact(img: Data<Image>, width: int, height: int) -> bool

Forces the exact dimensions given, ignoring the original aspect ratio.

const resized = Image.resize_exact(img, 800, 600);

Image.thumbnail(img: Data<Image>, width: int, height: int) -> bool

Same as resize, but optimized for shrinking rather than resizing in either direction.

const made = Image.thumbnail(img, 128, 128);

Image.thumbnail_exact(img: Data<Image>, width: int, height: int) -> bool

thumbnail's exact-dimensions counterpart, the same way resize_exact relates to resize.

const made = Image.thumbnail_exact(img, 128, 128);

Exporting

Each function below turns the current state of img — after whatever transformations have run — into raw bytes of a specific format.

Image.blob(img: Data<Image>) -> blob

The default export — raw bytes in PNG format, equivalent to Image.png.

const bytes = Image.blob(img);

Image.png(img: Data<Image>) -> blob

const bytes = Image.png(img);

Image.jpeg(img: Data<Image>) -> blob

const bytes = Image.jpeg(img);

Image.webp(img: Data<Image>) -> blob

const bytes = Image.webp(img);

Image.gif(img: Data<Image>) -> blob

const bytes = Image.gif(img);

Image.bmp(img: Data<Image>) -> blob

const bytes = Image.bmp(img);

Image.ico(img: Data<Image>) -> blob

const bytes = Image.ico(img);

Image.tiff(img: Data<Image>) -> blob

const bytes = Image.tiff(img);