mozjpegのwindows用ビルドにチャレンジしてみた。
mozjpegはmozillaが開発している、libjpegおよびlibjpeg-turbo互換のJPEG画像処理ライブラリ。圧縮率と画質の両立を目指して開発されている。
ちょっと手元にある大量のpngファイルを纏めてjpegにしたくなったのだが、このライブラリを使ってそのような処理をしてくれるソフトは無いようだ。ということで作ってみることにした。一番の難所はmozjpegのビルドっぽかったので、本記事はビルドに特化した。
まず、用意したもの。
- Visual Studio 2019 Community Version 16.4.2
- CMake Version 3.16.3
- yasm Version 1.3.0 (SIMD命令を使うバイナリを作るために必要。使わない設定なら不要?)
JPEG圧縮演算のボトルネックはDCT(離散コサイン変換)らしい。んで、これを高速化するアプローチの一つに、それに適したCPUの命令(SIMD)を使う手がある。mozjpegのCMAKEデフォルト設定ではSIMDをサポートするCPUならSIMDを使うことになっているんだけど、そのためにはSIMD命令の書かれたコードをアセンブルできる必要がある。それがYASMやNASMらしい。これが入っていないと、「No CMAKE_ASM_NASM_COMPILER could be found.」って怒られてしまう。対策は、NASMやYASMを入れるか、CMAKEの「WITH_SIMD」のチェックを外せばよい。
自分の環境にはYASM等は入っていなかったので、まずはWITH_SIMDのチェックを外してチャレンジ。特段の問題もなくプロジェクトが生成され、ビルドも成功。
次にYASMを導入してみた。
Visual Studio 2019へYASMを導入するバッチファイルが、以下のGitHubプロジェクトにて公開されていたので活用させてもらった。
動作としては、Visual Studioのインストール先を調べるMicrosoft製のソフトウェアvswhere.exeを使ってインストールされているバージョンを判別し、バージョンに応じた適切な場所にYASMやその設定ファイルをコピーする。また、これらに必要なvswhereや適切なYASMのダウンロードをする。という内容になっている。
バッチファイルを見ると、頭の方にYASMやvswhereのバージョンを指定する場所があるのでこれを書き換え、管理者権限で実行(通常、yasmのコピー先は管理者権限が必要なprogram files以下である)すればインストールできる。
vswhereのバージョンは以下のGitHubプロジェクトにて確認する。
最後に、pathにYASMコピー先を追加する。今回の例では、C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VCだった。
以上より、無事ビルド環境を構築することができた。なお、まだエラーが出る人はうっかり「PNG_SUPPORTED」にチェックをいれてしまっていないか確認すること。
2020/12/23追記:
MozJpegによる画像処理をマルチスレッドで実行するWindowsアプリを作成した。
現在の最新版はVersion 1.2。