cwebpを使ってフォルダ内のJPG・PNG画像をWebP形式へ一括変換するスクリプト【Windows編】


# あらすじ

Windows上で画像をwebp形式に一括変換する話です。
Macの人向けの記事は@tomokei5634さんが書いている[こちら](https://qiita.com/tomokei5634/items/64b0f0b2246987936c6f)です。
動作仕様や、使い方などは@tomokei5634さんのスクリプトとほぼ同じです。

# 次世代フォーマットでの画像の配信

SEOの改善項目の中でも大きな指標である、ページスピード。[Speed Insight](https://developers.google.com/speed/pagespeed/insights/)もしくは、Google Chrome 52 以降に付属する[Light House](https://developers.google.com/web/tools/lighthouse?hl=ja)を使って計測する人は多いと思います。

計測してみると、改善項目の中に例えば「適切なサイズの画像」「画像次世代フォーマットでの画像の配信」と並んでいたりします。

「適切なサイズ」というのは、実表示サイズに対して、大きすぎる画像が置いてあり、縮小して表示しているから、時間と通信費がモッタイナイということですね。

問題の「画像次世代フォーマットでの画像の配信」では、画像の形式について触れられています。

「WebP や AVIF などの画像形式は、一般的に PNG や JPEG より圧縮率が高く、ダウンロード時間やデータ消費量が抑えられます。」とのことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/e04cbf62-abc3-50cf-e99f-ea88bc4f440f.png)

WordPressでは、Wordpress上でWebpに一括変換してくれる[webp-express](https://ja.wordpress.org/plugins/webp-express/)や、サニタイズしてSVGを使える[svg-support](https://wordpress.org/plugins/svg-support/)といったプラグインを入れたりすれば一瞬で改善できます。

しかし、[BASE](https://thebase.in/)のようなSaasでは、そもそもWebPに対応していなかったりします。(2021年09月の時点)

https://thebase.in/

# 大量の画像をWebPにしたい

上記の測定結果をもとに、PC上に置いてある大量の画像を一括でWebP形式に変換したいという要望が生まれることと思います。それを実現するスクリプトを書きました。便利なので、皆さんに使っていただけたらなと思います。

# メインのPowershellスクリプト

`main.ps1`というファイルを作成して、中に下記をコピペして使ってください。

```posh:main.ps1
$TargetFolder = "."

if ($null -ne $Args[0]) {
    $TargetFolder = $Args[0]
}

$Files = (Get-ChildItem $TargetFolder -Recurse -Name -File -Include "*.jpg")
$Files += (Get-ChildItem $TargetFolder -Recurse -Name -File -Include "*.png")

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 icc -sharp_yuv -o $GenerateFileName -progress -short $FullName
    Write-Output "----------------"
}
```

# スクリプトの使い方

使い方は、Powershellコンソールで`main.ps1`の置いてあるフォルダに移動して、`./main.ps1 <目的の画像が大量にあるフォルダのアドレス>`という実行コマンドを入力するだけです。

具体的な流れは、以下を参考にしてください。

※あらかじめwebpをインストールしてください。

1. `./photo_bin/`に変換したい画像をすべて入れる
    - サブフォルダの中に画像があってもOK
    - すでにあるフォルダを`./photo_bin/`に見立てても大丈夫
1. `./path_to_script/`の中に`main.ps1`を作成
    - 上記のスクリプトをコピーペーストしてテキストファイルを作成
    - メモ帳でもVScodeでもなんでもよい
    - 拡張子は`.txt`ではなく`.ps1`なので注意
1. Powershell を開く
    - ユーザー権限でOK
    - バージョンは6以降がオススメ
1. `./path_to_script/`に移動
    1. `cd`と入力
    1. 続けて` `と入力（スペースキー）
    1. 続けて`./path_to_script/`と入力
    1. Enterキー
1. 変換実行
    1. `./main.ps1`と入力
    1. 続けて` `と入力（スペースキー）
    1. 続けて`./photo_bin/`をキーボード入力
    1. そのままEnterキー

ちなみに、実行コマンドを`./main.ps1 <目的の画像が大量にあるフォルダのアドレス>`とした場合、 `<目的の画像が大量にあるフォルダのアドレス>`というのは一般に`引数`と呼ばれます。これを指定せずに空白で実行コマンドを入力したとき、このスクリプトでは`./main.ps1`と同じフォルダ以下を指定して画像を変換するようになっています。

また、指定された場所に画像が無い場合には、何も実行しません。

# 動作確認済環境

- Windows 10 Home 21H1
- Powershell 7.1
- cwebp 1.0.0

※筆者の場合、あらかじめ`choco install webp -y`でwebp変換ツールをインストールしています。ほかのインストール方法は別途ググってください。

※筆者の場合、あらかじめ`choco install pwsh -y`で Powershell 7 をインストールしています。従来のインストール方法は[Microsoftの公式ドキュメント](https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-core-on-windows)を見てください。

※筆者と同じ方法を使いたい方は[chocolateyのインストールページ](https://chocolatey.org/install)を参考にしてください。

# Macユーザーはこちら

https://qiita.com/tomokei5634/items/64b0f0b2246987936c6f

# cwebpのさらに詳しい使い方

https://developers.google.com/speed/webp/docs/cwebp

# Google DevelopersでのWebpに関する説明

https://web.dev/uses-webp-images/

# スクリプトを書くのが面倒な場合

XnConvertというソフトがオススメです。買い切りライセンスでリーズナブルな価格設定となっております。使い方は簡単で、説明書きを読まなくても「なんとなく」で使える感じです。

https://www.xnview.com/en/xnconvert/

**Excelsior!**