Write output image data to a file.
If an explicit output format is not selected, it will be inferred from the extension, with JPEG, PNG, WebP, TIFF, DZI, and libvips' V format supported. Note that raw pixel data is only supported for buffer output.
By default all metadata will be removed, which includes EXIF-based orientation. See withMetadata for control over this.
A Promise
is returned when callback
is not provided.
fileOut
string the path to write the image data to.callback
Function? called on completion with two arguments(err, info)
.info
contains the output imageformat
,size
(bytes),width
,height
,channels
andpremultiplied
(indicating if premultiplication was used). When using a crop strategy also containscropOffsetLeft
andcropOffsetTop
.
sharp(input)
.toFile('output.png', (err, info) => { ... });
sharp(input)
.toFile('output.png')
.then(info => { ... })
.catch(err => { ... });
- Throws Error Invalid parameters
Returns Promise<Object> when no callback is provided
Write output to a Buffer. JPEG, PNG, WebP, TIFF and RAW output are supported.
If no explicit format is set, the output format will match the input image, except GIF and SVG input which become PNG output.
By default all metadata will be removed, which includes EXIF-based orientation. See withMetadata for control over this.
callback
, if present, gets three arguments (err, data, info)
where:
err
is an error, if any.data
is the output image data.info
contains the output imageformat
,size
(bytes),width
,height
,channels
andpremultiplied
(indicating if premultiplication was used). When using a crop strategy also containscropOffsetLeft
andcropOffsetTop
.
A Promise
is returned when callback
is not provided.
options
Object?options.resolveWithObject
boolean? Resolve the Promise with an Object containingdata
andinfo
properties instead of resolving only withdata
.
callback
Function?
sharp(input)
.toBuffer((err, data, info) => { ... });
sharp(input)
.toBuffer()
.then(data => { ... })
.catch(err => { ... });
sharp(input)
.toBuffer({ resolveWithObject: true })
.then(({ data, info }) => { ... })
.catch(err => { ... });
Returns Promise<Buffer> when no callback is provided
Include all metadata (EXIF, XMP, IPTC) from the input image in the output image. This will also convert to and add a web-friendly sRGB ICC profile unless a custom output profile is provided.
The default behaviour, when withMetadata
is not used, is to convert to the device-independent
sRGB colour space and strip all metadata, including the removal of any ICC profile.
options
Object?
sharp('input.jpg')
.withMetadata()
.toFile('output-with-metadata.jpg')
.then(info => { ... });
- Throws Error Invalid parameters
Returns Sharp
Force output to a given format.
format
(string | Object) as a string or an Object with an 'id' attributeoptions
Object output options
// Convert any input to PNG output
const data = await sharp(input)
.toFormat('png')
.toBuffer();
- Throws Error unsupported format or options
Returns Sharp
Use these JPEG options for output image.
Some of these options require the use of a globally-installed libvips compiled with support for mozjpeg.
options
Object? output optionsoptions.quality
number quality, integer 1-100 (optional, default80
)options.progressive
boolean use progressive (interlace) scan (optional, defaultfalse
)options.chromaSubsampling
string set to '4:4:4' to prevent chroma subsampling otherwise defaults to '4:2:0' chroma subsampling (optional, default'4:2:0'
)options.optimiseCoding
boolean optimise Huffman coding tables (optional, defaulttrue
)options.optimizeCoding
boolean alternative spelling of optimiseCoding (optional, defaulttrue
)options.trellisQuantisation
boolean apply trellis quantisation, requires libvips compiled with support for mozjpeg (optional, defaultfalse
)options.overshootDeringing
boolean apply overshoot deringing, requires libvips compiled with support for mozjpeg (optional, defaultfalse
)options.optimiseScans
boolean optimise progressive scans, forces progressive, requires libvips compiled with support for mozjpeg (optional, defaultfalse
)options.optimizeScans
boolean alternative spelling of optimiseScans, requires libvips compiled with support for mozjpeg (optional, defaultfalse
)options.quantisationTable
number quantization table to use, integer 0-8, requires libvips compiled with support for mozjpeg (optional, default0
)options.quantizationTable
number alternative spelling of quantisationTable, requires libvips compiled with support for mozjpeg (optional, default0
)options.force
boolean force JPEG output, otherwise attempt to use input format (optional, defaulttrue
)
// Convert any input to very high quality JPEG output
const data = await sharp(input)
.jpeg({
quality: 100,
chromaSubsampling: '4:4:4'
})
.toBuffer();
- Throws Error Invalid options
Returns Sharp
Use these PNG options for output image.
PNG output is always full colour at 8 or 16 bits per pixel. Indexed PNG input at 1, 2 or 4 bits per pixel is converted to 8 bits per pixel.
Some of these options require the use of a globally-installed libvips compiled with support for libimagequant (GPL).
options
Object?options.progressive
boolean use progressive (interlace) scan (optional, defaultfalse
)options.compressionLevel
number zlib compression level, 0-9 (optional, default9
)options.adaptiveFiltering
boolean use adaptive row filtering (optional, defaultfalse
)options.palette
boolean quantise to a palette-based image with alpha transparency support, requires libvips compiled with support for libimagequant (optional, defaultfalse
)options.quality
number use the lowest number of colours needed to achieve given quality, setspalette
totrue
, requires libvips compiled with support for libimagequant (optional, default100
)options.colours
number maximum number of palette entries, setspalette
totrue
, requires libvips compiled with support for libimagequant (optional, default256
)options.colors
number alternative spelling ofoptions.colours
, setspalette
totrue
, requires libvips compiled with support for libimagequant (optional, default256
)options.dither
number level of Floyd-Steinberg error diffusion, setspalette
totrue
, requires libvips compiled with support for libimagequant (optional, default1.0
)options.force
boolean force PNG output, otherwise attempt to use input format (optional, defaulttrue
)
// Convert any input to PNG output
const data = await sharp(input)
.png()
.toBuffer();
- Throws Error Invalid options
Returns Sharp
Use these WebP options for output image.
options
Object? output optionsoptions.quality
number quality, integer 1-100 (optional, default80
)options.alphaQuality
number quality of alpha layer, integer 0-100 (optional, default100
)options.lossless
boolean use lossless compression mode (optional, defaultfalse
)options.nearLossless
boolean use near_lossless compression mode (optional, defaultfalse
)options.smartSubsample
boolean use high quality chroma subsampling (optional, defaultfalse
)options.reductionEffort
number level of CPU effort to reduce file size, integer 0-6 (optional, default4
)options.pageHeight
number? page height for animated outputoptions.loop
number number of animation iterations, use 0 for infinite animation (optional, default0
)options.delay
Array<number>? list of delays between animation frames (in milliseconds)options.force
boolean force WebP output, otherwise attempt to use input format (optional, defaulttrue
)
// Convert any input to lossless WebP output
const data = await sharp(input)
.webp({ lossless: true })
.toBuffer();
- Throws Error Invalid options
Returns Sharp
Use these GIF options for output image.
Requires libvips compiled with support for ImageMagick or GraphicsMagick. The prebuilt binaries do not include this - see installing a custom libvips.
-
options
Object? output optionsoptions.pageHeight
number? page height for animated outputoptions.loop
number number of animation iterations, use 0 for infinite animation (optional, default0
)options.delay
Array<number>? list of delays between animation frames (in milliseconds)options.force
boolean force GIF output, otherwise attempt to use input format (optional, defaulttrue
)
-
Throws Error Invalid options
Returns Sharp
Use these TIFF options for output image.
options
Object? output optionsoptions.quality
number quality, integer 1-100 (optional, default80
)options.force
boolean force TIFF output, otherwise attempt to use input format (optional, defaulttrue
)options.compression
boolean compression options: lzw, deflate, jpeg, ccittfax4 (optional, default'jpeg'
)options.predictor
boolean compression predictor options: none, horizontal, float (optional, default'horizontal'
)options.pyramid
boolean write an image pyramid (optional, defaultfalse
)options.tile
boolean write a tiled tiff (optional, defaultfalse
)options.tileWidth
boolean horizontal tile size (optional, default256
)options.tileHeight
boolean vertical tile size (optional, default256
)options.xres
number horizontal resolution in pixels/mm (optional, default1.0
)options.yres
number vertical resolution in pixels/mm (optional, default1.0
)options.bitdepth
boolean reduce bitdepth to 1, 2 or 4 bit (optional, default8
)
// Convert SVG input to LZW-compressed, 1 bit per pixel TIFF output
sharp('input.svg')
.tiff({
compression: 'lzw',
bitdepth: 1
})
.toFile('1-bpp-output.tiff')
.then(info => { ... });
- Throws Error Invalid options
Returns Sharp
Use these HEIF options for output image.
Support for HEIF (HEIC/AVIF) is experimental. Do not use this in production systems.
Requires a custom, globally-installed libvips compiled with support for libheif.
Most versions of libheif support only the patent-encumbered HEVC compression format.
Returns Sharp
Meta
- since: 0.23.0
Force output to be raw, uncompressed, 8-bit unsigned integer (unit8) pixel data. Pixel ordering is left-to-right, top-to-bottom, without padding. Channel ordering will be RGB or RGBA for non-greyscale colourspaces.
// Extract raw RGB pixel data from JPEG input
const { data, info } = await sharp('input.jpg')
.raw()
.toBuffer({ resolveWithObject: true });
// Extract alpha channel as raw pixel data from PNG input
const data = await sharp('input.png')
.ensureAlpha()
.extractChannel(3)
.toColourspace('b-w')
.raw()
.toBuffer();
Returns Sharp
Use tile-based deep zoom (image pyramid) output.
Set the format and options for tile images via the toFormat
, jpeg
, png
or webp
functions.
Use a .zip
or .szi
file extension with toFile
to write to a compressed archive file format.
Warning: multiple sharp instances concurrently producing tile output can expose a possible race condition in some versions of libgsf.
options
Object?options.size
number tile size in pixels, a value between 1 and 8192. (optional, default256
)options.overlap
number tile overlap in pixels, a value between 0 and 8192. (optional, default0
)options.angle
number tile angle of rotation, must be a multiple of 90. (optional, default0
)options.background
(string | Object) background colour, parsed by the color module, defaults to white without transparency. (optional, default{r:255,g:255,b:255,alpha:1}
)options.depth
string? how deep to make the pyramid, possible values areonepixel
,onetile
orone
, default based on layout.options.skipBlanks
number threshold to skip tile generation, a value 0 - 255 for 8-bit images or 0 - 65535 for 16-bit images (optional, default-1
)options.container
string tile container, with valuefs
(filesystem) orzip
(compressed file). (optional, default'fs'
)options.layout
string filesystem layout, possible values aredz
,iiif
,zoomify
orgoogle
. (optional, default'dz'
)options.centre
boolean centre image in tile. (optional, defaultfalse
)options.center
boolean alternative spelling of centre. (optional, defaultfalse
)
sharp('input.tiff')
.png()
.tile({
size: 512
})
.toFile('output.dz', function(err, info) {
// output.dzi is the Deep Zoom XML definition
// output_files contains 512x512 tiles grouped by zoom level
});
- Throws Error Invalid parameters
Returns Sharp