Skip to content

Commit 6257994

Browse files
committed
Expose bilinear resize kernel and improve docs lovell#4061
1 parent 7950fc0 commit 6257994

File tree

3 files changed

+18
-6
lines changed

3 files changed

+18
-6
lines changed

docs/api-resize.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,22 @@ When using a **fit** of `cover` or `contain`, the default **position** is `centr
2121

2222
Some of these values are based on the [object-position](https://developer.mozilla.org/en-US/docs/Web/CSS/object-position) CSS property.
2323

24-
The experimental strategy-based approach resizes so one dimension is at its target length
24+
The strategy-based approach initially resizes so one dimension is at its target length
2525
then repeatedly ranks edge regions, discarding the edge with the lowest score based on the selected strategy.
2626
- `entropy`: focus on the region with the highest [Shannon entropy](https://en.wikipedia.org/wiki/Entropy_%28information_theory%29).
2727
- `attention`: focus on the region with the highest luminance frequency, colour saturation and presence of skin tones.
2828

29-
Possible interpolation kernels are:
29+
Possible downsizing kernels are:
3030
- `nearest`: Use [nearest neighbour interpolation](http://en.wikipedia.org/wiki/Nearest-neighbor_interpolation).
31+
- `linear`: Use a [triangle filter](https://en.wikipedia.org/wiki/Triangular_function).
3132
- `cubic`: Use a [Catmull-Rom spline](https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline).
3233
- `mitchell`: Use a [Mitchell-Netravali spline](https://www.cs.utexas.edu/~fussell/courses/cs384g-fall2013/lectures/mitchell/Mitchell.pdf).
3334
- `lanczos2`: Use a [Lanczos kernel](https://en.wikipedia.org/wiki/Lanczos_resampling#Lanczos_kernel) with `a=2`.
3435
- `lanczos3`: Use a Lanczos kernel with `a=3` (the default).
3536

37+
When upsampling, these kernels map to `nearest`, `linear` and `cubic` interpolators.
38+
Downsampling kernels without a matching upsampling interpolator map to `cubic`.
39+
3640
Only one resize can occur per pipeline.
3741
Previous calls to `resize` in the same pipeline will be ignored.
3842

@@ -52,7 +56,7 @@ Previous calls to `resize` in the same pipeline will be ignored.
5256
| [options.fit] | <code>String</code> | <code>&#x27;cover&#x27;</code> | How the image should be resized/cropped to fit the target dimension(s), one of `cover`, `contain`, `fill`, `inside` or `outside`. |
5357
| [options.position] | <code>String</code> | <code>&#x27;centre&#x27;</code> | A position, gravity or strategy to use when `fit` is `cover` or `contain`. |
5458
| [options.background] | <code>String</code> \| <code>Object</code> | <code>{r: 0, g: 0, b: 0, alpha: 1}</code> | background colour when `fit` is `contain`, parsed by the [color](https://www.npmjs.org/package/color) module, defaults to black without transparency. |
55-
| [options.kernel] | <code>String</code> | <code>&#x27;lanczos3&#x27;</code> | The kernel to use for image reduction. Use the `fastShrinkOnLoad` option to control kernel vs shrink-on-load. |
59+
| [options.kernel] | <code>String</code> | <code>&#x27;lanczos3&#x27;</code> | The kernel to use for image reduction and the inferred interpolator to use for upsampling. Use the `fastShrinkOnLoad` option to control kernel vs shrink-on-load. |
5660
| [options.withoutEnlargement] | <code>Boolean</code> | <code>false</code> | Do not scale up if the width *or* height are already less than the target dimensions, equivalent to GraphicsMagick's `>` geometry option. This may result in output dimensions smaller than the target dimensions. |
5761
| [options.withoutReduction] | <code>Boolean</code> | <code>false</code> | Do not scale down if the width *or* height are already greater than the target dimensions, equivalent to GraphicsMagick's `<` geometry option. This may still result in a crop to reach the target dimensions. |
5862
| [options.fastShrinkOnLoad] | <code>Boolean</code> | <code>true</code> | Take greater advantage of the JPEG and WebP shrink-on-load feature, which can lead to a slight moiré pattern or round-down of an auto-scaled dimension. |

docs/changelog.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ Requires libvips v8.15.2
1010
[#4048](https://github.com/lovell/sharp/pull/4048)
1111
[@ike-gg](https://github.com/ike-gg)
1212

13+
* Expose `bilinear` resizing kernel (and interpolator).
14+
[#4061](https://github.com/lovell/sharp/issues/4061)
15+
1316
### v0.33.3 - 23rd March 2024
1417

1518
* Upgrade to libvips v8.15.2 for upstream bug fixes.

lib/resize.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ const strategy = {
6868
*/
6969
const kernel = {
7070
nearest: 'nearest',
71+
linear: 'linear',
7172
cubic: 'cubic',
7273
mitchell: 'mitchell',
7374
lanczos2: 'lanczos2',
@@ -135,18 +136,22 @@ function isResizeExpected (options) {
135136
*
136137
* Some of these values are based on the [object-position](https://developer.mozilla.org/en-US/docs/Web/CSS/object-position) CSS property.
137138
*
138-
* The experimental strategy-based approach resizes so one dimension is at its target length
139+
* The strategy-based approach initially resizes so one dimension is at its target length
139140
* then repeatedly ranks edge regions, discarding the edge with the lowest score based on the selected strategy.
140141
* - `entropy`: focus on the region with the highest [Shannon entropy](https://en.wikipedia.org/wiki/Entropy_%28information_theory%29).
141142
* - `attention`: focus on the region with the highest luminance frequency, colour saturation and presence of skin tones.
142143
*
143-
* Possible interpolation kernels are:
144+
* Possible downsizing kernels are:
144145
* - `nearest`: Use [nearest neighbour interpolation](http://en.wikipedia.org/wiki/Nearest-neighbor_interpolation).
146+
* - `linear`: Use a [triangle filter](https://en.wikipedia.org/wiki/Triangular_function).
145147
* - `cubic`: Use a [Catmull-Rom spline](https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline).
146148
* - `mitchell`: Use a [Mitchell-Netravali spline](https://www.cs.utexas.edu/~fussell/courses/cs384g-fall2013/lectures/mitchell/Mitchell.pdf).
147149
* - `lanczos2`: Use a [Lanczos kernel](https://en.wikipedia.org/wiki/Lanczos_resampling#Lanczos_kernel) with `a=2`.
148150
* - `lanczos3`: Use a Lanczos kernel with `a=3` (the default).
149151
*
152+
* When upsampling, these kernels map to `nearest`, `linear` and `cubic` interpolators.
153+
* Downsampling kernels without a matching upsampling interpolator map to `cubic`.
154+
*
150155
* Only one resize can occur per pipeline.
151156
* Previous calls to `resize` in the same pipeline will be ignored.
152157
*
@@ -239,7 +244,7 @@ function isResizeExpected (options) {
239244
* @param {String} [options.fit='cover'] - How the image should be resized/cropped to fit the target dimension(s), one of `cover`, `contain`, `fill`, `inside` or `outside`.
240245
* @param {String} [options.position='centre'] - A position, gravity or strategy to use when `fit` is `cover` or `contain`.
241246
* @param {String|Object} [options.background={r: 0, g: 0, b: 0, alpha: 1}] - background colour when `fit` is `contain`, parsed by the [color](https://www.npmjs.org/package/color) module, defaults to black without transparency.
242-
* @param {String} [options.kernel='lanczos3'] - The kernel to use for image reduction. Use the `fastShrinkOnLoad` option to control kernel vs shrink-on-load.
247+
* @param {String} [options.kernel='lanczos3'] - The kernel to use for image reduction and the inferred interpolator to use for upsampling. Use the `fastShrinkOnLoad` option to control kernel vs shrink-on-load.
243248
* @param {Boolean} [options.withoutEnlargement=false] - Do not scale up if the width *or* height are already less than the target dimensions, equivalent to GraphicsMagick's `>` geometry option. This may result in output dimensions smaller than the target dimensions.
244249
* @param {Boolean} [options.withoutReduction=false] - Do not scale down if the width *or* height are already greater than the target dimensions, equivalent to GraphicsMagick's `<` geometry option. This may still result in a crop to reach the target dimensions.
245250
* @param {Boolean} [options.fastShrinkOnLoad=true] - Take greater advantage of the JPEG and WebP shrink-on-load feature, which can lead to a slight moiré pattern or round-down of an auto-scaled dimension.

0 commit comments

Comments
 (0)