虚無庵

徒然なるままに

やんちゃエフェクト

jinroq.hatenablog.jp

やんちゃクラブリスナー Advent Calendar では、書き出す前に「こんな感じで書いていこう」という大まかな流れを頭に入れていたが、思ったより俺は遅筆だった。

onk.hatenablog.jp

おおなかさんの記事を見て「俺もやんちゃエフェクトせねば!」という気持ちになったのでブログをしたためることにした。

エフェクトの前に所有のファングッズもどき

ken-c-lo.hatenadiary.org

ファングッズの話も書きたかったのだが、実は公式ファングッズ相当のものは持っていない。ただ、チェアリングできそうなイスはあるので紹介する。

LOGOS Life バックホールドチェア

www.logos.ne.jp

f:id:jinroq:20211219141846j:plain
甚六のイス

実は我が家にあぐらチェアはない。実際にアウトドアで使用しているイスなのだが、「ローチェアはしっくりこない」という理由から持っていない。むしろ腰痛持ちの俺にはこんな感じの腰に優しいイスがちょうど良い。

Tradcanvas ポータブルダイニングチェア

www.logos.ne.jp

f:id:jinroq:20211219142454j:plain
嫁六のイス

LOGOS の同じモデルの色違い。嫁六の方が少し古いモデルだと思う。同じくアウトドアで使っているのだが、嫁六より子どもらの方がよく使っている(というか、席を奪われている)。

コールマンの謎イス

f:id:jinroq:20211219142908p:plain
イトメンテナンス中

あ、はい。

f:id:jinroq:20211219142954j:plain
子六/子伍のイス

嫁六がコカ・コーラの懸賞で当てたイス。2 つある。アウトドアでは元々このイスを使っていたのだが、懸賞品なので座り心地など一切確認を取っていないし、これらをメインに使っていた頃は当然のように子ども達に席を奪われていた。まぁ、快適なアウトドアライフを送れないので、新しくイスを購入することにした。

Fields の謎イス

f:id:jinroq:20211219143339j:plain
子六/子伍のイスその 2

ナフコで購入したイス。我が家で初めて買ったアウトドア用品でもある。これも 2 つある。元々は那珂川の花火大会観賞用に買ったもので、現在は公園などでサンシェードを設置してご飯を食べるときなどに使ったりする。直近ではディズニーランドのシンデレラのフェアリーテイル・ホール内で、雨に濡れた子どもの靴下を履き替えさせるために使った*1

お気づきになっただろうか?

この記事を読んでいる人は実はやんちゃエフェクトを体験していたのである。先ほど載せたイスの写真は iPhone XS で撮影したものである。そして、俺の PC は elementary OS という Linux ディストリビューションを使っている。elementary OS 6*2では HEIC 形式の画像はデフォルトでは扱えない。その事には elementary OS を導入した初日から気付いていたが、

  1. Google ドライブiPhone XS から写真をアップロードする
  2. elementary OS からブラウザで Google ドライブ上の HEIC 形式画像を表示する
  3. 2 で表示している画像を範囲指定のスクリーンショットで撮影する

という温かみのあることでやり過ごしてきた。が、いい加減めんどくさくなってきたので、ImageMagick で画像変換できるようにした。

HEIC 形式に対応した ImageMagick をソースビルドでインストールする

この見出し名を記事のタイトルにした方がいいのかもしれないけど、ほら、そしたら検索で引っかかっちゃうかもじゃん?そんなの不本意じゃん?詳しくは検索に強いキーワードを使うと恐いことなる件の回を参照してください。

主に以下のサイトを参考に進めていった。

www.virment.com

elementary OS は Ubuntu 派生ディストリビューションなので、これで十分いけるはず。というか、大体いけた。

事前準備

インストール済みの ImageMagick を確認する。

$ identify -version
$ convert -version
$ mogrify -version

最初ノリで aptimagemagick をインストールしたので、6.9 くらいがインストールされていたと思う。これをアンインストールする。

関連するパッケージをインストールする

先述のサイトに書いてあったので特に調べもせず、載っているがままに従った。先にネタバレをすると checkinstall はインストールしなくてもいいと思われ。

$ sudo apt update
$ sudo apt install build-essential checkinstall

これが何のために必要なのか分からんが、HEIC 形式に対応するには必要な手順らしいので、載っているがままに従った*3

$ sudo apt build-dep imagemagick

HEIC 形式に対応するためのパッケージをインストールする

これも載っているがままにインストールした。

$ sudo apt install libwebp-dev libopenjp2-7-dev librsvg2-dev libde265-dev

なんか libopenjp とかバージョン上がってそうだけど、下位互換がちゃんとあるのか分からんので下手に挑戦はしていない。libwebp-dev とかはインストール済みだったりしたけども。

libheif をソースビルドでインストールする

これも載っているがままに従った。

$ git clone https://github.com/strukturag/libheif.git
$ cd libheif
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

最新版の ImageMagick をソースビルドでインストールする

ここから少し変わる。先述のサイトでは wgetソースコードを取得しているが、ImageMagickGitHubソースコードが公開されているので普通に git clone した。

$ git clone https://github.com/ImageMagick/ImageMagick.git

んで、ImageMagick ディレクトリが出来るので、そこに移動して同じ手順をやった。

$ cd ImageMagick
$ ./configure

実行するとこんな感じのログを出力する。

(略)

==============================================================================
ImageMagick 7.1.0-19 is configured as follows. Please verify that this
configuration matches your expectations.

Host system type: x86_64-pc-linux-gnu
Build system type: x86_64-pc-linux-gnu

                  Option                        Value
------------------------------------------------------------------------------
Shared libraries  --enable-shared=yes       yes
Static libraries  --enable-static=yes       yes
Build utilities   --with-utilities=yes      yes
Module support    --with-modules=no     no
GNU ld            --with-gnu-ld=yes     yes
Quantum depth     --with-quantum-depth=16   16
High Dynamic Range Imagery
                  --enable-hdri=yes     yes

Install documentation:              yes

Memory allocation library:
  JEMalloc          --with-jemalloc=no      no
  TCMalloc          --with-tcmalloc=no      no
  UMem              --with-umem=no      no

Delegate library configuration:
  BZLIB             --with-bzlib=yes        yes
  Autotrace         --with-autotrace=no     no
  DJVU              --with-djvu=yes     yes
  DPS               --with-dps=yes      no
  FFTW              --with-fftw=no      no
  FLIF              --with-flif=yes     no
  FlashPIX          --with-fpx=yes      no
  FontConfig        --with-fontconfig=yes   yes
  FreeType          --with-freetype=yes     yes
  Ghostscript lib   --with-gslib=no     no
  Graphviz          --with-gvc=yes      no
  HEIC              --with-heic=yes     yes
  JBIG              --with-jbig=yes     yes
  JPEG v1           --with-jpeg=yes     yes
  JPEG XL           --with-jxl=no       no
  LCMS              --with-lcms=yes     yes
  LQR               --with-lqr=yes      yes
  LTDL              --with-ltdl=no      no
  LZMA              --with-lzma=yes     yes
  Magick++          --with-magick-plus-plus=yes yes
  OpenEXR           --with-openexr=yes      yes
  OpenJP2           --with-openjp2=yes      yes
  PANGO             --with-pango=yes        yes
  PERL              --with-perl=no      no
  PNG               --with-png=yes      yes
  RAQM              --with-raqm=yes     no
  RAW               --with-raw=yes      no
  RSVG              --with-rsvg=no      no
  TIFF              --with-tiff=yes     yes
  WEBP              --with-webp=yes     yes
  WMF               --with-wmf=no       no
  X11               --with-x=           yes
  XML               --with-xml=yes      yes
  ZIP               --with-zip=yes      no
  ZLIB              --with-zlib=yes     yes
  ZSTD              --with-zstd=yes     no

Delegate program configuration:
  GhostPCL          None            pcl6 (unknown)
  GhostXPS          None            gxps (unknown)
  Ghostscript       None            gs (9.50)

Font configuration:
  Apple fonts       --with-apple-font-dir=default   
  Dejavu fonts      --with-dejavu-font-dir=default  none
  Ghostscript fonts --with-gs-font-dir=default      /usr/share/fonts/type1/gsfonts/
  URW-base35 fonts  --with-urw-base35-font-dir=default  none
  Windows fonts     --with-windows-font-dir=default none

X11 configuration:
  X_CFLAGS        = 
  X_PRE_LIBS      =  -lSM -lICE
  X_LIBS          = 
  X_EXTRA_LIBS    = 

Options used to compile and link:
  PREFIX          = /usr/local
  EXEC-PREFIX     = /usr/local
  VERSION         = 7.1.0-19
  CC              = gcc
  CFLAGS          = -I/usr/include/libxml2   -I/usr/include/libpng16  -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/harfbuzz -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/OpenEXR  -I/usr/include/lqr-1 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/openjpeg-2.3  -I/usr/local/include -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16 -pthread  -fopenmp -Wall -g -O2 -mtune=amdfam10 -fexceptions -pthread -DMAGICKCORE_HDRI_ENABLE=1 -DMAGICKCORE_QUANTUM_DEPTH=16
  CPPFLAGS        =  -DMAGICKCORE_HDRI_ENABLE=1 -DMAGICKCORE_QUANTUM_DEPTH=16 
  PCFLAGS         = 
  DEFS            = -DHAVE_CONFIG_H
  LDFLAGS         =  
  LIBS            =  -ljbig -llcms2 -ltiff -lfreetype  -ljpeg   -llqr-1 -lglib-2.0 -lpng16 -lz  -ldjvulibre    -lfontconfig -lfreetype -L/usr/local/lib -lheif -lwebpmux -lwebpdemux -lwebp -lwebp   -lXext -lXt   -lSM -lICE -lX11  -llzma -lbz2 -lIlmImf -lImath -lHalf -lIex -lIexMath -lIlmThread -lpthread -lopenjp2 -lpangocairo-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lharfbuzz -lcairo   -lxml2  -lz     -lm    -lpthread 
  CXX             = g++
  CXXFLAGS        =  -pthread
  FEATURES        = DPC HDRI Cipher OpenMP
  DELEGATES       = bzlib djvu fontconfig freetype heic jbig jng jpeg lcms lqr lzma openexr openjp2 pango png ps tiff webp x xml zlib
==============================================================================

で、HEIC 形式に対応しているかは Delegate library configuration の --with-heic で判断するらしい。--with-heic が yes になっていたら大丈夫らしい。

続いて make を実行する。

$ make
(中略)
cp -f MagickCore/ImageMagick.pc MagickCore/ImageMagick-7.Q16HDRI.pc
cp -f MagickCore/MagickCore.pc MagickCore/MagickCore-7.Q16HDRI.pc
cp -f MagickWand/MagickWand.pc MagickWand/MagickWand-7.Q16HDRI.pc
cp -f Magick++/lib/Magick++.pc Magick++/lib/Magick++-7.Q16HDRI.pc
make[1]: ディレクトリ '/home/jinroq/tools/ImageMagick' から出ます

で、先述のサイトでは checkinstall を実行しているが、これが全然解決できなかった。

checkinstall を実行して失敗するその 1

pkg-deb: エラー: ファイル '/var/tmp/tmp.RfPe4ZMYWK/package/DEBIAN/control' を解析。7 行目付近、パッケージ 'imagemagick':
 'Version' field value '7.1.0-%{Patchlevel}': リビジョン番号に無効な文字があります

checkinstall を実行して失敗するその 2

dpkg-deb: エラー: ファイル '/var/tmp/tmp.OMsRSxy6lS/package/DEBIAN/control' を解析。8 行目付近、パッケージ 'imagemagick':
 `Depends' フィールド、無効なパッケージ名 `%{name}-libs%{?_isa}': 英数字の文字で始まらなければなりません

checkinstall を実行すると以下のような設定 CLI が表示される

(略)
:
このパッケージは以下の内容で構成されます: 

0 -  Maintainer: [ root@ThinkPadE15Gen3adacf9d8 ]
1 -  Summary: [ Use ImageMagick to convert, edit, or compose bitmap images in a variety of formats.  In addition resize, rotate, shear, distort and transform images.
Library links and header files for ImageMagick application development
ImageMagick libraries to link with
DjVu plugin for ImageMagick
ImageMagick HTML documentation
ImageMagick perl bindings
ImageMagick Magick++ library (C++ bindings)
C++ bindings for the ImageMagick library ]
2 -  Name:    [ imagemagick ]
3 -  Version: [ 7.1.0 ]
4 -  Release: [ %{Patchlevel} ]
5 -  License: [ GPL ]
6 -  Group:   [ checkinstall ]
7 -  Architecture: [ amd64 ]
8 -  Source location: [ ImageMagick ]
9 -  Alternate source location: [  ]
10 - Requires: [ %{name}-libs%{?_isa} = %{version}-%{release}
%{name}%{?_isa} = %{version}-%{release}
%{name}-libs%{?_isa} = %{version}-%{release}
%{name}-libs%{?_isa} = %{version}-%{release}
%{name}-libs%{?_isa} = %{version}-%{release}
perl(
%{name}-libs%{?_isa} = %{version}-%{release}
%{name}-c++%{?_isa} = %{version}-%{release}
%{name}-devel%{?_isa} = %{version}-%{release} ]
11 - Recommends: [  ]
12 - Suggests: [  ]
13 - Provides: [ imagemagick ]
14 - Conflicts: [  ]
15 - Replaces: [  ]

どうもこれの %{...} を全て手動で設定しなければならなそうで、「さすがに依存パッケージの名前とか手動で設定するの無理じゃね?」と思った。

で、「なんで checkinstall しないといけないんだっけ?」と思ったら、先述のサイトでは「sudo apt remove でパッケージを削除できるようになる」とあった。

make uninstall があるから別にいらねーな。というか、ソースビルドしてんだから apt とかいらねーじゃん。というわけでビルド手順に書いてある通りに従った。

$ sudo make install

で、これでインストールされたかと思いきや、期待通りに動いてくれない

$ convert -version
convert: error while loading shared libraries: libMagickCore-7.Q16HDRI.so.10: cannot open shared object file: No such file or directory

オブジェクトファイルがないらしい。ぐぐったら以下にたどり着いた。

stackoverflow.com

ldconfig を実行するものらしい。これは先述のサイトに載っていたし、なんなら本家サイトにも載っていた。

$ sudo ldconfig

一応確認。

$ convert -v
Version: ImageMagick 7.1.0-19 Q16-HDRI x86_64 2021-12-18 https://imagemagick.org
Copyright: (C) 1999-2021 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP(4.5) 
Delegates (built-in): bzlib djvu fontconfig freetype heic jbig jng jp2 jpeg lcms lqr lzma openexr pangocairo png tiff webp x xml zlib
Compiler: gcc (9.3)
(以下略)

一応良さげ。

$ convert ~/ダウンロード/drive-download-20211218T055737Z-001/IMG_6802.HEIC ~/ダウンロード/drive-download-20211218T055737Z-001/IMG_6802.jpg

これで無事 HEIC 形式から jpg に変換できてブログにアップロードできたのである。めでたしめでたし。

*1:このイスを常時 2 つ持ってディズニー内を移動してた俺、やばない?

*2:昨日 6.1 にアップデートしたけど 6 でも一緒

*3:なお、俺は build-dep でエラーは出なかったので、エラーが出た場合のやつは飛ばした