sharp icon indicating copy to clipboard operation
sharp copied to clipboard

Trim after extract fail: extract_area: bad extract area

Open jpbecotte opened this issue 5 years ago • 2 comments

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

jpbecotte avatar Feb 26 '20 16:02 jpbecotte

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');

lovell avatar Feb 28 '20 09:02 lovell

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.

mubaidr avatar Oct 03 '20 16:10 mubaidr