Web サイトを作っていたりすると、大量の画像を一括でリサイズしたいときあったりしますよね。素材として用意されたデカい画像を、実際に利用するサイズまで小さくしたいんだけど、まさか画像をひとつ、ひとつ画像編集ソフトで開いてリサイズなんて当然やりたくありません。
macOS だと、ターミナルから sips
コマンドで一発なので楽ですが、Windows 環境だと標準ではそういう便利な機能がないので、専用のツールを入れたりするわけですが、Windows 10 を使用している環境であれば、WSL (Windows Subsystem for Linux) を使用して Linux が実行できますので、例えば Ubuntu を実行すれば、imgp
コマンドを使用した画像の一括リサイズも簡単です。
Docker の利用など含め、WSL は Web 開発の現場でよく利用しますし、すでに環境を作っていますよ、という人も多い気がしますが、今回は WSL 2 を使用した Ubuntu のセットアップから、imgp コマンドによる画像の一括リサイズを行う手順までを簡単にまとめてみようと思います。
利用する環境
まず今回の解説で使用した環境について。
- Windows 10 Pro x64 (build 19042.630 / 20H2)
- WSL 2
- Ubuntu 20.04 LTS
Windows 10 に関して、私の環境では、現時点で最新の Windows 10 October 2020 Update が適用されている状態になっていますが、WSL 2 を使用する前提で話を進めますので、64 ビット版 Windows 10 の場合、バージョン 1903 以降、ビルド 18362 以上が必要になります。
Windows Subsystem for Linux のセットアップ
まずは Windows 10 で WSL のセットアップを行います。今回は、WSL 2 を使用する前提ですが、手順に関しては、Microsoft の公式ドキュメントに従いますので、詳しくは下記リンクを参照してください。ここでは手順だけ軽く紹介します。ちなみに、セットアップの過程で OS の再起動が何度か必要になります。
具体的な手順
まず管理者として PowerShell を開き、以下のコマンドを実行します。
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
Windows を再起動します。
再起動したら、再度、管理者として PowerShell を開き、以下のコマンドを実行します。
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
Windows を再起動します。
次に Linux カーネル更新プログラムパッケージをダウンロードし、インストールします。下記を参考にパッケージをダウンロードし、実行して画面の指示に従いましょう。
はじめて WSL をセットアップした場合は問題ないと思いますが、PowerShell で下記のコマンドを実行し、WSL 2 を既定のバージョンとして設定しておきます。
wsl --set-default-version 2
次に、Microsoft Store を開いて、Ubuntu を入手します。
今回は、本記事執筆時点で最新版の Ubuntu 20.04 LTS を使用します。
「入手」 ボタンを押すとインストールが始まりますので、完了したら Ubuntu を起動してみましょう。
もし、起動時に下記のように 0x80370102
エラーが出た場合、恐らく使用している環境で、仮想環境が有効になっていません。
その場合、Windows のタスクマネージャーから、「パフォーマンス」 タブを開き、下部の表示内、「仮想化」 の項目が、「有効」 になっているかを確認しましょう。無効の場合は下記の画像のように 「無効」 と表示されます。
もし無効になっていた場合、仮想化を有効にするには、BIOS 側で設定が必要です。マザーボードメーカーや PC メーカーによって異なると思いますが、例えば ASUS 製のマザーボードで、Ryzen など、AMD プロセッサを使用している場合、
Advanced → CPU Configuration → SVM
という感じで 「SVM」 の設定に進み、設定値を 「Enabled」 にして保存すれば仮想化が有効になります。BIOS って何ですか? みたいな人は誰か詳しい人に助けてもらいましょう。
正しく Ubuntu が起動すると、下記のように新規ユーザーアカウントを作成しろという表示になりますので、アカウント名を入れて Enter を押すと、パスワードを入力しろといわれますので、指示に従います (Linux、というかターミナルでの操作に慣れている人はわかると思いますが、この時入力したパスワードは 「*」 みたいな伏せ字も含めて一切表示されません。慣れていないとわかりにくいかもしれませんが、正しくタイプして進みましょう)。パスワードは 2回入力が必要です。
これで、Ubuntu のセットアップが完了しました。
初回なので、下記のコマンドを実行して、パッケージを最新の状態にしておきましょう。
sudo apt update sudo apt upgrade
Ubuntu のホームディレクトリを扱いやすい場所に移動
これは必須ではないのですが、WSL でセットアップされた Ubuntu のホームディレクトリは、標準だと C ドライブの Users フォルダ内の深い場所にあってとても使いにくいので、これをわかりやすい場所に移動します。
今回は、C ドライブの直下に、「Ubuntu_home」 というフォルダを作り、ここをホームディレクトリに設定しましょう。
フォルダを作成したら、下記のコマンドで、/etc/passwd ファイルを開きます。Linux ではこのファイルにユーザー情報が記載されています。
sudo vim /etc/passwd
恐らくファイルの最後の行に、セットアップ時に作成したアカウント名 (例として 「user01」) を先頭に、下記のような記述があると思いますので、
user01:x:1000:1000:,,,:/home/user01:/bin/bash
この /home/user01
の部分を、下記のように書き換えましょう。
user01:x:1000:1000:,,,:/mnt/c/Ubuntu_home:/bin/bash
/mnt/c/
は C ドライブという意味ですので、その直下にある 「Ubuntu_home」 をホームディレクトリに指定したことになります。
Vim に慣れていない人のために一応書いておくと、i で挿入モードになりますので、必要な箇所を修正後、Esc キーで挿入モードを抜け、:wq
と入力して Enter を押せば、編集内容が保存された上で Vim が終了します。
一度、Ubuntu を閉じてから再度立ち上げ、現在のディレクトリを表示する下記コマンドを入力して、
pwd
下記のように、先ほど設定したディレクトリに自分がいることが確認できれば、設定は正しくされていることになります。
pwd /mnt/c/Ubuntu_home
imgp の導入と画像の一括リサイズ
ここまできたら簡単です。下記のコマンドを実行して、imgp をインストールしましょう。
sudo apt install imgp
インストールが終われば、あとは実際の一括リサイズをやってみましょう。
先ほど設定したホームディレクトリ内になにか適当なフォルダ (今回は例として 「img」 フォルダ内で作業します) を作って、そこにリサイズしたい画像を入れます。
今回は下記のような画像を使ってみました。わかりにくいとは思いますが、全部、横サイズで 5000px くらいあるデカい画像ファイルです。
例えば、これら画像を、横サイズ 1200px で、アスペクト比を変えずリサイズしたい場合は下記のようにすれば OK。
まず、画像を入れた作業ディレクトリに移動します。
cd img
そうしたら、下記のコマンドを実行します。
imgp -rx 1200x0
imgp のオプションに関しては下記にドキュメントがありますが、-x
オプションに、[width]x[height]
って感じでサイズを指定すると、そのサイズ内で最大のサイズになるようにうまいことリサイズしてくれます。
ちなみに、-r
オプションを付けると、フォルダ内のサブフォルダを再帰的にリサイズ処理してくれます。サブフォルダがなければ必要ありません。デフォルト (-r
オプションなし) ではコマンドを実行したディレクトリ直下にある画像を一括でリサイズ処理します。
なお、上の例では、縦サイズの方を 「0」 と指定していますので、横サイズだけ指定のサイズになるようによきに計らってくれます。もし、横長、縦長混在みたいに、色々なサイズが混ざっていて、全部を横サイズなら 1200px、縦サイズなら 1000px 以内になるようにリサイズしたければ、
imgp -rx 1200x1000
みたいに指定すれば、対象の画像が横長の画像だろうが縦長の画像だろうが、その範囲に収まるサイズにリサイズされます。
実際にコマンドを実行すると、
./sample-01.jpeg 4076x2443 -> 1200x719 4494461 bytes -> 39266 bytes ./sample-03.jpeg 5304x3580 -> 1200x810 12801804 bytes -> 211690 bytes ./sample-02.jpeg 6059x3726 -> 1200x738 10645734 bytes -> 120528 bytes 3 processed in 0.4230 seconds.
のような感じで処理が行われ、同一フィルダ内に、ファイル名に 「_IMGP」 が付いた、リサイズ済みの画像が書き出されると思います。ちゃんと、元サイズとリサイズ後のサイズも表示してくれていますね。
これで、リサイズ対象の画像が何百ファイルあったとしても、コマンドひとつで簡単に一括リサイズができるようになりました。便利。
その他、
imgp -x 75
のように指定すると、75% のサイズに縮小してくれたり、-o
オプションで画像の傾きを変えたり、-p
オプションで画像を最適化してくれたり、ファイル名に 「_IMGP」 が付くのが面倒くさい、元ファイルをリサイズした画像で上書きしちゃっていいよって場合は -w
オプションが使えたりしますので、詳しくはドキュメントを見てみるとよいと思います。
Windows 環境でコマンドラインからの画像一括リサイズでいうと、ImageMagick を導入するっていう手なんかもありますが、今回は WSL 2 と Ubuntu で、imgp コマンドを使用する例を紹介してみました。