mirror of
https://github.com/lovell/sharp.git
synced 2025-07-09 10:30:15 +02:00
Add named 'alpha' channel to extractChannel op #2138
This commit is contained in:
parent
7f142bddb3
commit
17ea70a102
@ -42,7 +42,7 @@ Extract a single channel from a multi-channel image.
|
|||||||
|
|
||||||
### Parameters
|
### Parameters
|
||||||
|
|
||||||
- `channel` **([number][1] \| [string][2])** zero-indexed band number to extract, or `red`, `green` or `blue` as alternative to `0`, `1` or `2` respectively.
|
- `channel` **([number][1] \| [string][2])** zero-indexed channel/band number to extract, or `red`, `green`, `blue` or `alpha`.
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
|
|
||||||
|
@ -18,6 +18,9 @@ Requires libvips v8.9.1
|
|||||||
Expose `levels` metadata for multi-level images.
|
Expose `levels` metadata for multi-level images.
|
||||||
[#2222](https://github.com/lovell/sharp/issues/2222)
|
[#2222](https://github.com/lovell/sharp/issues/2222)
|
||||||
|
|
||||||
|
* Add support for named `alpha` channel to `extractChannel` operation.
|
||||||
|
[#2138](https://github.com/lovell/sharp/issues/2138)
|
||||||
|
|
||||||
### v0.25.3 - 17th May 2020
|
### v0.25.3 - 17th May 2020
|
||||||
|
|
||||||
* Ensure libvips is initialised only once, improves worker thread safety.
|
* Ensure libvips is initialised only once, improves worker thread safety.
|
||||||
|
@ -60,22 +60,19 @@ function ensureAlpha () {
|
|||||||
* // green.jpg is a greyscale image containing the green channel of the input
|
* // green.jpg is a greyscale image containing the green channel of the input
|
||||||
* });
|
* });
|
||||||
*
|
*
|
||||||
* @param {number|string} channel - zero-indexed band number to extract, or `red`, `green` or `blue` as alternative to `0`, `1` or `2` respectively.
|
* @param {number|string} channel - zero-indexed channel/band number to extract, or `red`, `green`, `blue` or `alpha`.
|
||||||
* @returns {Sharp}
|
* @returns {Sharp}
|
||||||
* @throws {Error} Invalid channel
|
* @throws {Error} Invalid channel
|
||||||
*/
|
*/
|
||||||
function extractChannel (channel) {
|
function extractChannel (channel) {
|
||||||
if (channel === 'red') {
|
const channelMap = { red: 0, green: 1, blue: 2, alpha: 3 };
|
||||||
channel = 0;
|
if (Object.keys(channelMap).includes(channel)) {
|
||||||
} else if (channel === 'green') {
|
channel = channelMap[channel];
|
||||||
channel = 1;
|
|
||||||
} else if (channel === 'blue') {
|
|
||||||
channel = 2;
|
|
||||||
}
|
}
|
||||||
if (is.integer(channel) && is.inRange(channel, 0, 4)) {
|
if (is.integer(channel) && is.inRange(channel, 0, 4)) {
|
||||||
this.options.extractChannel = channel;
|
this.options.extractChannel = channel;
|
||||||
} else {
|
} else {
|
||||||
throw is.invalidParameterError('channel', 'integer or one of: red, green, blue', channel);
|
throw is.invalidParameterError('channel', 'integer or one of: red, green, blue, alpha', channel);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -645,8 +645,12 @@ class PipelineWorker : public Napi::AsyncWorker {
|
|||||||
// Extract an image channel (aka vips band)
|
// Extract an image channel (aka vips band)
|
||||||
if (baton->extractChannel > -1) {
|
if (baton->extractChannel > -1) {
|
||||||
if (baton->extractChannel >= image.bands()) {
|
if (baton->extractChannel >= image.bands()) {
|
||||||
(baton->err).append("Cannot extract channel from image. Too few channels in image.");
|
if (baton->extractChannel == 3 && sharp::HasAlpha(image)) {
|
||||||
return Error();
|
baton->extractChannel = image.bands() - 1;
|
||||||
|
} else {
|
||||||
|
(baton->err).append("Cannot extract channel from image. Too few channels in image.");
|
||||||
|
return Error();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
VipsInterpretation const interpretation = sharp::Is16Bit(image.interpretation())
|
VipsInterpretation const interpretation = sharp::Is16Bit(image.interpretation())
|
||||||
? VIPS_INTERPRETATION_GREY16
|
? VIPS_INTERPRETATION_GREY16
|
||||||
|
BIN
test/fixtures/expected/extract-alpha-2-channel.png
vendored
Normal file
BIN
test/fixtures/expected/extract-alpha-2-channel.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.6 KiB |
@ -80,6 +80,19 @@ describe('Image channel extraction', function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('Alpha from 2-channel input', function (done) {
|
||||||
|
const output = fixtures.path('output.extract-alpha-2-channel.png');
|
||||||
|
sharp(fixtures.inputPngWithGreyAlpha)
|
||||||
|
.extractChannel('alpha')
|
||||||
|
.toColourspace('b-w')
|
||||||
|
.toFile(output, function (err, info) {
|
||||||
|
if (err) throw err;
|
||||||
|
assert.strictEqual(1, info.channels);
|
||||||
|
fixtures.assertMaxColourDistance(output, fixtures.expected('extract-alpha-2-channel.png'));
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('Invalid channel number', function () {
|
it('Invalid channel number', function () {
|
||||||
assert.throws(function () {
|
assert.throws(function () {
|
||||||
sharp(fixtures.inputJpg)
|
sharp(fixtures.inputJpg)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user