画像比較に特化した高性能ツール、Odiffについて解説します。このツールは既存のソリューションよりも大幅に高速で、かつオープンソースです。
驚異的な速度
Odiffは他の画像比較ツールと比較して圧倒的な速度を実現しています。例えば、ImageMagickが8.8秒かかるところ、Odiffは1.2秒で処理を完了します。特に高解像度(8K)の画像においてその差は顕著で、従来のツールが9-10秒かかるところ、Odiffはわずか2秒しかかかりません。
技術的詳細
Odiffは元々OCamlで書かれましたが、現在はZig言語で再実装されています。SSE2、AVX2、AVX512、NEONなどの命令セットを利用し、CPUの並列計算能力を最大限に活用することで高速処理を実現しています。
// Zigでの簡単な例
var pixelData: [4]u8 = undefined;
pixelData[0] = 255; // 赤色成分
pixelData[1] = 0; // 緑色成分
pixelData[2] = 0; // 青色成分
pixelData[3] = 255; // アルファ値
豊富な機能
高速性だけでなく、機能も充実しています。異なる形式の画像(jpg、pngなど)をそのまま比較可能で、YIQ NTSCアルゴリズムを使用して視覚的な違いを正確に検出します。また、抗エイリアシング検出や特定領域の無視など高度なオプションもサポートしています。
使い方の簡単さ
インストールは非常に簡単で、npmパッケージを使用できます:
npm install img-compare-bin
コマンドラインから使用する例:
img-compare base.png compare.png diff.png
Node.jsコード内で使う場合:
const { compareImages } = require('img-compare-bin');
const { match, reason } = await compareImages('path/to/first.png', 'path/to/second.png', 'path/to/diff.png');
console.log(match); // true または false
console.log(reason); // 不一致の理由
サーバーモードの利用
大量の画像を比較する際にはサーバーモードが便利です。同一プロセスを使って複数回の比較を行うため、起動時間の節約になります。
const { ImgCompareServer } = require('img-compare-bin');
const server = new ImgCompareServer();
const result1 = await server.compare('a.png', 'b.png', 'diff1.png');
const result2 = await server.compare('c.png', 'd.png', 'diff2.png');
server.stop();
統合の簡便さ
PlaywrightやCypressなどのテストフレームワークとも簡単に統合可能です。たとえば、Playwrightでは以下のプラグインを使います:
npm install playwright-img-compare
テストファイル内:
import 'playwright-img-compare/setup';
expect(page).toHaveScreenshotCompare('screenshot-name');
完全オープンソース
OdiffはMITライセンスの下で公開されており、GitHub上でコードを確認できます。Windows、Mac、Linuxに対応したバイナリも提供されています。