0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windowsで画像を一括WebP変換・軽量化するバッチファイル【FFmpeg】

0
Posted at

ブログやWebサイトで使用する画像は、PNGやJPEGのままアップロードするとファイルサイズが大きくなりがちです。

画像編集ソフトやオンライン圧縮サービスを使う方法もありますが、画像の枚数が多いと毎回操作するのが面倒です。

そこで私は、WindowsのバッチファイルとFFmpegを使い、指定フォルダ内の画像をまとめてWebPへ変換しています。

この方法なら、次の作業をバッチファイルのダブルクリックだけで実行できます。

  • PNG・JPG・JPEGをまとめてWebPへ変換
  • 縦横比を維持したまま最大1200pxへ縮小
  • WebP品質を指定して軽量化
  • ファイル名に変換日を追加
  • 元画像を残したまま別フォルダへ出力

この記事では、特定のパソコン環境に依存しない、持ち運び可能なバッチファイルを紹介します。

完成後のフォルダ構成

最初に、次のようなフォルダを作成します。

image-webp-converter/
├─ convert-to-webp.bat
├─ before/
└─ after/

それぞれの役割は次のとおりです。

  • convert-to-webp.bat:画像変換を実行するバッチファイル
  • before:変換前の画像を入れるフォルダ
  • after:変換後のWebP画像が保存されるフォルダ

beforeafterフォルダは、存在しない場合でもバッチファイルの実行時に自動作成されます。

必要なもの

このバッチファイルでは、画像変換にFFmpegを使用します。

事前にFFmpegをインストールし、コマンドプロンプトから次のコマンドを実行できる状態にしておいてください。

ffmpeg -version

バージョン情報が表示されれば準備完了です。

「ffmpegは内部コマンドまたは外部コマンドとして認識されていません」と表示される場合は、FFmpegがインストールされていないか、環境変数のPATHが設定されていません。

WebPへ一括変換するバッチファイル

以下のコードをテキストエディターへ貼り付け、convert-to-webp.batという名前で保存します。

@echo off
setlocal EnableExtensions
chcp 65001 >nul

rem ========================================
rem 基本設定
rem ========================================

rem バッチファイルが置かれているフォルダ
set "BASE_DIR=%~dp0"

rem 入力・出力フォルダ
set "INPUT_FOLDER=%BASE_DIR%before"
set "OUTPUT_FOLDER=%BASE_DIR%after"

rem 画像の縦・横の最大サイズ
set "MAX_SIZE=1200"

rem WebPの品質(0~100)
set "QUALITY=75"

rem ========================================
rem FFmpegが使用できるか確認
rem ========================================

where ffmpeg >nul 2>&1

if errorlevel 1 (
    echo [ERROR] FFmpegが見つかりません。
    echo FFmpegをインストールし、PATHを設定してください。
    echo.
    pause
    exit /b 1
)

rem ========================================
rem フォルダを作成
rem ========================================

if not exist "%INPUT_FOLDER%" mkdir "%INPUT_FOLDER%"
if not exist "%OUTPUT_FOLDER%" mkdir "%OUTPUT_FOLDER%"

rem ========================================
rem 現在の日付をYYYYMMDD形式で取得
rem ========================================

for /f %%I in ('powershell -NoProfile -Command "Get-Date -Format yyyyMMdd"') do set "TODAY=%%I"

rem 変換対象が見つかったかを記録
set "FOUND=0"

rem ========================================
rem PNG・JPG・JPEGをWebPへ変換
rem ========================================

for %%E in (png jpg jpeg) do (
    for %%F in ("%INPUT_FOLDER%\*.%%E") do (
        if exist "%%~fF" (
            set "FOUND=1"

            echo [変換中] %%~nxF

            ffmpeg ^
                -hide_banner ^
                -loglevel error ^
                -y ^
                -i "%%~fF" ^
                -vf "scale='min(%MAX_SIZE%,iw)':'min(%MAX_SIZE%,ih)':force_original_aspect_ratio=decrease" ^
                -c:v libwebp ^
                -q:v %QUALITY% ^
                "%OUTPUT_FOLDER%\%%~nF_%TODAY%_%%E.webp"

            if errorlevel 1 (
                echo [ERROR] %%~nxF の変換に失敗しました。
            )
        )
    )
)

echo.

if "%FOUND%"=="0" (
    echo 変換対象の画像が見つかりませんでした。
    echo beforeフォルダにPNG、JPG、JPEG画像を入れてください。
) else (
    echo 画像の変換が完了しました。
    echo 保存先: %OUTPUT_FOLDER%
)

echo.
pause
endlocal

使い方

使い方は非常にシンプルです。

  1. beforeフォルダへ変換したい画像を入れる
  2. convert-to-webp.batをダブルクリックする
  3. afterフォルダを確認する

例えば、beforeフォルダに次の画像を入れたとします。

sample.jpg
main-image.png
thumbnail.jpeg

2026年7月27日に実行した場合、afterフォルダには次のようなファイルが作成されます。

sample_20260727_jpg.webp
main-image_20260727_png.webp
thumbnail_20260727_jpeg.webp

元の拡張子をファイル名に含めているのは、同じ名前のPNGとJPEGが存在した場合に、出力ファイルが上書きされるのを防ぐためです。

スクリプトのポイント

バッチファイルを基準にフォルダを指定

次の部分では、バッチファイル自身が置かれているフォルダを取得しています。

set "BASE_DIR=%~dp0"

%~dp0には、現在実行しているバッチファイルのドライブ名とフォルダパスが入ります。

そのため、次のようなパソコン固有の絶対パスを書く必要がありません。

set "INPUT_FOLDER=D:\image-converter\before"

バッチファイルを別のパソコンや別のフォルダへ移動しても、フォルダ構成を維持していればそのまま使用できます。

PowerShellで日付を取得

現在の日付は、PowerShellを利用して取得しています。

for /f %%I in ('powershell -NoProfile -Command "Get-Date -Format yyyyMMdd"') do set "TODAY=%%I"

例えば2026年7月27日に実行すると、TODAYには次の値が入ります。

20260727

この値を出力ファイル名に追加しています。

長辺を最大1200pxへ縮小

画像サイズの変更は、次のFFmpegフィルターで行っています。

-vf "scale='min(1200,iw)':'min(1200,ih)':force_original_aspect_ratio=decrease"

この設定では、画像の縦横比を維持したまま、幅と高さが最大1200px以内になるように縮小されます。

例えば、横2000px・縦1500pxの画像は、横1200px・縦900pxになります。

一方、もともと横800px・縦600pxの画像は拡大されず、そのままのサイズで出力されます。

WebP品質を指定

WebPの品質は、次の変数で設定しています。

set "QUALITY=75"

この値は0から100まで指定でき、数字が高いほど高画質になりますが、ファイルサイズも大きくなります。

ブログやWebサイト用の画像であれば、まずは70〜85程度で試し、実際の見た目とファイルサイズを比較するのがおすすめです。

今回の75は、画質と軽量化のバランスを重視した設定です。

元画像は削除されない

このスクリプトは、beforeフォルダ内の画像を削除しません。

変換後の画像は、すべてafterフォルダへ保存されます。

変換結果を確認してから元画像を整理できるため、誤って大切な画像を失う心配を減らせます。

画像サイズを変更する方法

最大サイズを変更したい場合は、次の数字を書き換えます。

set "MAX_SIZE=1200"

例えば、最大幅・高さを1600pxにしたい場合は次のようにします。

set "MAX_SIZE=1600"

サムネイル用として最大800pxにしたい場合は、次の設定です。

set "MAX_SIZE=800"

WebP品質を変更する方法

さらに軽量化したい場合は、品質を下げます。

set "QUALITY=65"

画質を優先したい場合は、品質を上げます。

set "QUALITY=85"

画像の種類によって適切な数値は異なります。

写真では多少品質を下げても違いが目立ちにくい場合がありますが、文字や図解を含む画像では、品質を下げすぎると輪郭がぼやけることがあります。

出力ファイル名を変更する方法

現在は、次の形式で保存されます。

元のファイル名_日付_元の拡張子.webp

該当するのは、FFmpegコマンドの最後にある次の部分です。

"%OUTPUT_FOLDER%\%%~nF_%TODAY%_%%E.webp"

日付だけを追加し、元の拡張子を含めたくない場合は、次のように変更できます。

"%OUTPUT_FOLDER%\%%~nF_%TODAY%.webp"

この場合、出力結果は次のようになります。

sample_20260727.webp

ただし、sample.pngsample.jpgのように、同じ名前で拡張子だけが異なる画像があると、後から変換されたファイルによって上書きされる可能性があります。

上書きを禁止したい場合

現在のスクリプトでは、FFmpegに-yを指定しています。

-y

これは、同名の出力ファイルが存在した場合に、自動的に上書きする設定です。

上書きしたくない場合は、-y-nへ変更します。

-n

-nを指定すると、同じ名前のファイルが存在する場合は変換をスキップします。

まとめ

FFmpegとWindowsのバッチファイルを組み合わせることで、複数の画像を簡単にWebPへ変換できます。

今回のスクリプトでは、次の処理を自動化しました。

  • PNG・JPG・JPEGの一括変換
  • 最大1200pxへの縮小
  • 縦横比の維持
  • WebP形式への軽量化
  • 日付付きファイル名の作成
  • 入力・出力フォルダの自動作成
  • FFmpegの存在確認

一度バッチファイルを作ってしまえば、その後はbeforeフォルダへ画像を入れてダブルクリックするだけです。

ブログ記事の画像、YouTube用の素材、Webサイトの商品画像など、大量の画像を定期的に軽量化したい場合に便利です。

なお、変換後の画像は必ず実際に開き、画質や透過部分、ファイルサイズなどを確認してから本番環境で使用してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?