MastodonでAVIF画像フォーマットに対応する方法

ほんとはMastodon管理を2月に始めたばかりの新参初心者あすかがこういう記事を書くのもおこがましいのですが、今後のAVIF画像の話について注意喚起をしようと思います。

画像形式AVIFについて

これはどういう画像フォーマットなのかってところから話すと絶対長くなるので、昔から使われてきたPNG、JPEGのほかに、新しくAvifという画像フォーマットが出てきたよ。変な名前に見えるけどPNGやJPEGと同じ画像の種類だよ。っていう理解でいいです。

Avif対応の必要性

なぜAvifとかいう見たことも聞いたこともないフォーマットに対応しなければいけないのか?というと、この記事を書いた目的でもありますが、以下の投稿に集約されています。

Misskeyの画像配信は6月第1週にほぼ全てavifになります

Mastodonも対応してね(ImageMagickのビルドが対応していない場合があるらしい)

@aqz@p1.a9z.dev

6月までにAvif画像に対応していないと、Misskeyから来る画像がMastodonで処理できないため表示できなくなります。おいたわしや。

でもそんなの、画像はWebブラウザで表示してるので大丈夫でしょと思っていませんか。実はサーバーとしてもAvif対応が必要です。

Mastodonでの画像の扱い

Mastodonって投稿に画像が添付されてると、そのサムネイル画像を作成しますよね。

タイムラインに流れてくる画像は、実は縮小された画像です。
Chromeで(2枚以上の)画像が添付された投稿で、適当な画像をタイムライン画面上から右クリックしてもらって、「新しいタブで画像を開く」選択してみてください。
さらに、Mastodonのタイムラインに戻って、その画像をクリックして拡大したものを「新しいタブで画像を開く」してみてください。
両者のURLが違うのはわかると思います。前者のURLに「small」入ってますよね。

さらに、後者の画像であっても、例えば4000x4000くらいのクソデカ画像も、実際にアップロード・投稿してみると1920x1080くらいに小さくなってると思います(Mastodon 4.1.xの場合。4.2.xではもうちょっと大きくなります)。投稿できる画像のサイズに上限があるんですけど、Mastodonはアップロードされた画像が大きすぎる場合、それをいい感じに縮小します。

アニメーション付きカスタム絵文字のアニメーションを止めるっていう設定項目も存在するんですが、実際にアニメーションしていないバージョンの絵文字はどこから用意しているかっていうと、それもMastodonが自分でカスタム絵文字を加工して作っています。

こういう、普段は意識してないところでMastodonは画像の縮小処理をしているわけです。それをやっているのが、ImageMagickというライブラリです。

ImageMagickはRubyのgemで完結するものではありません。サーバーに別途ImageMagickをインストールして、Rubyからそれを呼び出す感じになっています。

MastodonでのAvifの対応状況

で、Mastodonのバージョン4ではAvifに対応しています。ただしあくまでMastodon側は対応しているという話でしか無いです。

MastodonがAvifの画像を検出して、「これをいい感じに縮小してね」という処理をImageMagickに投げます。そこまではできています。バージョン4であり、管理者が変に改造していない限り、ImageMagickに投げるまではできているはずです。

問題はそのImageMagick自身にあります。ImageMagickにも当然ですがバージョンというものがあって、例えばWebpという別のフォーマットにちゃんと対応したのは2013年7月からです。

ImageMagickでのAvifの対応状況

話をややこしくしているのは、ImageMagickにとって「そのフォーマットに対応したバージョン」と「不具合なくそのフォーマットを処理できるバージョン」が異なることです。例えば上記のQiita記事にもある通り、

ImageMagick は 6.6.8(2011年3月) で WebP に対応しました。ただし当初は不具合が沢山あって、6.8.6-8(2013年7月)以降のバージョンをお勧めします。

とあります。

Avifの話に戻りますね。そもそも今手持ちのImageMagickはAvifに対応しているのでしょうか?気になりますよね。

ImageMagickが特定の画像フォーマットに対応しているか調べる方法があります。「magick --version」コマンドです。

ubuntu@ip-?-?-?-?:~$ magick --version
Version: ImageMagick 7.?.? Q32-HDRI aarch64 21158 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP(4.5)
Delegates (built-in): freetype heic jbig jng jp2 jpeg lcms ltdl lzma openexr png raw tiff webp xml zlib
Compiler: gcc (11.3)

このコマンドの結果で、Delegatesに「heic」があればAvif対応ができています。(結果はバージョン7のものです)

「heic」があればAvif対応できています。これ私も勘違いしていたところですが、実はImageMagickバージョン6系でもheic対応していると表示されます。そして、Mastodon公式ドキュメント通りにMastodonをセットアップすると、ImageMagickはバージョン6系がインストールされます

それで、バージョン6でもheic対応していればAvif画像処理ができるかというと、できません。Webpの件と同じように、バージョン6にはAvif画像処理に関するバグが非常に多く、ほぼ使い物になりません。

つまり、公式の手順通りにインストールするとAvif対応できないということです。これはDockerでもManually(手動)でも関係ありません。おそらくAvifに対応したMastodonのほうが少数派でしょう。

なのでImageMagickをバージョン7に上げなければいけません。

ImageMagickバージョンアップ方法

2023年5月時点で、Mastodon公式ドキュメントを見て手動セットアップしたサーバーであるという前提でお話します。

まず、すでにインストールしてしまったバージョン6のImageMagickをアンインストールします。

sudo apt remove imagemagick

さてバージョン7のImageMagickはどこのapt-getリポジトリにあるかというと、ありません。自分でソースコードをとってきて、ビルドする必要があります。

※以下の方法でやるとQ32のImageMagickがインストールされます。Q16のほうがいい場合は他のサイト見てください

以下の方法の参考:https://yawnbox.com/blog/imagemagick7-ubuntu-mastodon/

まず、ソースコードをtar.gzでとって解凍します。

sudo apt-get install build-essential
wget https://imagemagick.org/archive/ImageMagick.tar.gz
tar xvzf ImageMagick.tar.gz

次に、解凍してできたフォルダに移動します。(自分でフォルダ名調べてcdで移動してください)

ls
cd [Generated Folder]

ビルドに使うライブラリをインストールします。

sudo apt update
sudo apt install libjpeg-dev libpng-dev libpng16-16 libltdl-dev libheif-dev libraw-dev libtiff-dev libopenjp2-tools libopenjp2-7-dev libjpeg-turbo-progs libfreetype6-dev libheif-dev libfreetype6-dev libopenexr-dev libwebp-dev libgif-dev

ImageMagickのソースコードのMake構成設定をします。
これが終わった時に、「さっきインストールしたライブラリや今回指定した--with-jpegとかのオプション指定の組み合わせであれば、このフォーマットに対応できるよ」というリストが表示されるので、その中にPNG、JPEG、HEIC (AVIF)、WEBP、GIFとかとかがないか必ず確認しておきます。
もしダメだったらそれは上に書いたライブラリのインストールコマンドが間違っているということなので、申し訳ないですが自分で調べてください。

./configure --with-modules --enable-file-type --with-quantum-depth=32 --with-jpeg=yes --with-png=yes --with-gif=yes --with-webp=yes --with-heic=yes --with-raw=yes --with-tiff=yes --with-openjp2 --with-freetype=yes --with-webp=yes --with-openexr=yes --with-gslib=yes --with-gif=yes --with-perl=yes --with-jxl=yes

それが終わったらMakeでビルドして設定すれば終わりです。makeでめちゃ時間がかかります。

make
sudo make install
sudo ldconfig /usr/local/lib

最後にheicがインストールされているかとか確認して終わりです。

magick --version

動作確認

実際にMastodonにAVIF画像をアップロードして動作確認します。AVIF画像サンプルはここからダウンロードできます。(現時点でGitHubもAVIFプレビューに対応してないらしい)

アップロード時にエラーが発生した場合は、ログを確認してエラーの原因を調べ、対応します。

sudo journalctl -r -u mastodon-web

journalctlのログ内を検索するときは、journalctl画面内でこのコマンドが使えます。vimと同じです。

/Error  [Enter]
n で次の結果
N で前の結果

あと、kmyblueのようにwebとsidekiqでサーバーを分けている場合は、他のサーバーからAVIF画像を投稿してSidekiqの動作を確認したほうが安全です。現状AVIFに対応している日本語圏のサーバーは、Fedibird、kmyblue、他にもいくつかあると思います。Mastodon公式サーバーであるmastodon.socialはまだ対応していないという話です。

おわりに

Mastodonは早くドキュメントをAvif対応させて欲しい。

いいなと思ったら応援しよう!