-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Proposal: move resize-related options-as-functions to become options of resize #1135
Comments
Thanks for this explanation. I like the proposed signatures for these functions and I think it will reduce the learning curve for those of us in the "generation" that never used CLI-based image processing tools. One question I asked in #1127 that I'm not sure this addresses is this: at what point is the result of the "fluent" API actually executed? For example, if I want to chain two different resize functions together, I want the first one to execute and then the second one to be executed on the result of the first one. Is that currently possible? And if not, is there a proposal for accomplishing something like this? |
I like it. This indeed makes it a bit easier to learn. Here are some further ideas: TL;DR: Align with CSS terminology where possible resize({ width, height, fit: 'inside' }) // Like resize({ width, height, canvas: 'max' }) above
resize({ width, height, fit: 'outside' }) // Like resize({ width, height, canvas: 'min' }) above
resize({ width, height, fit: 'fill' }) // Like resize({ width, height, canvas: 'ignoreAspectRatio' }) above
resize({ width, height, fit: 'cover', position: 'bottom' }) // Like resize({ width, height, crop: 'south' }) above
resize({ width, height, fit: 'contain' } }) // Like resize({ width, height, embed: 'center' }) above
Possible explanation for the documentation: The
|
Should make them easier to find in the docs
@MajorBreakfast I've finally got round to thinking about your proposal and really like the CSS-inspired Based on this, the proposed examples would become: resize({ width }) // equivalent to resize(width)
resize({ height }) // equivalent to resize(null, height)
resize({ height, width }) // resize(width, height)
resize({ position: 'right', height, width }) // resize(width, height).crop('east')
resize({ fit: 'contain', position: 'left bottom', height, width }) // resize(width, height).embed('southwest')
resize({ fit: 'inside', height, width }) // resize(width, height).max()
resize({ fit: 'outside', height, width }) // resize(width, height).min()
resize({ fit: 'fill', height, width }) // resize(width, height).ignoreAspectRatio()
resize({ height, width, withoutEnlargement: true }) // resize(width, height).withoutEnlargement()
resize({ fit: 'inside', height, width, withoutEnlargement: true }) // resize(width, height).max().withoutEnlargement() The CSS positions (e.g. We'd still need the It's a slightly bigger API change than I was thinking but if we're going to break the API we may as well try to get it right second time ;) Perhaps a codemod could be produced to help once an API is settled upon? |
These become options of the resize operation instead. #1135
Commit c3274e4 makes this big but worthwhile change, which will be included in v0.21.0. The resize docs also have more examples. Having all the options together rather than being spread over multiple functions, plus leaning on some CSS naming standards, should hopefully make it all much easier to understand. (The |
sharp v0.21.0 is now available with this change. Complete documentation for all the |
Could we add a bit more color to the semantic differences these options, especially Also, from my reading of the above,
Would these options would be clearer if they each had a drawing, like this? |
@mceachen A PR to improve the docs with images, like the one you've provided, would be very welcome thank you! If it's unclear from the docs and my comments above,
I realise this is quite a big change, hence the deprecation route, but it seems like the concepts of |
Hi everyone! I try to migrate to v0.21.0, but didn't really get what would be the equivalent of old: resize(width, height).crop() will it be this one?: resize({ height, width, position: 'center' }) Thanks for such an amazing module |
@PazzaVlad When providing both a width and height the default behaviour remains the same; previously this was The following are all functionally equivalent: resize(width, height);
resize(width, height).crop();
resize(width, height).crop('center');
resize(width, height, { fit: 'cover' });
resize(width, height, { fit: 'cover', position: 'center' });
resize(width, height, { position: 'center' }); |
There is an API deprecation, see lovell/sharp#1135 (comment)
There have been a couple of cases where people expressed confusion with the current resize API.
The original "fluent" API was partly influenced by that of the
gm
module, the idea being that having a similar-ish API would make migration between the two modules easier. (Thegm
module builds an ordered list of flags to pass to the the underlyingconvert
command line utility so it was always a bit of a leaky abstraction anyway.)That was almost five years ago and I've wanted to improve this API for a while, especially as there is now a generation of developers who have never had to work with command line image processing tools.
The
resize
function currently has three signatures (that will remain):This proposal is for an additional signature:
where
options
is an object with one or more of these properties:canvas
crop
embed
fastShrinkOnLoad
(existing property)height
kernel
(existing property)width
withoutEnlargement
The following example usage of the proposed API would become possible.
NOTE: this proposed API has been updated - see #1135 (comment)
REPEATED NOTE: this proposed API has been updated - see #1135 (comment)
The
max()
,withoutEnlargement()
etc. options-as-functions would be deprecated and (eventually) removed. This was the approach previously taken to move the no-longer-presentprogressive()
function to become options of thejpeg()
andpng()
output-selecting functions.Constructive thoughts and feedback, as always, welcome.
Update: mention existing
fastShrinkOnLoad
andkernel
options that will remain.Update: consider moving operations that can result in an image of a different size, e.g.
extend
andtrim
, to theresize.js
file (and therefore the resize docs).The text was updated successfully, but these errors were encountered: