cwebp
cwebp コマンドとは、画像ファイルを WebP ファイルに変換するプログラムです。
画像ファイルと言えば、現在最もスタンダードなのが JPEG (ジェイペグ) 形式です。JPEGが登場するまではBMP形式(Windows bitmap 形式)のファイルが主に使われていたという歴史的経緯があります。BMP形式とは、マイクロソフト社とIBM社が考案したファイル形式で BMP ファイルはデータ圧縮技術が使われておらず、名前の通りビットマッピングのローデータに近い状態のまま画像データを保持するものなので、いかんせんファイルサイズの肥大化になやまされていました。
そこでJPEG形式の登場です。JPEGはデータ圧縮してファイル化するので、BMPと比べファイルサイズの削減効果が飛躍的に高まりました。圧縮形式にするデメリットは、ビットマップデータを表示する度に解凍しないといけません。瞬時に表示されるので解凍プロセスを意識させませんが、実際にはJPEGファイルの画像を表示する都度、データを解凍する処理が走っているのです。しかし近年のCPU速度の向上により、我々が今見ているように解凍は瞬時に行われ、表示までの時間も瞬時に行われています。圧縮&解凍の時間が掛からないのであれば、BMP形式は単なるファイルサイズを大きくするだけ、ストレージの負担を増やすだけのものになるので、最近はBMP形式での保存はほぼ無くなってしまいました。
ちなみに、それではBMPの長所はまったく無いのかと言うと、実はそうでもありません。JPEG形式は圧縮する際に画像を間引いているのです。つまり論理的にはBMPよりも確実にJPEGファイルの方が画質が悪いという図式が成立します。JPEGで保存をする際「画質」という項目が多くのツールで存在しているのは、あなたも既に知っているでしょう。この画質の指定が画像データの間引き量の指定なのです。高画質でJPEG化すれば、人間の目では限りなく見分けが付きにくい劣化具合にできますが、その場合、間引き量が少ないため圧縮効果が低く、ファイルサイズが大きくなります。間引けば間引くほど圧縮効果が高まりファイルサイズは小さくなりますが、画質の劣化も激しくなるのです。
BMP形式は圧縮していないので、何度再生成しても一切劣化しませんが、JPEG形式の画像は、それをもとに編集してJPEGで保存という事を繰り返すと、どんどん劣化するという性質があるのです。画像ファイルには非可逆性というキーワードも出てくることがあります。非可逆性とは、一方通行のようなもので一方向へ進んだら元の方向に戻せないことをいいます。BMP形式には非可逆性がありますが、JPEGファイルは劣化するのみなので非可逆性がないということになります。
ただ、画像の劣化も近年の高画素数化すなわち画素数が増えた事により、多少のビットマップレベルでの画質劣化がそれほど人間として気にならなくなりました。それでBMP形式は廃れてJPEG形式の画像ファイルが長年愛用されるようになったというのが歴史の流れです。これまでの説明で理解できたと思いますが、JPEG 形式の画像ファイルはそもそもデータサイズが圧縮されているので、ZIPで圧縮しようと試みたところで大して圧縮効果は認められません。そもそもZIP圧縮でJPEGファイルのサイズを小さくしたところで、いちいちZIP解凍しなければいけないので使い勝手も悪いでしょう。
そこで、新たな画像ファイル形式として WebP 形式が登場しました。WebP 形式は Google 社が考案し次世代の画像フォーマットとして提唱しているので、近い将来、画像ファイル形式のスタンダードが JPEG から WebP へと置き換わることになるでしょう。
では WebP を使うと何が便利になるのか?というと JPEG よりも更なる圧縮効果が期待できるということです。今まで説明してきた通り、圧縮を高めると画質が劣化するという関係性に我々人類は悩んで来ましが、WebP は高圧縮しつつも画質を劣化させないという、まさに次世代の画像ファイル形式なのです。もうこの記事を読んだあなたは、今日から JPEGファイルを WebPファイルに変換しようじゃありませんか。WebPにするだけで、あなたのノートパソコンのストレージや、クラウドストレージが倍増するような感覚になれるのです。
特にクラウドストレージは、ストレージサイズで毎月の支払いが変わるので、高効率で画像ファイルを保管すれば、それは毎月の支払いを安くできるということなのです。
前置きが長くなりましたが、それでは JPEG などの既存の画像ファイルをどのように WebP に変換できるのかの説明に入ります。WebP 形式への変換には cwebp コマンドを使うことで実現できます。cwebp コマンドは、いわゆる「黒い画面」であるコマンドプロンプトから実行するコマンドです。ここからは、ある程度のパソコン中級者以降の話になります。黒い画面なんかわからん!という初心者の方向けにも、後ほど別の方法をご紹介します。
cwebp のインストール方法
MacOS の場合、お馴染みの Homebrew のコマンド一発でインストールできます。
$ brew install webp
参考ページ(Homebrew公式)
https://formulae.brew.sh/formula/webp
インストールの確認は以下の通り cwebp -version を実行して下記のように表示されればOKです。バージョンはそれぞれ異なります。
$ cwebp -version
1.2.0
cwebp の使い方
無事インストールできたのであれば、使い方の説明に入ります。基本構文は以下の通り。
cwebp [オプション] 入力ファイル名 -o 出力ファイル名.webp
説明
cwebp は WebP 形式で画像を圧縮します。
入力形式は、PNG、JPEG、TIFF、WebP、生のY'CbCr データのいずれかです。
アニメーションPNG と WebP ファイルを入力ファイルとすることはできません。
出力ファイルは WebP のみです。ファイル名の拡張子に .webp を忘れずに指定してください。
オプション
基本的なオプションは次のとおりです。
-o string
出力する WebP ファイルの名前を指定します。
省略した場合 cwebp 圧縮は実行されますが、統計のみが出力されます。
出力名を "-" にすると、出力が stdout に送られます。
-- string
入力ファイルを明示的に指定します。このオプションは入力ファイルが '-' で始まる場合に便利です。このオプションは最後に指定しなければなりません。これ以降のオプションは無視されます。
-h, -help
簡単な使用法のヘルプ表示です。-H より簡略化しています。
-H, -longhelp
すべてのオプションについてのヘルプ表示です。-h より細かくなっています。
-version
バージョン番号(major.minor.revision)を出力します。
-lossless
完全に損失なしで画像をエンコードします。完全に透明な領域を持つ画像の場合、非表示のピクセル値(R / G / BまたはY / U / V)は、-exact オプションが使用されている場合にのみ保持されます。
-near_lossless int
ほぼロスレスの画像前処理のレベルを指定します。このオプションは、圧縮性を高めるためにピクセル値を調整しますが、視覚的な品質への影響は最小限です。ロスレス圧縮モードを自動的にトリガーします。範囲は0(最大前処理)から100(前処理なし、デフォルト)です。一般的な値は約60です。損失があると、-q 100 より良い結果が得られる場合があることに注意してください。
-q float
0との間のRGBチャネルの圧縮率を指定します100。デフォルトは75です。
非可逆圧縮(デフォルト)の場合、係数を小さくすると、ファイルが小さくなり、品質が低下します。100 は最高品質の指定です。
可逆圧縮(-losslessオプションで指定)の場合、係数を小さくすると圧縮速度が速くなりますが、ファイルは大きくなります。最大圧縮は100の値を使用します。
-z int
lossless指定されたレベルが0〜9の圧縮モードをオンにします。レベル0が最も速く、9が最も遅くなります。高速モードでは、低速モードよりもファイルサイズが大きくなります。適切なデフォルトは -z 6 です。このオプションは、実際には、品質とメソッドのいくつかの事前定義された設定へのショートカットです。オプション -q または -m が後で使用される場合、それらはこのオプションの効果を無効にします。
-alpha_q int
0 と 100 の間のアルファ圧縮の圧縮率を指定します。アルファの可逆圧縮は、100の値を使用して実現されますが、値が低いと不可逆圧縮になります。デフォルトは 100です。
-preset string
特定のタイプのソースマテリアルに合わせて、事前定義されたパラメータのセットを指定します。可能な値は default、photo、picture、 drawing、icon、text。
-preset は他のパラメータの値を(-qを除いて)上書きするので、このオプションは引数の順番の最初に指定しましょう。
-m int
使用する圧縮方法を指定します。このパラメーターは、エンコード速度と圧縮ファイルのサイズおよび品質の間のトレードオフを制御します。可能な値の範囲は0から6です。デフォルト値は4です。より高い値が使用されると、エンコーダーは追加のエンコードの可能性を検査し、品質の向上を決定するためにより多くの時間を費やします。値を小さくすると、ファイルサイズが大きくなり、圧縮品質が低下する代わりに、処理時間が速くなる可能性があります。
-resize width height
画像を width x height のサイズにします。widthとheightのどちらか一方(両方ではない)が0の場合は、アスペクト比を維持したまま自動的にサイズが計算されます。
-crop x_position y_position width height
画像の左上の座標 (x_position, y_position) を基準として、width と height の範囲を切り抜きます。切り抜く領域はソースの矩形内に完全に含まれていなければなりません。
-mt
可能であれば、エンコードにマルチスレッドを使用します。
-low_memory
非可逆エンコーディングのメモリ使用量を圧縮サイズの4倍(通常の場合)節約します。これによりエンコーディングが遅くなり、出力の大きさや歪みが若干異なります。このフラグは、メソッド 3 以降でのみ有効で、デフォルトではオフになっています。このフラグをオフにすると、ビットストリームにいくつかの副作用が生じることに注意してください。パーティションの数(強制的に1にする)など、特定のビットストリーム機能が強制されます。このオプションを使用すると、ビットストリームのサイズに関するより詳細なレポートが出力されることに注意してください。
不可逆オプション
これらのオプションは、不可逆エンコーディング(デフォルト、アルファありまたはなし)を実行する場合にのみ有効です。
-size int
圧縮出力を試行して到達するターゲットサイズ(バイト単位)を指定します。コンプレッサーは、このターゲットにできるだけ近づくために、部分的なエンコードを数回パスします。との両方-sizeを -psnr使用すると、-size値が優先されます。
-psnr float
圧縮出力に到達するためのターゲットPSNR(dB単位)を指定します。コンプレッサーは、このターゲットにできるだけ近づくために、部分的なエンコードを数回パスします。との両方-sizeを-psnr使用すると、 -size値が優先されます。
-pass int
オプション -size または -psnr で使用される二分法の際に使用するパスの最大数を設定します。 最大値は 10 で、デフォルトは 1 です。オプション -size または -psnr が使用され、-pass が指定されなかった場合、デフォルト値の「6」パスが使用されます。
-af
自動フィルターをオンにします。このアルゴリズムは、バランスの取れた品質に到達するためにフィルタリング強度を最適化するために追加の時間を費やします。
-jpeg_like
JPEG圧縮の予想サイズによりよく一致するように、内部パラメータマッピングを変更します。このフラグは通常、同等のJPEG(同じ-q設定の場合)と同様のサイズの出力ファイルを生成しますが、視覚的な歪みは少なくなります。
高度なオプション:
-f int
非ブロック化フィルターの強度を、0(フィルタリングなし)から100(フィルタリング最大)の間で指定します。0を設定すると、フィルタリングは一切行われません。値が大きいほど、画像をデコードした後に適用されるフィルタリング処理の強さが増します。値が大きいほど、画像はより滑らかになります。一般的な値は、20~50の範囲です。
-sharpness int
フィルタリングのシャープネスを指定します(使用する場合)。
範囲は0(最も鋭い)から7(最も鋭くない)です。デフォルトは0です。
-strong
強力なフィルタリングを使用します(-f オプションのおかげでフィルタリングが使用されている場合)。強力なフィルタリングはデフォルトでオンになっています。
-nostrong
強力なフィルタリングを無効にし(-f オプションのおかげでフィルタリングが使用されている場合)、代わりに単純なフィルタリングを使用します。
-sharp_yuv
必要に応じて、より正確でシャープな RGB->YUV変換を使用します。このプロセスは、デフォルトの「高速」RGB->YUV変換よりも遅いことに注意してください。
-sns int
空間ノイズシェーピングの振幅を指定します。空間ノイズシェーピング(または略してsns)は、画像のどの領域で比較的少ないビットを使用するか、およびこれらのビットをより適切に転送する場所を決定するために使用される組み込みアルゴリズムの一般的なコレクションを指します。可能な範囲は 0(アルゴリズムがオフ)から100(最大効果)までです。デフォルト値は 50 です。
-segments int
snsアルゴリズムのセグメンテーションの際に使用するパーティションの数を変更します。
パーティションの数は 1 から 4 の範囲で指定します。デフォルト値は4です。
このオプションは、-low_memory が使用されていなければメソッド3以降に影響しません。
-partition_limit int
一部のマクロブロックで使用するビット数を制限して品質を劣化させます。範囲は0(劣化なし、デフォルト)から100(完全劣化)です。中程度の大きさの画像の場合、有用な値は通常30~70程度です。VP8フォーマットでは、コントロールパーティションと呼ばれるパーティションの上限は512kで、マクロブロックをスキップするかどうか、どのセグメントに属するか、イントラ4x4モードとイントラ16x16モードのどちらでコーディングするか、最後に各サブブロックに使用する予測モードなどの情報を格納するために使用されます。非常に大きな画像の場合、512kでは16x16マクロブロックあたり数ビットの余裕しかありません。マクロブロックあたりのビット数は最低でも4ビットです。スキップ、セグメント、モードなどの情報がこの4ビットのほとんどを使ってしまう可能性があり(そのようなケースはほとんどありませんが)、非常に大きな画像の場合には問題となります。partition_limit係数は、最もビットコストの高いモード(イントラ4x4)をどのくらいの頻度で使用するかを制御します。これは、512k の制限に達して次のようなメッセージが表示された場合に役立ちます。
Error code: 6 (PARTITION0_OVERFLOW: Partition #0 is too big to fit 512k). partition_limitを使っても512kの制限に満たない場合は、マクロブロックあたりのヘッダビットをより多く節約するために、セグメントの数を少なくする必要があります。segmentsオプションを参照してください。
ロギングオプション
これらのオプションは、出力のレベルを制御します。
-v
追加情報(特にエンコード時間)を出力します。
-print_psnr
平均PSNR(ピーク信号対雑音比)を計算して出力します。
-print_ssim
平均SSIMを計算して出力します(構造的類似性メトリック。詳細については、 http://en.wikipedia.org/wiki/SSIMを参照してください)。
-print_lsim
ローカル類似性メトリック(併置された隣接ピクセル間の最小エラーの合計)を計算して出力します。
-progress
エンコードの進行状況をパーセントで出力します。
-quiet
何も出力しません。
-short
テスト目的で、簡単な情報(出力ファイルサイズとPSNR)のみを出力します。
-map int
エンコーディング情報の追加のASCIIマップを出力します。可能なマップ値の範囲は1から6です。これは、デバッグを支援することのみを目的としています。
追加オプション
より高度なオプションは次のとおりです。
-s width height
入力ファイルが、ITU-R BT.601勧告に準拠した、4:2:0リニアフォーマットのY'CbCr生サンプルで構成されていることを指定します。輝度面のサイズは width x height です。
-pre int
いくつかの前処理ステップを指定します。の値を使用すると、2RGBA-> YUVA変換中に品質に依存する疑似ランダムディザリングがトリガーされます(不可逆圧縮のみ)。
-alpha_filter string
アルファプレーンの予測フィルタリング方法を指定します。複雑さと遅さの順に、none、fast、bestのいずれかを指定します。デフォルトは fast です。内部的には、アルファフィルタリングは4つの可能な予測(none、horizontal、vertical、gradient)を使用して実行されます。ベストモードでは、各モードを順に試し、より小さいサイズになるものを選びます。fastモードでは、すべてのモードを試すことなく、先験的な推測を試みます。
-alpha_method int
アルファ圧縮に使用するアルゴリズムを 0 または 1 で指定します。アルゴリズム 0 は圧縮しないことを示し、1 は WebP ロスレス形式で圧縮することを示します。デフォルトは1です。
-exact
透過部分のRGB値を保持します。デフォルトはオフで、圧縮性を高めるために設定されています。
-blend_alpha int
このオプションは、アルファチャンネル(存在する場合)を、16進数で0xrrggbbと指定された背景色を使ってソースにブレンドします。アルファチャンネルはその後、不透明な値である 255 にリセットされます。
-noalpha
このオプションを使用すると、アルファチャネルが破棄されます。
-hint string
入力画像タイプに関するヒントを指定します。
指定可能な値は photo、 picture、graph です。
-metadata string
入力から出力にコピーするメタデータのコンマ区切りリスト(存在する場合)。有効な値は、all、none、exif、icc、xmpです。デフォルトはnoneです。
各入力フォーマットは、すべての組み合わせに対応していない場合があることに注意してください。
-noasm
すべてのアセンブリ最適化を無効にします。
実行サンプル
cwebp -q 50 -lossless picture.png -o picture_lossless.webp
cwebp -q 70 picture_with_alpha.png -o picture_with_alpha.webp
cwebp -sns 70 -f 50 -size 60000 picture.png -o picture.webp
cwebp -o picture.webp -- ---picture.png