Trim after extract fail: extract_area: bad extract area
What is the output of running npx envinfo --binaries --languages --system --utilities?
OS: macOS 10.15.1
CPU: (4) x64 Intel(R) Core(TM) i5-5250U CPU @ 1.60GHz
Memory: 153.41 MB / 8.00 GB
Shell: 5.7.1 - /bin/zsh
Binaries:
Node: 12.10.0 - /usr/local/bin/node
Yarn: 1.17.3 - /usr/local/bin/yarn
npm: 6.11.3 - /usr/local/bin/npm
Utilities:
Make: 3.81 - /usr/bin/make
GCC: 4.2.1 - /usr/bin/gcc
Git: 2.21.0 - /usr/bin/git
Clang: 1100.0.33.12 - /usr/bin/clang
Subversion: 1.10.4 - /usr/bin/svn
Languages:
Bash: 3.2.57 - /bin/bash
Elixir: 1.9.4 - /usr/local/bin/elixir
Java: 1.8.0_202 - /usr/bin/javac
Perl: 5.18.4 - /usr/bin/perl
PHP: 7.3.7 - /usr/local/bin/php
Python: 2.7.16 - /usr/bin/python
Python3: 3.7.6 - /usr/local/bin/python3
Ruby: 2.6.3 - /usr/bin/ruby
What are the steps to reproduce? Use this code:
const sharp = require('sharp');
const imageStr = ',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';
async function process() {
let image = await sharp(new Buffer(imageStr, 'base64'))
.extract({ left: 49, top: 19, width: 13, height: 20 })
.trim() // Try to comment this line!
.png()
.toFile('/tmp/image.jpg');
}
process()
.then(() => console.log('ok'))
.catch((err) => console.log(err));
What is the expected behaviour?
.trim() should trim the bottom part of the extracted image. Right now, exception extract_area: bad extract area is thrown. If you comment the trim line, the char is extracted accordingly but the bottom part is not trimmed.
Are you able to provide a standalone code sample, without other dependencies, that demonstrates this problem? See above
Are you able to provide a sample image that helps explain the problem? See above
Hi, this is a bit of an edge case, and to deal with it will require some refactoring of the way extract works. For now you can split this into two pipelines, something like:
const extracted = await sharp(input)
.extract({ left: 49, top: 19, width: 13, height: 20 })
.toBuffer();
await sharp(extracted)
.trim()
.toFile('/tmp/image.jpg');
I can confirm this. Chaining trim with extract fails for me too (without any error, just the trim is not performed). Using two pipelines works fine as suggested above.