NextcloudでHEIF/HEIC画像を扱う

2022-10-09
  • B!

Nextcloud TrueNAS

 TrueNAS v12とNextcloud v23プラグインの環境では、iPhoneで撮影したHEIC/HEIF写真データをアップロードしてもプレビューやサムネルが表示されない。どうやらHEIF画像のサムネイル化処理に対応するモジュールが入っていないようだ。

iPhoneを使う身から言わせるとこの状況はかなり不便であるので、既存のプラグイン環境を壊さないように注意しながらHEIF対応の機能を追加してみた。

目次

現状の状態把握と改善方針の決定

Nextcloudの画像処理はImageMagick + PHPモジュールで行われている。画像処理そのものはImageMagick依存であるので、インストールされているImageMagickの状態を確認する。
Nextcloudのシェルに入り、対応画像フォーマット一覧表示。
$ identify -list format
一覧にHEIFが無い。ということはインストールされているImageMagickがHEIFに対応していないというのが根本原因である。

何がインストールされているのか確認する
$ pkg info | grep Ima
ImageMagick7-nox11-7.1.0.19    Image processing tools
php74-pecl-imagick-im7-3.5.1_1 PHP wrapper to the ImageMagick/GraphicsMagick library version 7
ImageMagick7-nox11 (X Windowなし)とPHP PECLモジュールでImageMagickに対応している。
pkg info通り、ImageMagick の現物のバージョンは7.1.0-19である。
$ convert --version
Version: ImageMagick 7.1.0-19 Q16-HDRI amd64 2021-12-22 https://imagemagick.org
Copyright: (C) 1999-2021 ImageMagick Studio LLC

FreeBSDのImageMagick7-nox11のportsの最新情報を確認する。
FreeBSD:12:amd64を見ると、v7.1.0.19は2022-1-12版であることがわかる。作業当時の最新版であった。TrueNASのJailプラグインインストールは、最新のpkgをダウンロードしながら構築するようである。

現状の対応画像フォーマット

ImageMagickのpkgのビルド状態を詳しく確認してみる。
$ pkg info ImageMagick7-nox11
・・・
ImageMagick7-nox11-7.1.0.19
Options        :
        16BIT_PIXEL    : on
        BZIP2          : on
        DJVU           : off
        DOCS           : on
        FFMPEG         : off
        FFTW           : on
        FONTCONFIG     : on
        FPX            : off
        FREETYPE       : on
        GRAPHVIZ       : off
        GSLIB          : off
        HDRI           : on
        HEIF           : off
        JBIG           : on
        JPEG           : on
        JPEG2000       : on
        JXL            : off
        LCMS2          : on
        LQR            : on
        LZMA           : on
        MODULES        : on
        OPENEXR        : off
        OPENMP         : off
        PDF            : on
        PERL           : on
        PNG            : on
        RAW            : on
        TESTS          : off
        THREADS        : on
        TIFF           : on
        WEBP           : on
        WMF            : on
なるほど、セキュリティや権利関係の大人の事情で問題を起こしそうなdelegateは除外してインストールされている。

改善方針

対応画像フォーマットを増やすため、以下のように環境を変更することを目標にImageMagickを更新する。
   FFMPEG         : off    # ffmpegインストール済みなのでONにしたい
   GSLIB          : off    # GhostScriptインストール済みなのでONにしたい
   HEIF           : off    # これをONにしたい
   JXL            : off    # JPEG XL。将来を考えONにしたいが、依存パッケージへの対処作業が膨大なので今回はOFF
   OPENEXR        : off    # HDR画像。将来を考え ONにしたい

インストール

さて、pkgはビルド済みのバイナリをインストールするものなので、ビルド段階で違う設定のImageMagickをインストールするためには、pkgに頼らずにportsでカスタムビルドしたImageMagickに差し替える必要がある。そのためインストール方法の工夫が必要であり、大まかに以下のような手順でインストールする作戦とする。

  1. pkgで済むライブラリをインストール
  2. portsで設定をカスタマイズしてImageMagickをビルド&インストール
  3. pkg版のImageMagickをロックし、pkg upgradeコマンドの対象外にしておく

PHPへ影響が出ないように、現在インストールされているpkg版ImageMagickと同じバージョンのものをportsで入れるよう注意する。

OpenEXR

$ sudo pkg install openexr

gmake

ImageMagickのportsのビルド作業で必要。
$ sudo pkg install gmake

dialog4ports

portsを使うにあたりdialog4portsを入れる。portsインストール時にコンソールに設定UI画面を出せる。configure作業時のCUI地獄から解放されて作業が楽になる。
$ sudo pkg install dialog4ports

portsの環境を導入する

Nextcloudの環境はJailなので、portsの環境は入っていないため追加で整える必要がある。しかし、portsを導入すると、ツリー情報(Makefile)が500MBくらいになるので必要なportsツリーだけインストールする。Jailを肥大化させたくないためである。

設定を行う。
$ sudo vi /etc/portsnap.conf
REFUSEのところに不要なportsツリー名を記述する。
REFUSE accessibility arabic archivers astro audio base benchmarks biology cad chinese comms converters databases deskutils devel dns editors emulators finance french ftp games german hebrew hungarian irc japanese java korean mail math misc multimedia net net-im net-mgmt net-p2p news polish ports-mgmt portuguese print russian science security shells sysutils textproc ukrainian vietnamese www x11 x11-clocks x11-drivers x11-fm x11-fonts x11-servers x11-themes x11-toolkits x11-wm lang graphics
設定に記載するカテゴリ名はこちらから。

portsツリーの取得。REFUSEのツリーはダウンロードしないように動作する。
$ sudo portsnap fetch

ImageMagick

ImageMagickのportsツリーファイルだけ解凍
$ sudo portsnap extract graphics/ImageMagick7
$ sudo portsnap extract graphics/graphics/ImageMagick7-nox11
念のため、ImageMagick7のバージョンを確認する
$ cat /usr/ports/graphics/ImageMagick7/Makefile
PORTNAME=       ImageMagick
DISTVERSION=    7.1.0-19
pkgとバージョンが同じであるので大丈夫だ。

依存関係の確認
$ cd /usr/ports/graphics/ImageMagick7-nox11
$ sudo make all-depends-list
色々なライブラリがincompleateと出るがpkgでいれているので大丈夫。

configする
$ cd /usr/ports/graphics/ImageMagick7-nox11
$ sudo make config
dialog4portsが立ち上がるので設定する。ビルドオプションをスペースキーでON/OFFする。
dialong4ports
FFMPEG, GSLIB, HEIF, OPENEXRをONに変更する。

ビルド。
$ sudo make -DBATCH
ビルド中にconfigureによるライブラリのチェック結果が表示されるので、狙い通りの画像フォーマットに対応できるようにビルドできる見込みかどうか確認する。

pkg版をアンインストールしてからports版をインストール
$ sudo make deinstall reinstall

. . . . . .
Installed packages to be REMOVED:
    ImageMagick7-nox11: 7.1.0.19

. . . . . .
[1/1] Deleting files for ImageMagick7-nox11-7.1.0.19: 100%

. . . . . .
===>  Installing for ImageMagick7-nox11-7.1.0.19

ImageMagickの対応フォーマット一覧にHEICが追加されたことが確認できる
$ convert -list format | grep HEIC
     AVIF* HEIC      rw+   AV1 Image File Format (1.10.0)
     HEIC* HEIC      rw+   High Efficiency Image Format (1.10.0)
     HEIF* HEIC      rw+   High Efficiency Image Format (1.10.0)

ImageMagickはpkgからportsへ移行したので、pkg版ImageMagickの更新を止める。
$ sudo pkg lock ImageMagick7-nox11
ImageMagick7-nox11-7.1.0.19: lock this package? [y/N]: y
Locking ImageMagick7-nox11-7.1.0.19

不要な依存パッケージ情報を削除
$ sudo pkg autoremove

ImageMagickのビルドに使用した一時ファイルを消す。
$ cd /usr/ports/graphics/ImageMagick7-nox11
$ sudo make clean

pkgのcacheファイルを消す。400MBくらいある
$ sudo pkg clean
$ sudo pkg clean -a
Proceed with cleaning the cache? [y/N]: y

Nextcloudの設定

/usr/local/www/nextcloud/config/config.phpに以下を書き加える
  'enabledPreviewProviders' => 
   array (
    0 => 'OC\\Preview\\Image',
    1 => 'OC\\Preview\\MP3',
    2 => 'OC\\Preview\\TXT',
    4 => 'OC\\Preview\\Movie',
    5 => 'OC\\Preview\\Photoshop',
    6 => 'OC\\Preview\\TIFF',
    7 => 'OC\\Preview\\HEIC',
    8 => 'OC\\Preview\\SVG',
  ),
(補足)コマンドで設定を追記する場合は
occ config:system:set enabledPreviewProviders 4 --value="OC\\Preview\\Movie”

ImageMagickビルド時にGSLIBに対応させたので、構成上は上記にPDFのエントリーを追記しても良いのだが、今の環境ではPDFのサムネイル生成はメモリ不足が原因でgdで変換エラーが頻発するので止めている。

最終の動作結果

NextcloudへiPhoneで撮影したHEICをアップロードしてみた。サーバサイドでHEICをjpegに変換してNextcloudのWeb画面にプレビューを表示できるようになった。
nextcloud
リスボンの街路

Profile

Profile header image


ampspeed

炎上している開発プロジェクトの火消し屋をやってます。

サイト内検索