mirror of
https://github.com/lovell/sharp.git
synced 2025-07-09 18:40:16 +02:00
150 lines
4.4 KiB
JavaScript
150 lines
4.4 KiB
JavaScript
'use strict';
|
|
|
|
const is = require('./is');
|
|
|
|
/**
|
|
* Boolean operations for bandbool.
|
|
* @private
|
|
*/
|
|
const bool = {
|
|
and: 'and',
|
|
or: 'or',
|
|
eor: 'eor'
|
|
};
|
|
|
|
/**
|
|
* Remove alpha channel, if any. This is a no-op if the image does not have an alpha channel.
|
|
*
|
|
* @example
|
|
* sharp('rgba.png')
|
|
* .removeAlpha()
|
|
* .toFile('rgb.png', function(err, info) {
|
|
* // rgb.png is a 3 channel image without an alpha channel
|
|
* });
|
|
*
|
|
* @returns {Sharp}
|
|
*/
|
|
function removeAlpha () {
|
|
this.options.removeAlpha = true;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Ensure alpha channel, if missing. The added alpha channel will be fully opaque. This is a no-op if the image already has an alpha channel.
|
|
*
|
|
* @since 0.21.2
|
|
*
|
|
* @example
|
|
* sharp('rgb.jpg')
|
|
* .ensureAlpha()
|
|
* .toFile('rgba.png', function(err, info) {
|
|
* // rgba.png is a 4 channel image with a fully opaque alpha channel
|
|
* });
|
|
*
|
|
* @returns {Sharp}
|
|
*/
|
|
function ensureAlpha () {
|
|
this.options.ensureAlpha = true;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Extract a single channel from a multi-channel image.
|
|
*
|
|
* @example
|
|
* sharp(input)
|
|
* .extractChannel('green')
|
|
* .toFile('input_green.jpg', function(err, info) {
|
|
* // info.channels === 1
|
|
* // input_green.jpg contains the green channel of the input image
|
|
* });
|
|
*
|
|
* @param {Number|String} channel - zero-indexed band number to extract, or `red`, `green` or `blue` as alternative to `0`, `1` or `2` respectively.
|
|
* @returns {Sharp}
|
|
* @throws {Error} Invalid channel
|
|
*/
|
|
function extractChannel (channel) {
|
|
if (channel === 'red') {
|
|
channel = 0;
|
|
} else if (channel === 'green') {
|
|
channel = 1;
|
|
} else if (channel === 'blue') {
|
|
channel = 2;
|
|
}
|
|
if (is.integer(channel) && is.inRange(channel, 0, 4)) {
|
|
this.options.extractChannel = channel;
|
|
} else {
|
|
throw is.invalidParameterError('channel', 'integer or one of: red, green, blue', channel);
|
|
}
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Join one or more channels to the image.
|
|
* The meaning of the added channels depends on the output colourspace, set with `toColourspace()`.
|
|
* By default the output image will be web-friendly sRGB, with additional channels interpreted as alpha channels.
|
|
* Channel ordering follows vips convention:
|
|
* - sRGB: 0: Red, 1: Green, 2: Blue, 3: Alpha.
|
|
* - CMYK: 0: Magenta, 1: Cyan, 2: Yellow, 3: Black, 4: Alpha.
|
|
*
|
|
* Buffers may be any of the image formats supported by sharp: JPEG, PNG, WebP, GIF, SVG, TIFF or raw pixel image data.
|
|
* For raw pixel input, the `options` object should contain a `raw` attribute, which follows the format of the attribute of the same name in the `sharp()` constructor.
|
|
*
|
|
* @param {Array<String|Buffer>|String|Buffer} images - one or more images (file paths, Buffers).
|
|
* @param {Object} options - image options, see `sharp()` constructor.
|
|
* @returns {Sharp}
|
|
* @throws {Error} Invalid parameters
|
|
*/
|
|
function joinChannel (images, options) {
|
|
if (Array.isArray(images)) {
|
|
images.forEach(function (image) {
|
|
this.options.joinChannelIn.push(this._createInputDescriptor(image, options));
|
|
}, this);
|
|
} else {
|
|
this.options.joinChannelIn.push(this._createInputDescriptor(images, options));
|
|
}
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Perform a bitwise boolean operation on all input image channels (bands) to produce a single channel output image.
|
|
*
|
|
* @example
|
|
* sharp('3-channel-rgb-input.png')
|
|
* .bandbool(sharp.bool.and)
|
|
* .toFile('1-channel-output.png', function (err, info) {
|
|
* // The output will be a single channel image where each pixel `P = R & G & B`.
|
|
* // If `I(1,1) = [247, 170, 14] = [0b11110111, 0b10101010, 0b00001111]`
|
|
* // then `O(1,1) = 0b11110111 & 0b10101010 & 0b00001111 = 0b00000010 = 2`.
|
|
* });
|
|
*
|
|
* @param {String} boolOp - one of `and`, `or` or `eor` to perform that bitwise operation, like the C logic operators `&`, `|` and `^` respectively.
|
|
* @returns {Sharp}
|
|
* @throws {Error} Invalid parameters
|
|
*/
|
|
function bandbool (boolOp) {
|
|
if (is.string(boolOp) && is.inArray(boolOp, ['and', 'or', 'eor'])) {
|
|
this.options.bandBoolOp = boolOp;
|
|
} else {
|
|
throw is.invalidParameterError('boolOp', 'one of: and, or, eor', boolOp);
|
|
}
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Decorate the Sharp prototype with channel-related functions.
|
|
* @private
|
|
*/
|
|
module.exports = function (Sharp) {
|
|
Object.assign(Sharp.prototype, {
|
|
// Public instance functions
|
|
removeAlpha,
|
|
ensureAlpha,
|
|
extractChannel,
|
|
joinChannel,
|
|
bandbool
|
|
});
|
|
// Class attributes
|
|
Sharp.bool = bool;
|
|
};
|