【PowerShell】JPEGやPNGの画像ファイルをWEBP形式に変換するCwebpを使う
はじまり


※当ページはアフィリエイト広告を利用しています。
画像のサイズを小さくしたい
というのが、今回の記事の主旨です。
JPEGとかPNGって重いんですよね。
スマホのカメラで何かしらを撮影すると大体JPEG形式になりますよね。また、スクリーンショットを撮ると、JPEGだったりPNGだったりで保存されます。
しかし、これらの拡張子で保存された画像ファイルは重いことに気付きました。まあ、PNGの拡張子が開発されたのは1990年代らしいですし、JPEGに至っては1980年代後半らしいです。そりゃあ、30年以上前の規格よりも効率的な拡張子がホイホイ存在していても、何ら不思議なことではない。

そこで今回は、JPEGやPNGよりもサイズが軽くて同程度の画質の画像を実現できる「WEBP」拡張子の画像を作っていきます。
WEBPは、Googleによって2010年に初版が発行された画像フォーマットです。(2010年となると、現在の情報化社会の時代ではそんなに新しくもない気がしてしまいますが、前述のヤツらよりはよっぽど新しいです。) WEBPはアルファチャンネルを持っているので、PNGからの変換も可能になります。
これまではSquooshを使っていたが・・・
最近までは、「Squoosh」というGoogleから提供されている画像圧縮かつWebpに変換できるツールを利用していました。
同じWebp形式への圧縮でも、他のサービスと比べて圧縮率が高く、気に入って使っていたのですが、1つ難点として、「1枚ずつしか圧縮することが出来ない」というのがありました。
一気にWebpに変換できるツールを作りたい
Squooshのように1枚1枚圧縮率などを設定するほどのこだわりが無いのであれば、一気に変換できた方が良いですね。
ということで今回は、Powershellを使って、フォルダ内にあるJPGなどの画像をWebpに変換するコマンドを練っていきましょう。
以前にExif情報から画像ファイルをリネームして、その画像をjpgやpngからwebpに変換して、このwebp画像に再びExif情報を反映するツールを作りましたが、この時はSquooshでwebp画像を作っていました。

Cwebpというものを使う
Powershellから画像をWebpに変換するためのツールに、「Cwebp」というものを使います。
Cwebpは、Webpを開発しているGoogleによって提供されているツールで、「Libwebp」というライブラリの中の一機能になります。
Cwebpのリファレンスはこちらになります。

Cwebpのインストール
Cwebpは、Powershellにビルトインされているライブラリではないので、インストールします。
公式からダウンロードできるリポジトリが提供されてはいますが、僕の場合は上手くインストールできませんでした。
そこで今回は、「Scoop」というパッケージ管理ツールを使って、「Cwebp」の機能を持つライブラリである「Libwebp」をインストールしたいと思います。

Powershell を開いたら、 C ドライブのルートディレクトリに移動して、「Scoop」のインストール後、「Libwebp」をインストールします。
cd \ # Change to "C:\" directory.Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUserInvoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expressioncd C:\Users\%USERNAME%\Downloads\picture_backupscoop updatescoop install libwebp以下のhelpコマンドが動いたら、「Cwebp」をコマンドで使う準備は整いました!
cwebp -hWebpに変換するコード
今回出来たコードはこちらです。こちらの記事を参考にさせていただきました。
$TargetFolder = ".";if ($null -ne $Args[0]) { $TargetFolder = $Args[0];};$Files = (Get-ChildItem $TargetFolder -Name -File -Include "*.jpg");$Files += (Get-ChildItem $TargetFolder -Name -File -Include "*.png");$updatedCount = 0;foreach ($File in $Files) { $FullName = "$TargetFolder/$File"; $Extension = (Get-Item $FullName).Extension; $GenerateFileName = "$($FullName.Substring(0,$FullName.Length-$Extension.Length)).webp"; Write-Output "<Source File Name: $File>"; cwebp -preset photo -metadata "exif,icc" -sharp_yuv -q 75 -o $GenerateFileName -progress -short $FullName; $updatedCount++; Write-Output "----------------";};Write-Output("{0} .webp images converted." -f $updatedCount);以下のフォルダの状態で実行すると・・・、

実行後はこんな感じに画像がWebpに変換されます。

実行するとこんな感じにログが出力されます。
<Source File Name: 20240605_01.png> 67734 42.67----------------<Source File Name: 20240605_10.png> 68358 42.78----------------<Source File Name: 20340605_07.png> 25408 41.78----------------3 .webp images converted.上記で使用した、cwebpコマンドのオプションは以下になります。
| オプション | 効果 |
|---|---|
| -metadata | 変換前から変換後のファイルにメタ情報をコピーすることが出来る。(all, none, exif, icc, xmp から選ぶ。カンマ区切りでも表記できる。) |
| -sharp_yuv | より圧縮率を上げることが出来る。しかし、圧縮速度が遅くなるらしい。 |
| -progress | 変換中の進捗度を表示する。 |
| -short | 変換後のファイルサイズとPSNR(Peak-Signal-To-Noise ratio: 平たく言うと「劣化していない」率のこと。)の情報だけを表示する。 |
| -q | 変換前の画質を100とした場合の、変換後の圧縮率。 |
| -o | 変換後の絶対ファイル名。 |
Webp に変換する前とその後の比較
Webp に変換する前後の画像の画質を比較してみます。
PNG から WEBP に変換する
こちらが変換前の PNG です。

こちらが変換後の WEBP です。

ほとんど変化はないと思います。 これで、この画像の場合、容量が 974 KB → 67 KB にダウンサイズされるので、 Webp は例えばクラウドストレージを使う上で頭を悩ませる容量不足には、もってこいの拡張子です。
JPG から WEBP に変換する
こちらが変換前の JPG です。

こちらが変換後の WEBP です。

この画像の場合、容量が 401 KB → 248 KB にダウンサイズされます。先程よりは圧縮率が低いです。さっきの PNG 画像は黒い部分が多かったから圧縮率が高かったのでしょうか。
まとめ
本記事のまとめです。
- 画像のサイズを小さくしたい: JPEG と PNG のサイズの重さと WEBP の利点
- Cwebp のツール紹介
- Cwebpのインストール: インストール手順
- Webpに変換するコード: Powershell コードの紹介
- Webpに変換する前とその後の比較: PNG と JPG の2パターン
これでデジタル資産のサイズを減らせる嬉しい!
Powershell関連の書籍
おしまい


以上になります!
記事を共有
この記事が役に立ったなら、ぜひ他の人と共有してください!