画像の容量(サイズ)をBATファイルを用いてワンクリックで自動で小さくする方法
画像の容量が大きすぎる問題
日頃、様々な画像ファイルや写真を扱う機会があります。
私の場合はWebエンジニアとして活動しているためWebサイトに使用します。
Webサイトは読み込みを可能な限り高速化するためにあの手この手でページ速度を速くする工夫をするのですが、特に画像の容量がネックになります。
容量について
日本語が多くの場合2~3バイトなのに比べて圧縮していないスマホの写真は約5MBです。
(撮影機:Xiaomi POCO M7 Pro 5G)
その差は約1740000倍となります。
画像ファイル形式の種類
画像ファイルに圧縮を掛けて限りなく小さなサイズにしたいですよね。
そこで注目するべきは拡張子になります。
画像の拡張子には主にPNGやJPG、Webp、AVIFなどがあります。
それぞれの特徴は以下の通りです。
- PNG
-
ロゴやイラスト、スクリーンショットに向いている形式で可逆圧縮(画質が劣化しない)。背景を透過することがきできるが、圧縮率が低い(容量が大きい)。
- JPG
-
写真、Web画像全般に向いている形式で非可逆圧縮(画質が少し劣化する)。写真に向いており、高画質かつ軽量のため広く使用されている。
- Webp
-
Webサイト用の画像に向いている形式でGoogleによって開発され、高圧縮かつ画質も良い。透過やアニメにも適応可能。圧縮率が高く容量はJPGより30%ほど削減できる。
- AVIF
-
高品質なWeb画像、将来の標準候補となる新時代の形式で高圧縮、高画質、透過対応可能。ただし、新しい形式のため非対応の機種が多く、動作も重たい。
ここまでは多くの方がご存じの通りかと思います。
可能であればAVIF形式で保存、使用したいのですが一部テーマや機種が未対応なため現時点(2025年10月)では使い勝手がどうしても悪い。
そこで対応範囲が広まってきているWebp形式に変換して容量を削減したい。
自動変換する方法
Webpに変換するWebサイトサービスなどもありますが、ファイルを1つずつ変換していくのはあまりにも面倒くさいですよね。
WordPressには画像をサーバーにアップロードするときに自動で変換してくれるプラグインもありますが、可能であれば元のデータも小さくしておきたいし、必要最低限の容量で調整したいですよね。
面倒だからワンクリックで変換できたら楽だし理想的だと思いませんか?
そこでBATファイルを作成することにしました。
ワンクリック(ダブルクリック)ですね。
バッチファイルとは
Windowsのコマンドプロンプトで実行するコマンドをまとめて記述したテキストファイルです。
拡張子は「.bat」または「.cmd」で、ダブルクリックするだけでファイル内のコマンドが上から順番に自動実行されます。
定型的な繰り返し作業の自動化や、複数の処理をまとめて実行するのに使われます。
FFmpegのインストール
BATファイルに画像ファイルを取得してWebp形式に変換するコマンドを実装します。
まずはコマンドプロンプトで画像を変換できるようにするためにffmpegを導入します。
FFmpegとは
動画や音声の変換・編集・録画・圧縮・ストリーミングなどを行えるオープンソースソフトウェアです。
多くの動画形式(MP4、AVI、MOV、WebMなど)や音声形式(MP3、AAC、WAVなど)に対応しており、非常に高機能です。
まずはFFmpegの公式ページより環境にあったものをダウンロードしてください。
ダウンロードしたファイルを解凍します。
解答したものを任意の場所に移動して(例:C:\FFmpeg)、システム環境変数のPATHにFFmpegの実行ファイルがあるbinフォルダのパスを追加してください(例:C:\FFmpeg\bin)。
ffmpeg -version上記をコマンドプロンプトに入力してFFmpegのバージョン情報が表示されればインストール成功です。
上手くいかない方は詳細な説明をしてくれている方を見つけたのでこちらを参考にしてください。
BATファイルの作成
FFmpegのインストールが完了したら、ようやくBATファイルの作成に入ります。
記述内容は下記の通りです。
各行で何をしたいのか細かく記述しておきました。
@echo off
:: WebP出力フォルダ名
set OUTPUT_DIR=webp_output
:: 出力フォルダがなければ作成
if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"
:: jpg / jpeg / png を順に変換
for %%E in (jpg jpeg png) do (
for %%F in (*.^%%E) do (
if exist "%%F" (
ffmpeg -y -i "%%F" "%OUTPUT_DIR%\%%~nF.webp"
)
)
)
echo.
echo === 変換が完了しました ===
pauseそれでは早速、この猫の画像を圧縮してみましょう。
・容量 4.55MB
先ほどのBATファイルをダブルクリックして起動してサイズを比較します。

はい!サイズが4.34MBから1.11MBに下がりました!!!!
…(゚∀゚)
変化がしょぼくね?🤔
はい、実はただ画像ファイルをWebp形式に変換しただけでは大して容量は減りません。
次はオプションを付けて画像の容量を格段に減らしてみましょう。
画像変換のオプションとは
WebpやJPGなど各種画像の変換にはオプションがあります。
例えばWebpでは品質を設定する【-q】や位置情報などのメタデータを削除する【-map_metadata】などです。
極限まで下げすぎると画質が極端に悪くなり、文字などが読めなくなるので気を付けましょう。
画像変換のオプションを用いてギリギリまで容量を削減してみる
それでは【-q】や【-map_metadata】を用いてギリギリまで容量を減らしてみます。
@echo off
:: コマンド実行時に、画面にコマンド自体を表示しない設定
setlocal enabledelayedexpansion
:: 「!変数!」形式で変数をリアルタイム展開できるようにする(for文内で必要)
:: ---------------------------------
:: 1. 設定オプション
:: ---------------------------------
:: WebPの品質を設定(0〜100、数値が低いほど圧縮が強くファイルサイズが小さいが画質が落ちる)
set QUALITY=10
:: 圧縮レベル(0: 最速, 6: 最も圧縮するが時間がかかる)
set LEVEL=6
:: ピクセルフォーマット(WebP標準の yuv420p を使用)
set PIX_FMT=yuv420p
:: 変換後の画像を保存するフォルダ名
set OUTPUT_DIR=webp_output
:: 画面に開始メッセージを表示
echo.
echo === 画像をWebPに一括変換開始 (品質: %QUALITY%, 圧縮レベル: %LEVEL%) ===
echo.
:: ---------------------------------
:: 2. 出力フォルダの作成
:: ---------------------------------
:: 出力先フォルダが存在しない場合、新規作成
if not exist "%OUTPUT_DIR%" (
mkdir "%OUTPUT_DIR%"
echo.
echo 出力フォルダ "%OUTPUT_DIR%" を作成しました。
echo.
)
:: ---------------------------------
:: 3. 変換とファイル移動
:: ---------------------------------
:: 対象とする拡張子を指定(jpg, jpeg, png)
for %%E in (jpg jpeg png) do (
:: カレントフォルダ内の指定拡張子ファイルを順番に処理
for %%F in (*.^%%E) do (
:: ファイルが存在する場合のみ実行
if exist "%%F" (
:: 入力ファイル名(パス含む)
set "INPUT=%%F"
:: 拡張子を除いたファイル名(ベース名)
set "BASENAME=%%~nF"
:: 一時的な出力ファイル名を作成(変換中はカレントフォルダに出力)
set "TEMP_OUTPUT=!BASENAME!_tiny.webp"
:: 最終的な保存先(webp_outputフォルダ配下)
set "FINAL_OUTPUT=%OUTPUT_DIR%\!BASENAME!_tiny.webp"
:: 現在処理中のファイル名を表示
echo 変換中: !INPUT! ^> !FINAL_OUTPUT!
:: ffmpegコマンドでWebP形式に変換
:: -y : 既存ファイルがあっても自動で上書き
:: -i "!INPUT!" : 入力ファイル指定
:: -map_metadata -1 : メタデータを削除(無駄な情報を省く)
:: -c:v libwebp : 出力コーデックにWebPを使用
:: -pix_fmt %PIX_FMT%: ピクセルフォーマット指定(yuv420p)
:: -lossless 0 : 可逆圧縮を無効化(非可逆圧縮に)
:: -q:v %QUALITY% : 画質(品質)設定
:: -compression_level %LEVEL% : 圧縮レベル設定
:: "!TEMP_OUTPUT!" : 出力ファイル名
ffmpeg -y -i "!INPUT!" ^
-map_metadata -1 ^
-c:v libwebp ^
-pix_fmt %PIX_FMT% ^
-lossless 0 ^
-q:v %QUALITY% ^
-compression_level %LEVEL% ^
"!TEMP_OUTPUT!"
:: 変換が成功した場合、一時ファイルを出力フォルダに移動
if exist "!TEMP_OUTPUT!" (
move /Y "!TEMP_OUTPUT!" "!FINAL_OUTPUT!" >nul
)
)
)
)
:: 変換完了メッセージを表示
echo.
echo === 全ての変換が完了し、"%OUTPUT_DIR%" に保存されました ===
pause
:: pauseで処理が終わってもウィンドウを閉じず、結果を確認できるようにする
はい、随分と小さくなりましたね。
処理速度は遅い言っても数枚なら一瞬で終わるので問題ないです。
クオリティに関しては70あたりが良いかと思います。
画像にもよりますが50でやや違和感が出て、30あたりでジャギジャギしてきます。
0だと文字がかなり読みづらくなります。
まとめ
今回は【画像の容量(サイズ)をBATファイルを用いてワンクリック自動で小さくする方法】についてまとめました。
容量を減らすための主な対策として【画像の形式を変換して圧縮する】手法を用いてBATファイルを作成していきました。。
容量を減らすため【位置情報の削除やクオリティの低下オプション】を用いました。
今後、AVIF形式に対応するサイトや機種が増えて状況が変わりゆくとは思いますが、同様の手法で圧縮できるのではないかと思います。
※本サイトで紹介する方法は、公式の手順や保証内容とは異なる場合があります。実施の際はご自身の判断で行ってください。
※本サイトの内容を基に行われた行動や結果については、いかなる損害・トラブルが発生しても、当方は一切の責任を負いかねます。実施の際はご自身の判断で行ってください。
サイト運営者

IT技術者としてはまだまだわきの甘い新参者です。
普段はWebエンジニアとして生きています。
【基本情報】
性別:男
月日:11月01日
職業:Webエンジニア
趣味:IT技術、PCゲーム、配信視聴など
【履歴】
情報系大学で情報分野について学ぶ
企業HPの保守運用やSEOを担当
【技能】
ホームページ作成、管理、SEO対策
VBAから動画、画像、音声編集など


