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

1661 語
8 分
【PowerShell】JPEGやPNGの画像ファイルをWEBP形式に変換するCwebpを使う

はじまり#

リサちゃん avatar
リサちゃん
うーん、画像を1枚ずつWebpに変えるのが面倒だな・・・。
135ml avatar
135ml
じゃあ一括で変えられるようにしよう。

※当ページはアフィリエイト広告を利用しています。

画像のサイズを小さくしたい#

というのが、今回の記事の主旨です。

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」をインストールします。

Terminal window
cd \ # Change to "C:\" directory.
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
cd C:\Users\%USERNAME%\Downloads\picture_backup
scoop update
scoop install libwebp

以下のhelpコマンドが動いたら、「Cwebp」をコマンドで使う準備は整いました!

Terminal window
cwebp -h

Webpに変換するコード#

今回出来たコードはこちらです。こちらの記事を参考にさせていただきました。

Terminal window
$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関連の書籍#

動くサンプルで学べる Windows PowerShell コマンド&スクリプティングガイド PowerShell 4.0対応amzn.to
Amazon.co.jpで購入する
PowerShell実践ガイドブック クロスプラットフォーム対応の次世代シェルを徹底解説amzn.to
Amazon.co.jpで購入する

おしまい#

リサちゃん avatar
リサちゃん
ああ、これで100枚の画像を一気にWebpに出来る!
135ml avatar
135ml
かなりダウンサイズ出来るな。

以上になります!

記事を共有

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

【PowerShell】JPEGやPNGの画像ファイルをWEBP形式に変換するCwebpを使う
https://endorphinbath.com/posts/powershell-convert-jpg-to-webp/
著者
kinkinbeer135ml
公開日
2024-06-06
ライセンス
CC BY-NC-SA 4.0
Profile Image of the Author
kinkinbeer135ml
SIerをやめて、プログラミングを勉強しています。※Amazonアソシエイトに参加しています。
お知らせ
私のブログへようこそ!これはサンプルのお知らせです。
音楽
カバー

音楽

再生中なし

0:00 0:00
歌詞なし
カテゴリ
タグ
サイト統計
記事
287
カテゴリー
8
タグ
93
総文字数
486,174
運用日数
0
最終活動
0 日前

目次