TrueNAS v12とNextcloud v23プラグインの環境では、iPhoneで撮影したHEIC/HEIF写真データをアップロードしてもプレビューやサムネルが表示されない。どうやらHEIF画像のサムネイル化処理に対応するモジュールが入っていないようだ。
iPhoneを使う身から言わせるとこの状況はかなり不便であるので、既存のプラグイン環境を壊さないように注意しながらHEIF対応の機能を追加してみた。
目次
現状の状態把握と改善方針の決定
Nextcloudの画像処理はImageMagick + PHPモジュールで行われている。画像処理そのものはImageMagick依存であるので、インストールされているImageMagickの状態を確認する。
Nextcloudのシェルに入り、対応画像フォーマット一覧表示。
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である。
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に差し替える必要がある。そのためインストール方法の工夫が必要であり、大まかに以下のような手順でインストールする作戦とする。
- pkgで済むライブラリをインストール
- portsで設定をカスタマイズしてImageMagickをビルド&インストール
- 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
$ 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する
configする
$ cd /usr/ports/graphics/ImageMagick7-nox11 $ sudo make config
dialog4portsが立ち上がるので設定する。ビルドオプションをスペースキーでON/OFFする。
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で変換エラーが頻発するので止めている。
0 件のコメント:
コメントを投稿