Node.jsのライブラリsharpの出力形式について

sharpを使った時の出力形式について調べてみました。

出力形式

何も指定しないとファイル名の拡張子を読み取って変換してくれます。

const sharp = require('sharp')

sharp('image.jpg')
  .toFile('output.png', (err, info)=>{
    if(err){ throw err }
    console.log(info)
  })

出力結果

{ format: 'png',
  width: 1024,
  height: 683,
  channels: 3,
  premultiplied: false,
  size: 1476247 }

JPEG

qualityで画質、progressiveでプログレッシブ対応を指定できます。

const sharp = require('sharp')

sharp('image.jpg')
  .jpeg({
    quality: 50,
    progressive: true
  })
  .toFile('output.jpg', (err, info)=>{
    if(err){ throw err }
    console.log(info)
  })

出力結果

{ format: 'jpeg',
  width: 1024,
  height: 683,
  channels: 3,
  premultiplied: false,
  size: 80330 }

PNG

compressionLevelでzlibでの圧縮率(0~9)、progressiveでプログレッシブ対応を指定できます。

const sharp = require('sharp')

sharp('image.jpg')
  .png({
    compressionLevel: 5,
    progressive: true
  })
  .toFile('output.png', (err, info)=>{
    if(err){ throw err }
    console.log(info)
  })

出力結果

{ format: 'png',
  width: 1024,
  height: 683,
  channels: 3,
  premultiplied: false,
  size: 1581660 }

WebP(不可逆圧縮)

qualityで画質(1~100)を指定できます。

const sharp = require('sharp')

sharp('image.jpg')
  .webp({
    quality: 50
  })
  .toFile('output.webp', (err, info)=>{
    if(err){ throw err }
    console.log(info)
  })

出力結果

{ format: 'webp',
  width: 1024,
  height: 683,
  channels: 3,
  premultiplied: false,
  size: 78968 }

WebP(可逆圧縮)

可逆圧縮を使用するにはlosslessプロパティをtrueに指定します。また、nearLosslessというプロパティもあります。

const sharp = require('sharp')

sharp('image.jpg')
  .webp({
    lossless: true
  })
  .toFile('output.webp', (err, info)=>{
    if(err){ throw err }
    console.log(info)
  })

出力結果

{ format: 'webp',
  width: 1024,
  height: 683,
  channels: 3,
  premultiplied: false,
  size: 705258 }

TIFF

qualityで画質(1~100)、compressionで圧縮方法(lzw, deflate, jpeg, ccittfax4)を指定できます。

const sharp = require('sharp')

sharp('image.jpg')
  .tiff({
    quality: 50
  })
  .toFile('output.tiff', (err, info)=>{
    if(err){ throw err }
    console.log(info)
  })

出力結果

{ format: 'tiff',
  width: 1024,
  height: 683,
  channels: 3,
  premultiplied: false,
  size: 83822 }