Sharp: Trim after extract fail: extract_area: bad extract area

Created on 26 Feb 2020  路  2Comments  路  Source: lovell/sharp

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

enhancement

All 2 comments

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.

Was this page helpful?
0 / 5 - 0 ratings