Reras-factory

ガジェットとかAppleとかいろいろ

【PowerShell】Squoosh-cliでフォルダ内の画像を圧縮するスクリプトを書いた

  • Web
  • 2022/01/1


squoosh-cliでフォルダ内の画像をまとめて処理したい!

画像を圧縮するには、TinyPngやimageminなどを始め多くのツールが存在します。個人的にはCLIでまとめてサクッと処理したいので、今まで仕事ではimageminを使用してきました。
最近になって流行りの『Squoosh』のCLI版がnpmでリリースされているということで触ってみたのですが、どうやらファイル名を直接指定しなければいけない模様。imageminではソース元にフォルダ名を指定すれば中身を全部圧縮してくれていたのでどうしたものかと考えた結果、画像の枚数分同じ処理をさせるスクリプトを書くことにしました。

PowerShellでフォルダ内のファイルを検索しSquoosh-cliを実行する

npmからsquoosh-cliをインストールします。


npm install @squoosh/cli

対象ファイルを探す

まずソース画像が存在するディレクトリと、書き出し先のディレクトリを変数として定義します。それぞれConvert-Path関数でカレントディレクトリの絶対パスにフォルダ名を連結しています。
そしてソース画像のディレクトリにGet-ChildItemに-Fileオプションを付けて、フォルダ内のファイルを検索します。


#ソースファイルがあるディレクトリ
$targetDir = (Convert-Path .) + '\src\'
#書き出し先ディレクトリ
$destDir = (Convert-Path .) + '\dest\'

#対象ディレクトリのファイルを検索
$itemList = Get-ChildItem $targetDir -File

ファイルの個数分ループする

変数itemListにファイルの一覧が格納されているので、itemListにforeachしてファイルの個数分同じ処理を行います。
一旦fileName変数を作成し、ソースフォルダにファイル名を連結した文字列を格納しておきます。


foreach($item in $itemList){
    $fileName = 'src/' + $item.Name
}

拡張子で処理を振り分ける

次はループ内で実行する処理を書くわけですが、今回処理対象とするjpgとpngは同じエンコーダが使えないので拡張子で振り分けて別のコマンドを実行する必要があります。
そのためGetExtentionメソッドを使用して$fileNameから拡張子文字列を抽出し、jpegではmozjpeg、pngではoxipngを使用するよう振り分けます。


#拡張子で分岐
$fileType = [System.IO.Path]::GetExtension($item.Name)
if($fileType -eq '.jpg'){
    squoosh-cli --mozjpeg '{quality:90}' -d $destDir $fileName
}
if($fileType -eq '.png'){
    squoosh-cli --oxipng '{}' -d $destDir $fileName
}else{
    echo '非対応ファイル'
}

ここからはオプションですが、圧縮後はソースフォルダをクリーンにしたいので$target_Dirの中のファイルを削除します。


#圧縮前のファイルを削除
$targetFile = $targetDir + $item.Name
Remove-Item -Path $targetFile
echo 'Cleaned source File!'

完成したソースコード

foreachとRemove-Itemをforeachの中に入れると以下のようになります。

#ソースファイルがあるディレクトリ
$targetDir = (Convert-Path .) + '\src\'
#書き出し先ディレクトリ
$destDir = (Convert-Path .) + '\dest\'

#対象ディレクトリのファイルを検索
$itemList = Get-ChildItem $targetDir -File
#対象ディレクトリのファイル数分繰り返し
foreach($item in $itemList){
    $fileName = 'src/' + $item.Name

    #拡張子で分岐
    $fileType = [System.IO.Path]::GetExtension($item.Name)
    if($fileType -eq '.jpg'){
        squoosh-cli --mozjpeg '{quality:90}' -d $destDir $fileName
    }
    if($fileType -eq '.png'){
        squoosh-cli --oxipng '{}' -d $destDir $fileName
    }else{
        echo '非対応ファイル'
    }

    #圧縮前のファイルを削除
    $targetFile = $targetDir + $item.Name
    Remove-Item -Path $targetFile
    echo 'Cleaned source File!'
}

#書き出し先を開く
Invoke-Item $destDir

#↓デバッグ用
#pause