Herokuで公開しているRailsアプリでHEIF画像を扱う

2 min read読了の目安(約1800字

Herokuで公開しているRailsアプリでiOSで撮影された画像を扱う際にちょっと工夫が必要だったのでその手順を共有します。

ちなみにiOSのSafariから直接アップロードするときには自動的にJPEGに変換されてからサーバに送られてくるので特別な対応は必要ありません。今回対応が必要だったのは、iOSで撮影した写真をMacやPCからアップロードする場合のみです。

ImageMagickのバージョンを確認

https://imagemagick.org/script/changelog.php
ImageMagickはバージョン7.0.7-22ならばHEICの読み込みに対応しているようです。
手元の開発環境で使っているImageMagickがそれ以上であることを確認してください。
$ convert --version
Version: ImageMagick 7.0.11-8 Q16 x86_64 2021-04-17 https://imagemagick.org
Copyright: (C) 1999-2021 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP(4.5) 
Delegates (built-in): bzlib freetype gslib heic jng jp2 jpeg lcms lqr ltdl lzma openexr png ps tiff webp xml zlib

Rails側の対応

config/application.rb あたりで以下を追加します。

config/application.rb
config.active_storage.variable_content_types += ['image/heic', 'image/heic-sequence', 'image/heif', 'image/heif-sequence']

これでHEIF画像をImageMagickで処理可能なものとしてRailsが認識してくれます。

Heroku側の対応

Herokuにデフォルトで入っているImageMagickは https://devcenter.heroku.com/articles/stack-packages にある通りheroku-20スタックでもちょっと古いため、そのままだとHEICファイルを扱うことができません。

幸いHerokuにはbuildpacksという仕組みがあり、これを使うことで動作環境をカスタマイズすることができます。

公式、非公式問わず以下のページからbuildpackを検索することができます。

https://elements.heroku.com/search/buildpacks

今回はHEIFに対応したImageMagickを追加したかったので "imagemagick heif" で検索して出てきた https://github.com/hakongit/heroku-buildpack-imagemagick-heif.git を使いました。
対応するスタックがものによって違ったりするので、自分の使っているスタックに合わせて選んでください。

heroku buildpacks:add https://github.com/hakongit/heroku-buildpack-imagemagick-heif.git

あとは次回デプロイ時に自動的に先ほど追加したbuildpackに基づくImageMagickのビルドも行われます。

参考

https://imagemagick.org/script/changelog.php
https://guides.rubyonrails.org/configuring.html#configuring-active-storage
https://www.iana.org/assignments/media-types/media-types.xhtml#image