mirror of
https://github.com/lovell/sharp.git
synced 2026-02-04 21:56:18 +01:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8bd8709f2b | ||
|
|
e82a585cec | ||
|
|
c1d4a68558 | ||
|
|
eff36dc09f | ||
|
|
031a58f817 | ||
|
|
cf39fc4fb1 | ||
|
|
c9bff94e17 | ||
|
|
e78e919925 | ||
|
|
76bb25262e | ||
|
|
d8426b1ed5 | ||
|
|
4894c10dd9 | ||
|
|
24285bb0e0 | ||
|
|
bf75501262 | ||
|
|
9e214a17f0 | ||
|
|
0aae1ecd9b |
2
.github/ISSUE_TEMPLATE/installation.md
vendored
2
.github/ISSUE_TEMPLATE/installation.md
vendored
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: Installation
|
name: Installation
|
||||||
about: Something went wrong **installing** sharp
|
about: Something went wrong during either 'npm install sharp' or 'require("sharp")'
|
||||||
labels: installation
|
labels: installation
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/possible-bug.md
vendored
2
.github/ISSUE_TEMPLATE/possible-bug.md
vendored
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: Possible bug
|
name: Possible bug
|
||||||
about: Something unexpected occurred **using** sharp
|
about: Installation of sharp was successful but then something unexpected occurred using one of its features
|
||||||
labels: triage
|
labels: triage
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
128
.travis.yml
128
.travis.yml
@@ -1,75 +1,137 @@
|
|||||||
matrix:
|
jobs:
|
||||||
include:
|
include:
|
||||||
- name: "Linux (glibc 2.17+) - Node.js 10"
|
- name: "Linux x64 (CentOS 7, glibc 2.17) - Node.js 10"
|
||||||
os: linux
|
|
||||||
dist: xenial
|
|
||||||
language: node_js
|
|
||||||
node_js: "10"
|
|
||||||
- name: "Linux (glibc 2.17+) - Node.js 12"
|
|
||||||
os: linux
|
|
||||||
dist: xenial
|
|
||||||
language: node_js
|
|
||||||
node_js: "12"
|
|
||||||
- name: "Linux (glibc 2.17+) - Node.js 13"
|
|
||||||
os: linux
|
|
||||||
dist: xenial
|
|
||||||
language: node_js
|
|
||||||
node_js: "13"
|
|
||||||
after_success:
|
|
||||||
- npm install coveralls
|
|
||||||
- cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js
|
|
||||||
- name: "Linux (musl 1.1.20+) - Node.js 10"
|
|
||||||
os: linux
|
os: linux
|
||||||
dist: bionic
|
dist: bionic
|
||||||
language: minimal
|
language: shell
|
||||||
|
before_install:
|
||||||
|
- sudo docker run -dit --name sharp --env CI --env PREBUILD_TOKEN --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp centos:7
|
||||||
|
- sudo docker exec sharp bash -c "curl -sL https://rpm.nodesource.com/setup_10.x | bash -"
|
||||||
|
- sudo docker exec sharp yum install -y gcc-c++ make git nodejs
|
||||||
|
install: sudo docker exec sharp bash -c "npm install --unsafe-perm"
|
||||||
|
script: sudo docker exec sharp bash -c "npm test"
|
||||||
|
|
||||||
|
- name: "Linux x64 (CentOS 7, glibc 2.17) - Node.js 12"
|
||||||
|
os: linux
|
||||||
|
dist: bionic
|
||||||
|
language: shell
|
||||||
|
before_install:
|
||||||
|
- sudo docker run -dit --name sharp --env CI --env PREBUILD_TOKEN --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp centos:7
|
||||||
|
- sudo docker exec sharp bash -c "curl -sL https://rpm.nodesource.com/setup_12.x | bash -"
|
||||||
|
- sudo docker exec sharp yum install -y gcc-c++ make git nodejs
|
||||||
|
install: sudo docker exec sharp bash -c "npm install --unsafe-perm"
|
||||||
|
script: sudo docker exec sharp bash -c "npm test"
|
||||||
|
|
||||||
|
- name: "Linux x64 (CentOS 7, glibc 2.17) - Node.js 13"
|
||||||
|
os: linux
|
||||||
|
dist: bionic
|
||||||
|
language: shell
|
||||||
|
before_install:
|
||||||
|
- sudo docker run -dit --name sharp --env CI --env PREBUILD_TOKEN --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp centos:7
|
||||||
|
- sudo docker exec sharp bash -c "curl -sL https://rpm.nodesource.com/setup_13.x | bash -"
|
||||||
|
- sudo docker exec sharp yum install -y gcc-c++ make git nodejs
|
||||||
|
install: sudo docker exec sharp bash -c "npm install --unsafe-perm"
|
||||||
|
script: sudo docker exec sharp bash -c "npm test"
|
||||||
|
|
||||||
|
- name: "Linux x64 (Alpine 3.9, musl 1.1.20) - Node.js 10"
|
||||||
|
os: linux
|
||||||
|
dist: bionic
|
||||||
|
language: shell
|
||||||
before_install:
|
before_install:
|
||||||
- sudo docker run -dit --name sharp --env CI --env PREBUILD_TOKEN --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp node:10.17.0-alpine3.9 # https://github.com/nodejs/docker-node/issues/1158
|
- sudo docker run -dit --name sharp --env CI --env PREBUILD_TOKEN --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp node:10.17.0-alpine3.9 # https://github.com/nodejs/docker-node/issues/1158
|
||||||
- sudo docker exec sharp apk add build-base git python2 --update-cache
|
- sudo docker exec sharp apk add build-base git python2 --update-cache
|
||||||
install: sudo docker exec sharp sh -c "npm install --unsafe-perm"
|
install: sudo docker exec sharp sh -c "npm install --unsafe-perm"
|
||||||
script: sudo docker exec sharp sh -c "npm test"
|
script: sudo docker exec sharp sh -c "npm test"
|
||||||
- name: "Linux (musl 1.1.20+) - Node.js 12"
|
|
||||||
|
- name: "Linux x64 (Alpine 3.11, musl 1.1.20) - Node.js 12"
|
||||||
os: linux
|
os: linux
|
||||||
dist: bionic
|
dist: bionic
|
||||||
language: minimal
|
language: shell
|
||||||
before_install:
|
before_install:
|
||||||
- sudo docker run -dit --name sharp --env CI --env PREBUILD_TOKEN --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp node:12.0-alpine
|
- sudo docker run -dit --name sharp --env CI --env PREBUILD_TOKEN --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp node:12.0-alpine
|
||||||
- sudo docker exec sharp apk add build-base git python2 --update-cache
|
- sudo docker exec sharp apk add build-base git python2 --update-cache
|
||||||
install: sudo docker exec sharp sh -c "npm install --unsafe-perm"
|
install: sudo docker exec sharp sh -c "npm install --unsafe-perm"
|
||||||
script: sudo docker exec sharp sh -c "npm test"
|
script: sudo docker exec sharp sh -c "npm test"
|
||||||
- name: "Linux (musl 1.1.20+) - Node.js 13"
|
|
||||||
|
- name: "Linux x64 (Alpine 3.11, musl 1.1.20) - Node.js 13"
|
||||||
os: linux
|
os: linux
|
||||||
dist: bionic
|
dist: bionic
|
||||||
language: minimal
|
language: shell
|
||||||
before_install:
|
before_install:
|
||||||
- sudo docker run -dit --name sharp --env CI --env PREBUILD_TOKEN --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp node:13.0-alpine
|
- sudo docker run -dit --name sharp --env CI --env PREBUILD_TOKEN --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp node:13.0-alpine
|
||||||
- sudo docker exec sharp apk add build-base git python2 --update-cache
|
- sudo docker exec sharp apk add build-base git python2 --update-cache
|
||||||
install: sudo docker exec sharp sh -c "npm install --unsafe-perm"
|
install: sudo docker exec sharp sh -c "npm install --unsafe-perm"
|
||||||
script: sudo docker exec sharp sh -c "npm test"
|
script: sudo docker exec sharp sh -c "npm test"
|
||||||
- name: "Linux ARM64v8 (glibc 2.29+) - Node.js 10"
|
|
||||||
|
- name: "Linux ARM64v8 (Debian 11, glibc 2.29) - Node.js 10"
|
||||||
arch: arm64
|
arch: arm64
|
||||||
os: linux
|
os: linux
|
||||||
dist: bionic
|
dist: bionic
|
||||||
language: minimal
|
language: shell
|
||||||
before_install:
|
before_install:
|
||||||
- sudo docker run -dit --name sharp --env CI --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp arm64v8/debian:bullseye
|
- sudo docker run -dit --name sharp --env CI --env PREBUILD_TOKEN --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp arm64v8/debian:bullseye
|
||||||
- sudo docker exec sharp apt-get update
|
- sudo docker exec sharp sh -c "apt-get update && apt-get install -y build-essential git python2 curl"
|
||||||
- sudo docker exec sharp apt-get install -y build-essential git python2 nodejs npm
|
- sudo docker exec sharp sh -c "curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -"
|
||||||
|
- sudo docker exec sharp sh -c "echo 'deb https://deb.nodesource.com/node_10.x buster main' >/etc/apt/sources.list.d/nodesource.list"
|
||||||
|
- sudo docker exec sharp sh -c "apt-get update && apt-get install -y nodejs"
|
||||||
install: sudo docker exec sharp sh -c "npm install --unsafe-perm"
|
install: sudo docker exec sharp sh -c "npm install --unsafe-perm"
|
||||||
script: sudo docker exec sharp sh -c "npm test"
|
script: sudo docker exec sharp sh -c "npm test"
|
||||||
- name: "macOS (10.13+) - Node.js 10"
|
|
||||||
|
- name: "Linux ARM64v8 (Debian 11, glibc 2.29) - Node.js 12"
|
||||||
|
arch: arm64
|
||||||
|
os: linux
|
||||||
|
dist: bionic
|
||||||
|
language: shell
|
||||||
|
before_install:
|
||||||
|
- sudo docker run -dit --name sharp --env CI --env PREBUILD_TOKEN --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp arm64v8/debian:bullseye
|
||||||
|
- sudo docker exec sharp sh -c "apt-get update && apt-get install -y build-essential git python2 curl"
|
||||||
|
- sudo docker exec sharp sh -c "curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -"
|
||||||
|
- sudo docker exec sharp sh -c "echo 'deb https://deb.nodesource.com/node_12.x buster main' >/etc/apt/sources.list.d/nodesource.list"
|
||||||
|
- sudo docker exec sharp sh -c "apt-get update && apt-get install -y nodejs"
|
||||||
|
install: sudo docker exec sharp sh -c "npm install --unsafe-perm"
|
||||||
|
script: sudo docker exec sharp sh -c "npm test"
|
||||||
|
|
||||||
|
- name: "Linux ARM64v8 (Debian 11, glibc 2.29) - Node.js 13"
|
||||||
|
arch: arm64
|
||||||
|
os: linux
|
||||||
|
dist: bionic
|
||||||
|
language: shell
|
||||||
|
before_install:
|
||||||
|
- sudo docker run -dit --name sharp --env CI --env PREBUILD_TOKEN --volume "${PWD}:/mnt/sharp" --workdir /mnt/sharp arm64v8/debian:bullseye
|
||||||
|
- sudo docker exec sharp sh -c "apt-get update && apt-get install -y build-essential git python2 curl"
|
||||||
|
- sudo docker exec sharp sh -c "curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -"
|
||||||
|
- sudo docker exec sharp sh -c "echo 'deb https://deb.nodesource.com/node_13.x buster main' >/etc/apt/sources.list.d/nodesource.list"
|
||||||
|
- sudo docker exec sharp sh -c "apt-get update && apt-get install -y nodejs"
|
||||||
|
install: sudo docker exec sharp sh -c "npm install --unsafe-perm"
|
||||||
|
script: sudo docker exec sharp sh -c "npm test"
|
||||||
|
|
||||||
|
- name: "macOS (10.13) - Node.js 10"
|
||||||
os: osx
|
os: osx
|
||||||
osx_image: xcode10.1
|
osx_image: xcode10.1
|
||||||
language: node_js
|
language: node_js
|
||||||
node_js: "10"
|
node_js: "10"
|
||||||
- name: "macOS (10.13+) - Node.js 12"
|
|
||||||
|
- name: "macOS (10.13) - Node.js 12"
|
||||||
os: osx
|
os: osx
|
||||||
osx_image: xcode10.1
|
osx_image: xcode10.1
|
||||||
language: node_js
|
language: node_js
|
||||||
node_js: "12"
|
node_js: "12"
|
||||||
- name: "macOS (10.13+) - Node.js 13"
|
|
||||||
|
- name: "macOS (10.13) - Node.js 13"
|
||||||
os: osx
|
os: osx
|
||||||
osx_image: xcode10.1
|
osx_image: xcode10.1
|
||||||
language: node_js
|
language: node_js
|
||||||
node_js: "13"
|
node_js: "13"
|
||||||
|
|
||||||
|
- name: "Unit test coverage report"
|
||||||
|
os: linux
|
||||||
|
dist: bionic
|
||||||
|
language: node_js
|
||||||
|
node_js: "13"
|
||||||
|
before_install: unset PREBUILD_TOKEN
|
||||||
|
after_success:
|
||||||
|
- npm install coveralls
|
||||||
|
- cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
npm: false
|
npm: false
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ Lanczos resampling ensures quality is not sacrificed for speed.
|
|||||||
As well as image resizing, operations such as
|
As well as image resizing, operations such as
|
||||||
rotation, extraction, compositing and gamma correction are available.
|
rotation, extraction, compositing and gamma correction are available.
|
||||||
|
|
||||||
Most modern macOS, Windows and Linux systems running Node.js v10.16.0+
|
Most modern macOS, Windows and Linux systems running Node.js v10+
|
||||||
do not require any additional install or runtime dependencies.
|
do not require any additional install or runtime dependencies.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|||||||
@@ -47,6 +47,9 @@
|
|||||||
]
|
]
|
||||||
}, {
|
}, {
|
||||||
'target_name': 'sharp',
|
'target_name': 'sharp',
|
||||||
|
'defines': [
|
||||||
|
'NAPI_VERSION=3'
|
||||||
|
],
|
||||||
'dependencies': [
|
'dependencies': [
|
||||||
'<!(node -p "require(\'node-addon-api\').gyp")',
|
'<!(node -p "require(\'node-addon-api\').gyp")',
|
||||||
'libvips-cpp'
|
'libvips-cpp'
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ Lanczos resampling ensures quality is not sacrificed for speed.
|
|||||||
As well as image resizing, operations such as
|
As well as image resizing, operations such as
|
||||||
rotation, extraction, compositing and gamma correction are available.
|
rotation, extraction, compositing and gamma correction are available.
|
||||||
|
|
||||||
Most modern macOS, Windows and Linux systems running Node.js v10.16.0+
|
Most modern macOS, Windows and Linux systems running Node.js v10+
|
||||||
do not require any additional install or runtime dependencies.
|
do not require any additional install or runtime dependencies.
|
||||||
|
|
||||||
### Formats
|
### Formats
|
||||||
|
|||||||
@@ -339,7 +339,7 @@ Warning: multiple sharp instances concurrently producing tile output can expose
|
|||||||
- `options.depth` **[String][2]?** how deep to make the pyramid, possible values are `onepixel`, `onetile` or `one`, default based on layout.
|
- `options.depth` **[String][2]?** how deep to make the pyramid, possible values are `onepixel`, `onetile` or `one`, default based on layout.
|
||||||
- `options.skipBlanks` **[Number][9]** threshold to skip tile generation, a value 0 - 255 for 8-bit images or 0 - 65535 for 16-bit images (optional, default `-1`)
|
- `options.skipBlanks` **[Number][9]** threshold to skip tile generation, a value 0 - 255 for 8-bit images or 0 - 65535 for 16-bit images (optional, default `-1`)
|
||||||
- `options.container` **[String][2]** tile container, with value `fs` (filesystem) or `zip` (compressed file). (optional, default `'fs'`)
|
- `options.container` **[String][2]** tile container, with value `fs` (filesystem) or `zip` (compressed file). (optional, default `'fs'`)
|
||||||
- `options.layout` **[String][2]** filesystem layout, possible values are `dz`, `zoomify` or `google`. (optional, default `'dz'`)
|
- `options.layout` **[String][2]** filesystem layout, possible values are `dz`, `iiif`, `zoomify` or `google`. (optional, default `'dz'`)
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ Resize image to `width`, `height` or `width x height`.
|
|||||||
|
|
||||||
When both a `width` and `height` are provided, the possible methods by which the image should **fit** these are:
|
When both a `width` and `height` are provided, the possible methods by which the image should **fit** these are:
|
||||||
|
|
||||||
- `cover`: Crop to cover both provided dimensions (the default).
|
- `cover`: (default) Preserving aspect ratio, ensure the image covers both provided dimensions by cropping/clipping to fit.
|
||||||
- `contain`: Embed within both provided dimensions.
|
- `contain`: Preserving aspect ratio, contain within both provided dimensions using "letterboxing" where necessary.
|
||||||
- `fill`: Ignore the aspect ratio of the input and stretch to both provided dimensions.
|
- `fill`: Ignore the aspect ratio of the input and stretch to both provided dimensions.
|
||||||
- `inside`: Preserving aspect ratio, resize the image to be as large as possible while ensuring its dimensions are less than or equal to both those specified.
|
- `inside`: Preserving aspect ratio, resize the image to be as large as possible while ensuring its dimensions are less than or equal to both those specified.
|
||||||
- `outside`: Preserving aspect ratio, resize the image to be as small as possible while ensuring its dimensions are greater than or equal to both those specified.
|
- `outside`: Preserving aspect ratio, resize the image to be as small as possible while ensuring its dimensions are greater than or equal to both those specified.
|
||||||
|
|||||||
@@ -4,6 +4,28 @@
|
|||||||
|
|
||||||
Requires libvips v8.9.1
|
Requires libvips v8.9.1
|
||||||
|
|
||||||
|
### v0.25.2 - 20th March 2020
|
||||||
|
|
||||||
|
* Provide prebuilt binaries for Linux ARM64v8.
|
||||||
|
|
||||||
|
* Add IIIF layout support to tile-based output.
|
||||||
|
[#2098](https://github.com/lovell/sharp/pull/2098)
|
||||||
|
[@edsilv](https://github.com/edsilv)
|
||||||
|
|
||||||
|
* Ensure input options are consistently and correctly detected.
|
||||||
|
[#2118](https://github.com/lovell/sharp/issues/2118)
|
||||||
|
|
||||||
|
* Ensure N-API prebuilt binaries work on RHEL7 and its derivatives.
|
||||||
|
[#2119](https://github.com/lovell/sharp/issues/2119)
|
||||||
|
|
||||||
|
* Ensure AsyncWorker options are persisted.
|
||||||
|
[#2130](https://github.com/lovell/sharp/issues/2130)
|
||||||
|
|
||||||
|
### v0.25.1 - 7th March 2020
|
||||||
|
|
||||||
|
* Ensure prebuilt binaries are fetched based on N-API version.
|
||||||
|
[#2117](https://github.com/lovell/sharp/issues/2117)
|
||||||
|
|
||||||
### v0.25.0 - 7th March 2020
|
### v0.25.0 - 7th March 2020
|
||||||
|
|
||||||
* Remove `limitInputPixels` and `sequentialRead` previously deprecated in v0.24.0.
|
* Remove `limitInputPixels` and `sequentialRead` previously deprecated in v0.24.0.
|
||||||
|
|||||||
@@ -176,3 +176,6 @@ GitHub: https://github.com/rustyguts
|
|||||||
|
|
||||||
Name: Brychan Bennett-Odlum
|
Name: Brychan Bennett-Odlum
|
||||||
GitHub: https://github.com/BrychanOdlum
|
GitHub: https://github.com/BrychanOdlum
|
||||||
|
|
||||||
|
Name: Edward Silverton
|
||||||
|
GitHub: https://github.com/edsilv
|
||||||
|
|||||||
@@ -87,7 +87,7 @@
|
|||||||
docuteGoogleAnalytics('UA-13034748-12'),
|
docuteGoogleAnalytics('UA-13034748-12'),
|
||||||
docuteApiTitlePlugin
|
docuteApiTitlePlugin
|
||||||
],
|
],
|
||||||
sourcePath: 'https://cdn.jsdelivr.net/gh/lovell/sharp@v0.25.0/docs',
|
sourcePath: 'https://cdn.jsdelivr.net/gh/lovell/sharp@v0.25.2/docs',
|
||||||
nav: [
|
nav: [
|
||||||
{
|
{
|
||||||
title: 'Funding',
|
title: 'Funding',
|
||||||
|
|||||||
@@ -10,15 +10,16 @@ yarn add sharp
|
|||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
* Node.js v10.16.0+
|
* Node.js v10+
|
||||||
|
|
||||||
## Prebuilt binaries
|
## Prebuilt binaries
|
||||||
|
|
||||||
Ready-compiled sharp and libvips binaries are provided for use with
|
Ready-compiled sharp and libvips binaries are provided for use with
|
||||||
Node.js v10.16.0+ (N-API v4) on the most common platforms:
|
Node.js v10+ on the most common platforms:
|
||||||
|
|
||||||
* macOS x64 (>= 10.13)
|
* macOS x64 (>= 10.13)
|
||||||
* Linux x64 (glibc >= 2.17, musl >= 1.1.24)
|
* Linux x64 (glibc >= 2.17, musl >= 1.1.24)
|
||||||
|
* Linux ARM64 (glibc >= 2.29)
|
||||||
* Windows
|
* Windows
|
||||||
|
|
||||||
A ~10MB tarball containing libvips and its most commonly used dependencies
|
A ~10MB tarball containing libvips and its most commonly used dependencies
|
||||||
@@ -31,7 +32,6 @@ The following platforms have prebuilt libvips but not sharp:
|
|||||||
|
|
||||||
* Linux ARMv6
|
* Linux ARMv6
|
||||||
* Linux ARMv7 (glibc >= 2.28)
|
* Linux ARMv7 (glibc >= 2.28)
|
||||||
* Linux ARM64 (glibc >= 2.29)
|
|
||||||
|
|
||||||
The following platforms require compilation of both libvips and sharp from source:
|
The following platforms require compilation of both libvips and sharp from source:
|
||||||
|
|
||||||
@@ -134,7 +134,7 @@ On machines other than Linux x64, such as macOS and Windows, run the following:
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
rm -rf node_modules/sharp
|
rm -rf node_modules/sharp
|
||||||
npm install --arch=x64 --platform=linux --target=12.0.0 sharp
|
npm install --arch=x64 --platform=linux sharp
|
||||||
```
|
```
|
||||||
|
|
||||||
Alternatively a Docker container closely matching the Lambda runtime can be used:
|
Alternatively a Docker container closely matching the Lambda runtime can be used:
|
||||||
|
|||||||
@@ -100,10 +100,7 @@ function composite (images) {
|
|||||||
if (!is.object(image)) {
|
if (!is.object(image)) {
|
||||||
throw is.invalidParameterError('image to composite', 'object', image);
|
throw is.invalidParameterError('image to composite', 'object', image);
|
||||||
}
|
}
|
||||||
const { raw, density, limitInputPixels, sequentialRead } = image;
|
const inputOptions = this._inputOptionsFromObject(image);
|
||||||
const inputOptions = [raw, density, limitInputPixels, sequentialRead].some(is.defined)
|
|
||||||
? { raw, density, limitInputPixels, sequentialRead }
|
|
||||||
: undefined;
|
|
||||||
const composite = {
|
const composite = {
|
||||||
input: this._createInputDescriptor(image.input, inputOptions, { allowStream: false }),
|
input: this._createInputDescriptor(image.input, inputOptions, { allowStream: false }),
|
||||||
blend: 'over',
|
blend: 'over',
|
||||||
|
|||||||
18
lib/input.js
18
lib/input.js
@@ -4,6 +4,17 @@ const color = require('color');
|
|||||||
const is = require('./is');
|
const is = require('./is');
|
||||||
const sharp = require('../build/Release/sharp.node');
|
const sharp = require('../build/Release/sharp.node');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract input options, if any, from an object.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _inputOptionsFromObject (obj) {
|
||||||
|
const { raw, density, limitInputPixels, sequentialRead, failOnError } = obj;
|
||||||
|
return [raw, density, limitInputPixels, sequentialRead, failOnError].some(is.defined)
|
||||||
|
? { raw, density, limitInputPixels, sequentialRead, failOnError }
|
||||||
|
: undefined;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create Object containing input and input-related options.
|
* Create Object containing input and input-related options.
|
||||||
* @private
|
* @private
|
||||||
@@ -23,12 +34,12 @@ function _createInputDescriptor (input, inputOptions, containerOptions) {
|
|||||||
} else if (is.plainObject(input) && !is.defined(inputOptions)) {
|
} else if (is.plainObject(input) && !is.defined(inputOptions)) {
|
||||||
// Plain Object descriptor, e.g. create
|
// Plain Object descriptor, e.g. create
|
||||||
inputOptions = input;
|
inputOptions = input;
|
||||||
if (is.plainObject(inputOptions.raw) || is.bool(inputOptions.failOnError)) {
|
if (_inputOptionsFromObject(inputOptions)) {
|
||||||
// Raw Stream
|
// Stream with options
|
||||||
inputDescriptor.buffer = [];
|
inputDescriptor.buffer = [];
|
||||||
}
|
}
|
||||||
} else if (!is.defined(input) && !is.defined(inputOptions) && is.object(containerOptions) && containerOptions.allowStream) {
|
} else if (!is.defined(input) && !is.defined(inputOptions) && is.object(containerOptions) && containerOptions.allowStream) {
|
||||||
// Stream
|
// Stream without options
|
||||||
inputDescriptor.buffer = [];
|
inputDescriptor.buffer = [];
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`Unsupported input '${input}' of type ${typeof input}${
|
throw new Error(`Unsupported input '${input}' of type ${typeof input}${
|
||||||
@@ -337,6 +348,7 @@ function stats (callback) {
|
|||||||
module.exports = function (Sharp) {
|
module.exports = function (Sharp) {
|
||||||
Object.assign(Sharp.prototype, {
|
Object.assign(Sharp.prototype, {
|
||||||
// Private
|
// Private
|
||||||
|
_inputOptionsFromObject,
|
||||||
_createInputDescriptor,
|
_createInputDescriptor,
|
||||||
_write,
|
_write,
|
||||||
_flattenBufferIn,
|
_flattenBufferIn,
|
||||||
|
|||||||
@@ -568,7 +568,7 @@ function raw () {
|
|||||||
* @param {String} [options.depth] how deep to make the pyramid, possible values are `onepixel`, `onetile` or `one`, default based on layout.
|
* @param {String} [options.depth] how deep to make the pyramid, possible values are `onepixel`, `onetile` or `one`, default based on layout.
|
||||||
* @param {Number} [options.skipBlanks=-1] threshold to skip tile generation, a value 0 - 255 for 8-bit images or 0 - 65535 for 16-bit images
|
* @param {Number} [options.skipBlanks=-1] threshold to skip tile generation, a value 0 - 255 for 8-bit images or 0 - 65535 for 16-bit images
|
||||||
* @param {String} [options.container='fs'] tile container, with value `fs` (filesystem) or `zip` (compressed file).
|
* @param {String} [options.container='fs'] tile container, with value `fs` (filesystem) or `zip` (compressed file).
|
||||||
* @param {String} [options.layout='dz'] filesystem layout, possible values are `dz`, `zoomify` or `google`.
|
* @param {String} [options.layout='dz'] filesystem layout, possible values are `dz`, `iiif`, `zoomify` or `google`.
|
||||||
* @returns {Sharp}
|
* @returns {Sharp}
|
||||||
* @throws {Error} Invalid parameters
|
* @throws {Error} Invalid parameters
|
||||||
*/
|
*/
|
||||||
@@ -603,10 +603,10 @@ function tile (options) {
|
|||||||
}
|
}
|
||||||
// Layout
|
// Layout
|
||||||
if (is.defined(options.layout)) {
|
if (is.defined(options.layout)) {
|
||||||
if (is.string(options.layout) && is.inArray(options.layout, ['dz', 'google', 'zoomify'])) {
|
if (is.string(options.layout) && is.inArray(options.layout, ['dz', 'google', 'iiif', 'zoomify'])) {
|
||||||
this.options.tileLayout = options.layout;
|
this.options.tileLayout = options.layout;
|
||||||
} else {
|
} else {
|
||||||
throw is.invalidParameterError('layout', 'one of: dz, google, zoomify', options.layout);
|
throw is.invalidParameterError('layout', 'one of: dz, google, iiif, zoomify', options.layout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Angle of rotation,
|
// Angle of rotation,
|
||||||
|
|||||||
@@ -96,8 +96,8 @@ function isRotationExpected (options) {
|
|||||||
* Resize image to `width`, `height` or `width x height`.
|
* Resize image to `width`, `height` or `width x height`.
|
||||||
*
|
*
|
||||||
* When both a `width` and `height` are provided, the possible methods by which the image should **fit** these are:
|
* When both a `width` and `height` are provided, the possible methods by which the image should **fit** these are:
|
||||||
* - `cover`: Crop to cover both provided dimensions (the default).
|
* - `cover`: (default) Preserving aspect ratio, ensure the image covers both provided dimensions by cropping/clipping to fit.
|
||||||
* - `contain`: Embed within both provided dimensions.
|
* - `contain`: Preserving aspect ratio, contain within both provided dimensions using "letterboxing" where necessary.
|
||||||
* - `fill`: Ignore the aspect ratio of the input and stretch to both provided dimensions.
|
* - `fill`: Ignore the aspect ratio of the input and stretch to both provided dimensions.
|
||||||
* - `inside`: Preserving aspect ratio, resize the image to be as large as possible while ensuring its dimensions are less than or equal to both those specified.
|
* - `inside`: Preserving aspect ratio, resize the image to be as large as possible while ensuring its dimensions are less than or equal to both those specified.
|
||||||
* - `outside`: Preserving aspect ratio, resize the image to be as small as possible while ensuring its dimensions are greater than or equal to both those specified.
|
* - `outside`: Preserving aspect ratio, resize the image to be as small as possible while ensuring its dimensions are greater than or equal to both those specified.
|
||||||
|
|||||||
13
package.json
13
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "sharp",
|
"name": "sharp",
|
||||||
"description": "High performance Node.js image processing, the fastest module to resize JPEG, PNG, WebP and TIFF images",
|
"description": "High performance Node.js image processing, the fastest module to resize JPEG, PNG, WebP and TIFF images",
|
||||||
"version": "0.25.0",
|
"version": "0.25.2",
|
||||||
"author": "Lovell Fuller <npm@lovell.info>",
|
"author": "Lovell Fuller <npm@lovell.info>",
|
||||||
"homepage": "https://github.com/lovell/sharp",
|
"homepage": "https://github.com/lovell/sharp",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
@@ -65,10 +65,11 @@
|
|||||||
"Andargor <andargor@yahoo.com>",
|
"Andargor <andargor@yahoo.com>",
|
||||||
"Paul Neave <paul.neave@gmail.com>",
|
"Paul Neave <paul.neave@gmail.com>",
|
||||||
"Brendan Kennedy <brenwken@gmail.com>",
|
"Brendan Kennedy <brenwken@gmail.com>",
|
||||||
"Brychan Bennett-Odlum <git@brychan.io>"
|
"Brychan Bennett-Odlum <git@brychan.io>",
|
||||||
|
"Edward Silverton <e.silverton@gmail.com>"
|
||||||
],
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"install": "(node install/libvips && node install/dll-copy && prebuild-install) || (node-gyp rebuild && node install/dll-copy)",
|
"install": "(node install/libvips && node install/dll-copy && prebuild-install --runtime=napi) || (node-gyp rebuild && node install/dll-copy)",
|
||||||
"clean": "rm -rf node_modules/ build/ vendor/ .nyc_output/ coverage/ test/fixtures/output.*",
|
"clean": "rm -rf node_modules/ build/ vendor/ .nyc_output/ coverage/ test/fixtures/output.*",
|
||||||
"test": "semistandard && cpplint && npm run test-unit && npm run test-licensing && prebuild-ci",
|
"test": "semistandard && cpplint && npm run test-unit && npm run test-licensing && prebuild-ci",
|
||||||
"test-unit": "nyc --reporter=lcov --branches=99 mocha --slow=5000 --timeout=60000 ./test/unit/*.js",
|
"test-unit": "nyc --reporter=lcov --branches=99 mocha --slow=5000 --timeout=60000 ./test/unit/*.js",
|
||||||
@@ -125,7 +126,7 @@
|
|||||||
"exif-reader": "^1.0.3",
|
"exif-reader": "^1.0.3",
|
||||||
"icc": "^1.0.0",
|
"icc": "^1.0.0",
|
||||||
"license-checker": "^25.0.1",
|
"license-checker": "^25.0.1",
|
||||||
"mocha": "^7.1.0",
|
"mocha": "^7.1.1",
|
||||||
"mock-fs": "^4.11.0",
|
"mock-fs": "^4.11.0",
|
||||||
"nyc": "^15.0.0",
|
"nyc": "^15.0.0",
|
||||||
"prebuild": "^10.0.0",
|
"prebuild": "^10.0.0",
|
||||||
@@ -138,14 +139,14 @@
|
|||||||
"libvips": "8.9.1"
|
"libvips": "8.9.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.16.0"
|
"node": ">=10"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://opencollective.com/libvips"
|
"url": "https://opencollective.com/libvips"
|
||||||
},
|
},
|
||||||
"binary": {
|
"binary": {
|
||||||
"napi_versions": [
|
"napi_versions": [
|
||||||
4
|
3
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"semistandard": {
|
"semistandard": {
|
||||||
|
|||||||
@@ -229,6 +229,7 @@ Napi::Value metadata(const Napi::CallbackInfo& info) {
|
|||||||
// Join queue for worker thread
|
// Join queue for worker thread
|
||||||
Napi::Function callback = info[1].As<Napi::Function>();
|
Napi::Function callback = info[1].As<Napi::Function>();
|
||||||
MetadataWorker *worker = new MetadataWorker(callback, baton, debuglog);
|
MetadataWorker *worker = new MetadataWorker(callback, baton, debuglog);
|
||||||
|
worker->Receiver().Set("options", options);
|
||||||
worker->Queue();
|
worker->Queue();
|
||||||
|
|
||||||
// Increment queued task counter
|
// Increment queued task counter
|
||||||
|
|||||||
@@ -933,9 +933,6 @@ class PipelineWorker : public Napi::AsyncWorker {
|
|||||||
};
|
};
|
||||||
suffix = AssembleSuffixString(".webp", options);
|
suffix = AssembleSuffixString(".webp", options);
|
||||||
} else {
|
} else {
|
||||||
std::string extname = baton->tileLayout == VIPS_FOREIGN_DZ_LAYOUT_GOOGLE
|
|
||||||
|| baton->tileLayout == VIPS_FOREIGN_DZ_LAYOUT_ZOOMIFY
|
|
||||||
? ".jpg" : ".jpeg";
|
|
||||||
std::vector<std::pair<std::string, std::string>> options {
|
std::vector<std::pair<std::string, std::string>> options {
|
||||||
{"Q", std::to_string(baton->jpegQuality)},
|
{"Q", std::to_string(baton->jpegQuality)},
|
||||||
{"interlace", baton->jpegProgressive ? "TRUE" : "FALSE"},
|
{"interlace", baton->jpegProgressive ? "TRUE" : "FALSE"},
|
||||||
@@ -946,6 +943,7 @@ class PipelineWorker : public Napi::AsyncWorker {
|
|||||||
{"optimize_scans", baton->jpegOptimiseScans ? "TRUE": "FALSE"},
|
{"optimize_scans", baton->jpegOptimiseScans ? "TRUE": "FALSE"},
|
||||||
{"optimize_coding", baton->jpegOptimiseCoding ? "TRUE": "FALSE"}
|
{"optimize_coding", baton->jpegOptimiseCoding ? "TRUE": "FALSE"}
|
||||||
};
|
};
|
||||||
|
std::string extname = baton->tileLayout == VIPS_FOREIGN_DZ_LAYOUT_DZ ? ".jpeg" : ".jpg";
|
||||||
suffix = AssembleSuffixString(extname, options);
|
suffix = AssembleSuffixString(extname, options);
|
||||||
}
|
}
|
||||||
// Remove alpha channel from tile background if image does not contain an alpha channel
|
// Remove alpha channel from tile background if image does not contain an alpha channel
|
||||||
@@ -1362,6 +1360,7 @@ Napi::Value pipeline(const Napi::CallbackInfo& info) {
|
|||||||
// Join queue for worker thread
|
// Join queue for worker thread
|
||||||
Napi::Function callback = info[1].As<Napi::Function>();
|
Napi::Function callback = info[1].As<Napi::Function>();
|
||||||
PipelineWorker *worker = new PipelineWorker(callback, baton, debuglog, queueListener);
|
PipelineWorker *worker = new PipelineWorker(callback, baton, debuglog, queueListener);
|
||||||
|
worker->Receiver().Set("options", options);
|
||||||
worker->Queue();
|
worker->Queue();
|
||||||
|
|
||||||
// Increment queued task counter
|
// Increment queued task counter
|
||||||
|
|||||||
@@ -154,6 +154,7 @@ Napi::Value stats(const Napi::CallbackInfo& info) {
|
|||||||
// Join queue for worker thread
|
// Join queue for worker thread
|
||||||
Napi::Function callback = info[1].As<Napi::Function>();
|
Napi::Function callback = info[1].As<Napi::Function>();
|
||||||
StatsWorker *worker = new StatsWorker(callback, baton, debuglog);
|
StatsWorker *worker = new StatsWorker(callback, baton, debuglog);
|
||||||
|
worker->Receiver().Set("options", options);
|
||||||
worker->Queue();
|
worker->Queue();
|
||||||
|
|
||||||
// Increment queued task counter
|
// Increment queued task counter
|
||||||
|
|||||||
@@ -765,6 +765,30 @@ describe('Tile', function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('IIIF layout', function (done) {
|
||||||
|
const directory = fixtures.path('output.iiif.info');
|
||||||
|
rimraf(directory, function () {
|
||||||
|
sharp(fixtures.inputJpg)
|
||||||
|
.tile({
|
||||||
|
layout: 'iiif'
|
||||||
|
})
|
||||||
|
.toFile(directory, function (err, info) {
|
||||||
|
if (err) throw err;
|
||||||
|
assert.strictEqual('dz', info.format);
|
||||||
|
assert.strictEqual(2725, info.width);
|
||||||
|
assert.strictEqual(2225, info.height);
|
||||||
|
assert.strictEqual(3, info.channels);
|
||||||
|
assert.strictEqual('number', typeof info.size);
|
||||||
|
fs.stat(path.join(directory, '0,0,256,256', '256,', '0', 'default.jpg'), function (err, stat) {
|
||||||
|
if (err) throw err;
|
||||||
|
assert.strictEqual(true, stat.isFile());
|
||||||
|
assert.strictEqual(true, stat.size > 0);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('Write to ZIP container using file extension', function (done) {
|
it('Write to ZIP container using file extension', function (done) {
|
||||||
const container = fixtures.path('output.dz.container.zip');
|
const container = fixtures.path('output.dz.container.zip');
|
||||||
const extractTo = fixtures.path('output.dz.container');
|
const extractTo = fixtures.path('output.dz.container');
|
||||||
|
|||||||
Reference in New Issue
Block a user