Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

hotel-sharp

hotelfe626Apache-2.00.22.9

High performance Node.js image processing, the fastest module to resize JPEG, PNG, WebP and TIFF images

jpeg, png, webp, tiff, gif, svg, dzi, image, resize, thumbnail, crop, embed, libvips, vips

readme

sharp

sharp logo
npm install sharp

The typical use case for this high speed Node.js module is to convert large images in common formats to smaller, web-friendly JPEG, PNG and WebP images of varying dimensions.

Resizing an image is typically 4x-5x faster than using the quickest ImageMagick and GraphicsMagick settings.

Colour spaces, embedded ICC profiles and alpha transparency channels are all handled correctly. Lanczos resampling ensures quality is not sacrificed for speed.

As well as image resizing, operations such as rotation, extraction, compositing and gamma correction are available.

Most modern 64-bit OS X, Windows and Linux systems running Node versions 6, 8, 10, 11 and 12 do not require any additional install or runtime dependencies.

Examples

const sharp = require('sharp');

Callback

sharp(inputBuffer)
  .resize(320, 240)
  .toFile('output.webp', (err, info) => { ... });

Promise

sharp('input.jpg')
  .rotate()
  .resize(200)
  .toBuffer()
  .then( data => { ... })
  .catch( err => { ... });

Async/await

const semiTransparentRedPng = await sharp({
  create: {
    width: 48,
    height: 48,
    channels: 4,
    background: { r: 255, g: 0, b: 0, alpha: 0.5 }
  }
})
  .png()
  .toBuffer();

Stream

const roundedCorners = Buffer.from(
  '<svg><rect x="0" y="0" width="200" height="200" rx="50" ry="50"/></svg>'
);

const roundedCornerResizer =
  sharp()
    .resize(200, 200)
    .composite([{
      input: roundedCorners,
      blend: 'dest-in'
    }])
    .png();

readableStream
  .pipe(roundedCornerResizer)
  .pipe(writableStream);

Test Coverage

Documentation

Visit sharp.pixelplumbing.com for complete installation instructions, API documentation, benchmark tests and changelog.

Contributing

A guide for contributors covers reporting bugs, requesting features and submitting code changes.

Licensing

Copyright 2013, 2014, 2015, 2016, 2017, 2018, 2019 Lovell Fuller and contributors.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

changelog

Changelog

v0.22 - "uptake"

Requires libvips v8.7.4.

v0.22.1 - 25th April 2019

v0.22.0 - 18th March 2019

  • Remove functions previously deprecated in v0.21.0: background, crop, embed, ignoreAspectRatio, max, min and withoutEnlargement.

  • Add composite operation supporting multiple images and blend modes; deprecate overlayWith. #728

  • Add support for pages input option for multi-page input. #1566

  • Allow Stream-based input of raw pixel data. #1579

  • Add support for page input option to GIF and PDF. #1595 @ramiel

v0.21 - "teeth"

Requires libvips v8.7.0.

v0.21.3 - 19th January 2019

  • Input image decoding now fails fast, set failOnError to change this behaviour.

  • Failed filesystem-based input now separates missing file and invalid format errors. #1542

v0.21.2 - 13th January 2019

  • Ensure all metadata is removed from PNG output unless withMetadata used.

  • Ensure shortest edge is at least one pixel after resizing. #1003

  • Add ensureAlpha operation to add an alpha channel, if missing. #1153

  • Expose pages and pageHeight metadata for multi-page input images. #1205

  • Expose PNG output options requiring libimagequant. #1484

  • Expose underlying error message for invalid input. #1505

  • Prevent mutatation of options passed to jpeg. #1516

  • Ensure forced output format applied correctly when output chaining. #1528

v0.21.1 - 7th December 2018

  • Install: support sharp_dist_base_url npm config, like existing SHARP_DIST_BASE_URL. #1422 @SethWen

  • Ensure channel metadata is correct for raw, greyscale output. #1425

  • Add support for the "mitchell" kernel for image reductions. #1438 @Daiz

  • Allow separate parameters for gamma encoding and decoding. #1439 @Daiz

  • Build prototype with Object.assign to allow minification. #1475 @jaubourg

  • Expose libvips' recombination matrix operation. #1477 @fromkeith

  • Expose libvips' pyramid/tile options for TIFF output. #1483 @mbklein

v0.21.0 - 4th October 2018

  • Deprecate the following resize-related functions: crop, embed, ignoreAspectRatio, max, min and withoutEnlargement. Access to these is now via options passed to the resize function. For example: embed('north') is now resize(width, height, { fit: 'contain', position: 'north' }), crop('attention') is now resize(width, height, { fit: 'cover', position: 'attention' }), max().withoutEnlargement() is now resize(width, height, { fit: 'inside', withoutEnlargement: true }). #1135

  • Deprecate the background function. Per-operation background options added to resize, extend and flatten operations. #1392

  • Add size to metadata response (Stream and Buffer input only). #695

  • Switch from custom trim operation to vips_find_trim. #914

  • Add chromaSubsampling and isProgressive properties to metadata response. #1186

  • Drop Node 4 support. #1212

  • Enable SIMD convolution by default. #1213

  • Add experimental prebuilt binaries for musl-based Linux. #1379

  • Add support for arbitrary rotation angle via vips_rotate. #1385 @freezy

v0.20 - "prebuild"

Requires libvips v8.6.1.

v0.20.8 - 5th September 2018

  • Avoid race conditions when creating directories during installation. #1358 @ajhool

  • Accept floating point values for input density parameter. #1362 @aeirola

v0.20.7 - 21st August 2018

  • Use copy+unlink if rename operation fails during installation. #1345

v0.20.6 - 20th August 2018

  • Add removeAlpha operation to remove alpha channel, if any. #1248

  • Expose mozjpeg quant_table flag. #1285 @rexxars

  • Allow full WebP alphaQuality range of 0-100. #1290 @sylvaindumont

  • Cache libvips binaries to reduce re-install time. #1301

  • Ensure vendor platform mismatch throws error at install time. #1303

  • Improve install time error messages for FreeBSD users. #1310

  • Ensure extractChannel works with 16-bit images. #1330

  • Expose depth option for tile-based output. #1342 @alundavies

  • Add experimental entropy field to stats response.

v0.20.5 - 27th June 2018

v0.20.4 - 20th June 2018

  • Prevent possible rounding error when using shrink-on-load and 90/270 degree rotation. #1241 @anahit42

  • Ensure extractChannel sets correct single-channel colour space interpretation. #1257 @jeremychone

v0.20.3 - 29th May 2018

  • Fix tint operation by ensuring LAB interpretation and allowing negative values. #1235 @wezside

v0.20.2 - 28th April 2018

  • Add tint operation to set image chroma. #825 @rikh42

  • Add environment variable to ignore globally-installed libvips. #1165 @oncletom

  • Add support for page selection with multi-page input (GIF/TIFF). #1204 @woolite64

  • Add support for Group4 (CCITTFAX4) compression with TIFF output. #1208 @woolite64

v0.20.1 - 17th March 2018

  • Improve installation experience when a globally-installed libvips below the minimum required version is found. #1148

  • Prevent smartcrop error when cumulative rounding is below target size. #1154 @ralrom

  • Expose libvips' median filter operation. #1161 @BiancoA

v0.20.0 - 5th March 2018

  • Add support for prebuilt sharp binaries on common platforms. #186

v0.19 - "suit"

Requires libvips v8.6.1.

v0.19.1 - 24th February 2018

  • Expose libvips' linear transform feature. #1024 @3epnm

  • Expose angle option for tile-based output. #1121 @BiancoA

  • Prevent crop operation when image already at or below target dimensions. #1134 @pieh

v0.19.0 - 11th January 2018

  • Expose offset coordinates of strategy-based crop. #868 @mirohristov-com

  • PNG output now defaults to adaptiveFiltering=false, compressionLevel=9 #872 @wmertens

  • Add stats feature for pixel-derived image statistics. #915 @rnanwani

  • Add failOnError option to fail-fast on bad input image data. #976 @mceachen

  • Resize: switch to libvips' implementation, make fastShrinkOnLoad optional, remove interpolator and centreSampling options. #977 @jardakotesovec

  • Attach finish event listener to a clone only for Stream-based input. #995 @whmountains

  • Add tilecache before smartcrop to avoid over-computation of previous operations. #1028 @coffeebite

  • Prevent toFile extension taking precedence over requested format. #1037 @tomgallagher

  • Add support for gravity option to existing embed feature. #1038 @AzureByte

  • Expose IPTC and XMP metadata when available. #1079 @oaleynik

  • TIFF output: switch default predictor from 'none' to 'horizontal' to match libvips' behaviour.

v0.18 - "ridge"

Requires libvips v8.5.5.

v0.18.4 - 18th September 2017

  • Ensure input Buffer really is marked as Persistent, prevents mark-sweep GC. #950 @lfdoherty

v0.18.3 - 13th September 2017

v0.18.2 - 1st July 2017

  • Expose libvips' xres and yres properties for TIFF output. #828 @YvesBos

  • Ensure flip and flop operations work with auto-rotate. #837 @rexxars

  • Allow binary download URL override via SHARP_DIST_BASE_URL env variable. #841

  • Add support for Solus Linux. #857 @ekremkaraca

v0.18.1 - 30th May 2017

  • Remove regression from #781 that could cause incorrect shrink calculation. #831 @suprMax

v0.18.0 - 30th May 2017

  • Remove the previously-deprecated output format "option" functions: quality, progressive, compressionLevel, withoutAdaptiveFiltering, withoutChromaSubsampling, trellisQuantisation, trellisQuantization, overshootDeringing, optimiseScans and optimizeScans.

  • Ensure maximum output dimensions are based on the format to be used. #176 @stephanebachelier

  • Avoid costly (un)premultiply when using overlayWith without alpha channel. #573 @strarsis

  • Include pixel depth (e.g. "uchar") when reading metadata. #577 @moedusa

  • Add support for Buffer and Stream-based TIFF output. #587 @strarsis

  • Expose warnings from libvips via NODE_DEBUG=sharp environment variable. #607 @puzrin

  • Switch to the libvips implementation of "attention" and "entropy" crop strategies. #727

  • Improve performance and accuracy of nearest neighbour integral upsampling. #752 @MrIbby

  • Constructor single argument API: allow plain object, reject null/undefined. #768 @kub1x

  • Ensure ARM64 pre-built binaries use correct C++11 ABI version. #772 @ajiratech2

  • Prevent aliasing by using dynamic values for shrink(-on-load). #781 @kleisauke

  • Expose libvips' "squash" parameter to enable 1-bit TIFF output. #783 @YvesBos

  • Add support for rotation using any multiple of +/-90 degrees. #791 @ncoden

  • Add "jpg" alias to toFormat as shortened form of "jpeg". #814 @jingsam

v0.17 - "quill"

Requires libvips v8.4.2.

v0.17.3 - 1st April 2017

  • Allow toBuffer to optionally resolve a Promise with both info and data. #143 @salzhrani

  • Create blank image of given width, height, channels and background. #470 @pjarts

  • Add support for the "nearest" kernel for image reductions. #732 @alice0meta

  • Add support for TIFF compression and predictor options. #738 @kristojorg

v0.17.2 - 11th February 2017

  • Ensure Readable side of Stream can start flowing after Writable side has finished. #671 @danhaller

  • Expose WebP alpha quality, lossless and near-lossless output options. #685 @rnanwani

v0.17.1 - 15th January 2017

  • Improve error messages for invalid parameters. @spikeon #644

  • Simplify expression for finding vips-cpp libdir. #656

  • Allow HTTPS-over-HTTP proxy when downloading pre-compiled dependencies. @wangzhiwei1888 #679

v0.17.0 - 11th December 2016

  • Drop support for versions of Node prior to v4.

  • Deprecate the following output format "option" functions: quality, progressive, compressionLevel, withoutAdaptiveFiltering, withoutChromaSubsampling, trellisQuantisation, trellisQuantization, overshootDeringing, optimiseScans and optimizeScans. Access to these is now via output format functions, for example quality(n) is now jpeg({quality: n}) and/or webp({quality: n}).

  • Autoconvert GIF and SVG input to PNG output if no other format is specified.

  • Expose libvips' "centre" resize option to mimic *magick's +0.5px convention. #568

  • Ensure support for embedded base64 PNG and JPEG images within an SVG. #601 @dynamite-ready

  • Ensure premultiply operation occurs before box filter shrink. #605 @CmdrShepardsPie @teroparvinen

  • Add support for PNG and WebP tile-based output formats (in addition to JPEG). #622 @ppaskaris

  • Allow use of extend with greyscale input. #623 @ppaskaris

  • Allow non-RGB input to embed/extend onto background with an alpha channel. #646 @DaGaMs

v0.16 - "pencil"

Requires libvips v8.3.3

v0.16.2 - 22nd October 2016

  • Restrict readelf usage to Linux only when detecting global libvips version. #602 @caoko

v0.16.1 - 13th October 2016

  • C++11 ABI version is now auto-detected, remove sharp-cxx11 installation flag.

  • Add experimental 'attention' crop strategy. #295

  • Include .node extension for Meteor's require() implementation. #537 @isjackwild

  • Ensure convolution kernel scale is clamped to a minimum value of 1. #561 @abagshaw

  • Correct calculation of y-axis placement when overlaying image at a fixed point. #566 @Nateowami

v0.16.0 - 18th August 2016

  • Add pre-compiled libvips for OS X, ARMv7 and ARMv8. #312

  • Ensure boolean, bandbool, extractChannel ops occur before sRGB conversion. #504 @mhirsch

  • Recalculate factors after WebP shrink-on-load to avoid round-to-zero errors. #508 @asilvas

  • Prevent boolean errors during extract operation. #511 @mhirsch

  • Add joinChannel and toColourspace/toColorspace operations. #513 @mhirsch

  • Add support for raw pixel data with boolean and withOverlay operations. #516 @mhirsch

  • Prevent bandbool creating a single channel sRGB image. #519 @mhirsch

  • Ensure ICC profiles are removed from PNG output unless withMetadata used. #521 @ChrisPinewood

  • Add alpha channels, if missing, to overlayWith images. #540 @cmtt

  • Remove deprecated interpolateWith method - use resize(w, h, { interpolator: ... }) #310

v0.15 - "outfit"

Requires libvips v8.3.1

v0.15.1 - 12th July 2016

  • Concat Stream-based input in single operation for ~+3% perf and less GC. #429 @papandreou

  • Add alpha channel, if required, before extend operation. #439 @frulo

  • Allow overlay image to be repeated across entire image via tile option. #443 @lemnisk8

  • Add cutout option to overlayWith feature, applies only the alpha channel of the overlay image. #448 @kleisauke

  • Ensure scaling factors are calculated independently to prevent rounding errors. #452 @puzrin

  • Add --sharp-cxx11 flag to compile with gcc's new C++11 ABI. #456 @kapouer

  • Add top/left offset support to overlayWith operation. #473 @rnanwani

  • Add convolve operation for kernel-based convolution. #479 @mhirsch

  • Add greyscale option to threshold operation for colourspace conversion control. #480 @mhirsch

  • Ensure ICC profiles are licenced for distribution. #486 @kapouer

  • Allow images with an alpha channel to work with LAB-colourspace based sharpen. #490 @jwagner

  • Add trim operation to remove "boring" edges. #492 @kleisauke

  • Add bandbool feature for channel-wise boolean operations. #496 @mhirsch

  • Add extractChannel operation to extract a channel from an image. #497 @mhirsch

  • Add ability to read and write native libvips .v files. #500 @mhirsch

  • Add boolean feature for bitwise image operations. #501 @mhirsch

v0.15.0 - 21st May 2016

  • Use libvips' new Lanczos 3 kernel as default for image reduction. Deprecate interpolateWith method, now provided as a resize option. #310 @jcupitt

  • Take advantage of libvips v8.3 features. Add support for libvips' new GIF and SVG loaders. Pre-built binaries now include giflib and librsvg, exclude *magick. Use shrink-on-load for WebP input. Break existing sharpen API to accept sigma and improve precision. #369

  • Remove unnecessary (un)premultiply operations when not resizing/compositing. #413 @jardakotesovec

v0.14 - "needle"

Requires libvips v8.2.3

v0.14.1 - 16th April 2016

v0.14.0 - 2nd April 2016

  • Add ability to extend (pad) the edges of an image. #128 @blowsie

  • Add support for Zoomify and Google tile layouts. Breaks existing tile API. #223 @bdunnette

  • Improvements to overlayWith: differing sizes/formats, gravity, buffer input. #239 @chrisriley

  • Add entropy-based crop strategy to remove least interesting edges. #295 @rightaway

  • Expose density metadata; set density of images from vector input. #338 @lookfirst

  • Emit post-processing 'info' event for Stream output. #367 @salzhrani

  • Ensure output image EXIF Orientation values are within 1-8 range. #385 @jtobinisaniceguy

  • Ensure ratios are not swapped when rotating 90/270 and ignoring aspect. #387 @kleisauke

  • Remove deprecated style of calling extract API. Breaks calls using positional arguments. #276

v0.13 - "mind"

Requires libvips v8.2.2

v0.13.1 - 27th February 2016

  • Fix embedding onto transparent backgrounds; regression introduced in v0.13.0. #366 @diegocsandrim

v0.13.0 - 15th February 2016

  • Improve vector image support by allowing control of density/DPI. Switch pre-built libs from Imagemagick to Graphicsmagick. #110 @bradisbell

  • Add support for raw, uncompressed pixel Buffer/Stream input. #220 @mikemorris

  • Switch from libvips' C to C++ bindings, requires upgrade to v8.2.2. #299

  • Control number of open files in libvips' cache; breaks existing cache behaviour. #315 @impomezia

  • Ensure 16-bit input images can be normalised and embedded onto transparent backgrounds. #339 #340 @janaz

  • Ensure selected format takes precedence over any unknown output filename extension. #344 @ubaltaci

  • Add support for libvips' PBM, PGM, PPM and FITS image format loaders. #347 @oaleynik

  • Ensure default crop gravity is center/centre. #351 @joelmukuthu

  • Improve support for musl libc systems e.g. Alpine Linux. #354 #359 @download13 @wjordan

  • Small optimisation when reducing by an integral factor to favour shrink over affine.

  • Add support for gamma correction of images with an alpha channel.

v0.12 - "look"

Requires libvips v8.2.0

v0.12.2 - 16th January 2016

  • Upgrade libvips to v8.2.0 for improved vips_shrink.

  • Add pre-compiled libvips for ARMv6+ CPUs.

  • Ensure 16-bit input images work with embed option. #325 @janaz

  • Allow compilation with gmake to provide FreeBSD support. #326 @c0decafe

  • Attempt to remove temporary file after installation. #331 @dtoubelis

v0.12.1 - 12th December 2015

  • Allow use of SIMD vector instructions (via liborc) to be toggled on/off. #172 @bkw @puzrin

  • Ensure embedded ICC profiles output with perceptual intent. #321 @vlapo

  • Use the NPM-configured HTTPS proxy, if any, for binary downloads.

v0.12.0 - 23rd November 2015

  • Bundle pre-compiled libvips and its dependencies for 64-bit Linux and Windows. #42

  • Take advantage of libvips v8.1.0+ features. #152

  • Add support for 64-bit Windows. Drop support for 32-bit Windows. #224 @sabrehagen

  • Switch default interpolator to bicubic. #289 @mahnunchik

  • Pre-extract rotatation should not swap width/height. #296 @asilvas

  • Ensure 16-bit+alpha input images are (un)premultiplied correctly. #301 @izaakschroeder

  • Add threshold operation. #303 @dacarley

  • Add negate operation. #306 @dacarley

  • Support options Object with existing extract operation. #309 @papandreou

v0.11 - "knife"

v0.11.4 - 5th November 2015

  • Add corners, e.g. northeast, to existing gravity option. #291 @brandonaaron

  • Ensure correct auto-rotation for EXIF Orientation values 2 and 4. #288 @brandonaaron

  • Make static linking possible via --runtime_link install option. #287 @vlapo

v0.11.3 - 8th September 2015

  • Intrepret blurSigma, sharpenFlat, and sharpenJagged as double precision. #263 @chrisriley

v0.11.2 - 28th August 2015

  • Allow crop gravity to be provided as a String. #255 @papandreou
  • Add support for io.js v3 and Node v4. #246

v0.11.1 - 12th August 2015

  • Silence MSVC warning: "C4530: C++ exception handler used, but unwind semantics are not enabled". #244 @TheThing

  • Suppress gamma correction for input image with alpha transparency. #249 @compeak

v0.11.0 - 15th July 2015

  • Allow alpha transparency compositing via new overlayWith method. #97 @gasi

  • Expose raw ICC profile data as a Buffer when using metadata. #129 @homerjam

  • Allow image header updates via a parameter passed to existing withMetadata method. Provide initial support for EXIF Orientation tag, which if present is now removed when using rotate, flip or flop. #189 @h2non

  • Tighten constructor parameter checks. #221 @mikemorris

  • Allow one input Stream to be shared with two or more output Streams via new clone method. #235 @jaubourg

  • Use round instead of floor when auto-scaling dimensions to avoid floating-point rounding errors. #238 @richardadjogah

v0.10 - "judgment"

v0.10.1 - 1st June 2015

  • Allow embed of image with alpha transparency onto non-transparent background. #204 @mikemliu

  • Include C standard library for atoi as Xcode 6.3 appears to no longer do this. #228 @doggan

v0.10.0 - 23rd April 2015