cwebp
Version:
node.js wrapper for cwebp and dwebp binaries from WebP image processing utility
287 lines (197 loc) • 7.3 kB
Markdown
[<img src="https://developers.google.com/speed/webp/images/webplogo.png" alt="WebP logo" align="right" />][webp]
[webp]: https://developers.google.com/speed/webp/
[![Build Status][travis_icon]][travis]
[![Dependency Status][david_icon]][david]
[travis_icon]: https://travis-ci.org/Intervox/node-webp.png?branch=latest
[david_icon]: https://david-dm.org/Intervox/node-webp.png
[travis]: https://travis-ci.org/Intervox/node-webp
[david]: https://david-dm.org/Intervox/node-webp
node-webp
=========
Node.js wrapper for [cwebp][cwebp] and [dwebp][dwebp] binaries
from [WebP][webp] image processing utility.
[cwebp]: https://developers.google.com/speed/webp/docs/cwebp
[dwebp]: https://developers.google.com/speed/webp/docs/dwebp
## Installation
npm install cwebp
### Getting latest version of [WebP][webp]
You can get latest WebP source, pre-compiled binaries and installation instructions
from its [official website][get_webp.1], or from its [downloads repository][get_webp.2].
Linux users may use [this installation script][get_webp.3]
to automatically download and install latest WebP binaries:
curl -s https://raw.githubusercontent.com/Intervox/node-webp/latest/bin/install_webp | sudo bash
MacOS users may install WebP using [MacPorts][macports]:
sudo port selfupdate
sudo port install webp
If none of it suit your needs, you may [build the WebP utilities yourself][get_webp.5].
### Alternative ways to install [WebP][webp]
MacOS users may install webp `0.4.0` using [homebrew][homebrew]:
brew install webp
You may also [install webp `0.3.x` as npm module][get_webp.4]:
npm install webp
### Important: Using old WebP versions
Old versions of WebP (prior to `0.4.1`)
are not compatible with the latest `node-webp` version.
If you're using old version of WebP, please,
use [node-webp `0.1.x`][v0.1.10].
Check [this section][working-with-streams] for more info about
new streaming features of the latest WebP version.
[get_webp.1]: https://developers.google.com/speed/webp/download
[get_webp.2]: http://downloads.webmproject.org/releases/webp/index.html
[get_webp.3]: https://raw.githubusercontent.com/Intervox/node-webp/latest/bin/install_webp
[get_webp.4]: https://www.npmjs.org/package/webp
[get_webp.5]: https://developers.google.com/speed/webp/docs/compiling
[macports]: http://guide.macports.org/
[homebrew]: http://brew.sh/
[working-with-streams]: #working-with-streams
[v0.1.10]: https://github.com/Intervox/node-webp/tree/v0.1.10
## Usage
```js
var CWebp = require('cwebp').CWebp;
var DWebp = require('dwebp').DWebp;
var encoder = new CWebp(source_image);
var decoder = new DWebp(source_webp);
```
or
```js
// new is optional
var encoder = CWebp(source_image);
var decoder = DWebp(source_webp);
```
or
```js
// Backward-compatibility with cwebp@0.1.x
var CWebp = require('cwebp');
```
### Specifying path to cwebp binary
By default `node-webp` looks for `cwebp` and `dwebp` binary in your `$PATH`.
#### Specifying path as a constructor option
```js
var Webp = require('cwebp');
var binPath = require('webp').cwebp;
var webp = new Webp(source, binPath);
```
#### Changing default behaviour
```js
var CWebp = require('cwebp').CWebp;
CWebp.bin = require('webp').cwebp;
var encoder = new CWebp(source);
```
```js
var DWebp = require('cwebp').DWebp;
DWebp.bin = require('webp').dwebp;
var decoder = new DWebp(source);
```
**N.B.:** `webp` npm module provide old `webp 0.3.x` binaries.
### Available source types
When source is a string `node-webp` treats it as a file path.
```js
var CWebp = require('cwebp').CWebp;
var DWebp = require('dwebp').DWebp;
var encoder = new CWebp('original.jpeg');
var decoder = new DWebp('converted.webp');
```
It also accepts Buffers and Streams.
```js
var encoder = new CWebp(buffer);
```
```js
var decoder = new DWebp(stream);
```
Note that `node-webp` will start listening to the data in a source stream
only when `.write()`, `.stream()` or `.toBuffer()` is called.
### Encoding and decodind WebP images
```js
encoder.write('image.webp', function(err) {
console.log(err || 'encoded successfully');
});
```
```js
decoder.write('image.png', function(err) {
console.log(err || 'decoded successfully');
});
```
#### Getting output image as a Buffer
```js
decoder.toBuffer(function(err, buffer) {
// ...
});
```
#### Getting output image as a readable Stream
```js
var stream = encoder.stream();
stream.pipe(destination);
stream.on('error', function(err) {
// something bad happened
});
```
### Working with Streams
Different versions of WebP have different level of streaming support:
| Feature | Older WebP versions | WebP 0.4.1 | node-webp@0.1.x | node-webp@1.x |
| ---------------------- | ------------------- | ------------ | --------------- | ----------------- |
| cwebp stdin streaming | **_no_** | **_no_** | **_mock_** | **_mock_** |
| cwebp stdout streaming | **_no_** | **_native_** | **_mock_** | **_native_** |
| dwebp stdin streaming | **_no_** | **_native_** | **_mock_** | **_native_** |
| dwebp stdout streaming | **_no_** | **_native_** | **_mock_** | **_native_** |
**_mock_** means that `node-webp` acts as if the feature is supported,
mocking it using temporary files.
So, converting Stream into a Buffer with node-webp `0.x` will cause
two temporary files to be created and then removed
(one to store input stream, and another to read output buffer from).
Note that `node-webp` **_native_** streaming will work only
if your WebP version have **_native_** support for the corresponding stream,
while **_mock_** streaming will work with any version of WebP.
**IMPORTANT:** If you're using old version of WebP, please,
use [node-webp `0.1.x`][v0.1.10].
### Using promises
`node-webp` supports A+ promises.
```js
encoder.write('image.webp').then(function() {
// ...
});
```
```js
encoder.toBuffer().then(function(buffer) {
// ...
});
```
```js
decoder.stream().then(function(stream) {
// ...
});
```
`node-webp` uses [when.js][when] library.
[when]: https://github.com/cujojs/when
### Specifying conversion options
`node-webp` provides helper functions for most of `cwebp` and `dwebp` conversion options.
For the full list of available helpers see [methods.json][methods] file.
```js
encoder.quality(60);
decoder.tiff();
```
[methods]: https://github.com/Intervox/node-webp/blob/latest/src/methods.json
#### Sending raw command
```js
encoder.command('-d', 'dump.pgm');
```
#### Verbose errors reporting
`node-webp` returns any error reported by `cwebp` or `dwebp`.
By default it uses standard error reporting mode,
but it's possible to enable `cwebp` verbose error reporting.
```js
var CWebp = require('cwebp').CWebp;
new CWebp(source).verbose().toBuffer(function (err, res) {
// err.message contains verbose error
});
```
`dwebp` don't support verbose error reporting.
#### Changing default behaviour
```js
var CWebp = require('cwebp').CWebp;
CWebp.verbose = true;
new CWebp(source).toBuffer(function (err, res) {
// err.message contains verbose error
});
```
## [Changelog][history]
[history]: https://github.com/Intervox/node-webp/blob/latest/History.md