Composite

Node

Overlay images, add watermarks, and composite layers.

composite()

.composite(input: string | Buffer, options?: CompositeOptions): Pipeline
.composite(input: string | Buffer, options?: CompositeOptions): Pipeline

Overlay another image on top of the current image.

Options

PropTypeDefaultDescription
inputstring | BufferPath to the overlay image or a Buffer.
gravityGravity'center'Position: 'north', 'south', 'east', 'west', 'center', 'northeast', etc.
topnumberVertical offset in pixels from top. Overrides gravity.
leftnumberHorizontal offset in pixels from left. Overrides gravity.
blendBlendMode'over'Blend mode: 'over', 'multiply', 'screen', 'add', 'saturate', etc.
opacitynumber1Overlay opacity 0–1.
tilebooleanfalseTile the overlay across the entire image.

Watermark example

await img('photo.jpg')
  .composite('watermark.png', {
    gravity: 'southeast',
    opacity: 0.7,
  })
  .webp({ quality: 85 })
  .toBuffer()
await img('photo.jpg')
  .composite('watermark.png', {
    gravity: 'southeast',
    opacity: 0.7,
  })
  .webp({ quality: 85 })
  .toBuffer()

Pixel offset positioning

await img('photo.jpg')
  .composite('logo.png', {
    top: 20,
    left: 20,
  })
  .toBuffer()
await img('photo.jpg')
  .composite('logo.png', {
    top: 20,
    left: 20,
  })
  .toBuffer()

Tiled watermark

await img('photo.jpg')
  .composite('pattern.png', {
    tile: true,
    opacity: 0.15,
    blend: 'multiply',
  })
  .toBuffer()
await img('photo.jpg')
  .composite('pattern.png', {
    tile: true,
    opacity: 0.15,
    blend: 'multiply',
  })
  .toBuffer()

composite() is Node only — the WASM browser engine does not support multi-image compositing in v1.