How to resize an image in sharp with the option 'contain' but preserve the aspect ratio of the original dimensions?

10,648

Keep either width or height so that the Sharp will maintain the ratio

Below the height will maintain its ratio when resizing;

await sharp(image)
    .resize({
        fit: sharp.fit.contain,
        width: 800
    })
    .jpeg({ quality: 80 })
    .toBuffer()
Share:
10,648

Related videos on Youtube

user1031947
Author by

user1031947

Updated on June 04, 2022

Comments

  • user1031947
    user1031947 about 2 years

    I have a 1000px by 750px image.

    I use lovell/sharp to resize it:

    await sharp(image)
        .resize({
            fit: sharp.fit.contain,
            width: 800,
            height: 800
        })
        .jpeg({ quality: 80 })
        .toBuffer()
    

    This results in a new image that is 800px by 800px, with the original image 'contained' inside of that region.

    What I would really like is to have a final image that is 800px by 600px. IOW, to resize the image and preserve the aspect ratio.

    I realize it is possible to do this by specifying only a width. However it is useful to have a bounding box to contain the resized image in, to avoid creating images greater than a certain height.

    Can I do this in sharp with different settings?

  • Methodician
    Methodician over 2 years
    This is precisely what we are trying to achieve. Should be accepted answer. (didn't need the quality setting not sure it's relevant)
  • Christos Lytras
    Christos Lytras about 2 years
    This should be the accepted answer. @Methodician the quality setting comes from the OP code; when answering questions, it's most likely and recomended to use and refactor the code that the OP contains.