sharpでHEICをJPEGに変換する

概要

sharpでHEICをJPEGに変換する方法を記述します。

準備

今回は、dockerのnodeの公式のイメージを利用します。

$ docker run --rm -it -v $(pwd):/home/node/test-sharp -w /home/node/test-sharp node bash

「-v」でホスト側のカレントディレクトリをコンテナの/home/node/test-sharpにマウントしています。

「-w」でコンテナの作業ディレクトリを/home/node/test-sharpに指定しています。

  • nodejsのバージョンの確認
# node --version
v16.9.0
  • sharpのインストール
# npm install sharp
# npm list
test-sharp@ /home/node/test-sharp
`-- sharp@0.29.1

0.29.1がインストールされています。

# cat <<EOF > index.js
const sharp = require('sharp')

sharp('sample.heic').jpeg().toFile('sample.jpg')
EOF

「sample.heic」はHEIC形式の画像ファイルです。 これをsharpを利用して、JPEG形式に変換して「sample.jpg」として保存します。

# node index.js

node:internal/process/promises:246
          triggerUncaughtException(err, true /* fromPromise */);
          ^

[Error: sample.heic: bad seek to 2727395
heif: Unsupported feature: Unsupported codec (4.3000)
...

sharpが利用しているlibvipsがHEICに対応していないため、エラーになります。

  • sharpが対応しているlibvipsのバージョンを確認
# cat node_modules/sharp/package.json
...
  "config": {
    "libvips": "8.11.3",
    "runtime": "napi",
    "target": 5
  },
...
  • sharpをアンインストール

このままではHEICを変換できないので、一旦、sharpをアンインストールします。

# npm uninstall sharp

変換方法

libvipsをHEICに対応させるため、「libde265」、「x265」、「libheif」、「libvips」をそれぞれソースからコンパイルしてインストールします。

  • 必要となるライブラリのインストール
# apt update
# apt install -y cmake gtk-doc-tools gobject-introspection
# cd /tmp
# git clone https://github.com/strukturag/libde265.git
# cd libde265/
# ./autogen.sh
# ./configure
# make
# make install
# cd /tmp
# git clone https://github.com/videolan/x265.git
# cd x265/build
# cmake ../source
# make
# make install
# cd /tmp
# git clone https://github.com/strukturag/libheif.git
# cd libheif/
# ./autogen.sh
# ./configure
# make
# make install
# cd /tmp
# curl -LO https://github.com/libvips/libvips/releases/download/v8.11.3/vips-8.11.3.tar.gz
# tar -zxf vips-8.11.3.tar.gz
# cd vips-8.11.3
# ./autogen.sh
# ./configure
# make
# make install

インストールされたlibvipsのバージョンを確認しておきます。

# pkg-config --modversion vips-cpp
8.11.3

共有ライブラリのキャッシュを更新します。

# ldconfig
  • sharpをインストール
# cd /home/node/test-sharp
# npm install sharp
  • HEICを変換する
# node index.js
  • 確認
# file sample.heic
sample.heic: ISO Media, HEIF Image HEVC Main or Main Still Picture Profile
# file sample.jpg
sample.jpg: JPEG image data, baseline, precision 8, 3024x4032, components 3

備考