コンテンツにスキップ

PowerShellで画像を処理する方法

[質問]

PowerShellで、PythonのPillowのようにImageを扱うことはできますか。今は画像処理関係はPowerShellのスクリプトから、Pythonスクリプトに下請けさせています。

[回答] Gemini

結論から申し上げますと、可能です。 PowerShellは .NET Framework / .NET Core の機能を直接呼び出せるため、標準の描画ライブラリ(System.Drawing)や、よりモダンな外部ライブラリを使用することで、Python(Pillow)を介さずに画像処理を完結させられます。

ただ、Pillowほど「至れり尽くせり」なコマンドが標準で用意されているわけではないので、少しコードが「プログラミング寄り」になる点には注意が必要です。


1. 標準機能(System.Drawing)を使う方法

Windows標準のPowerShellであれば、.NETの System.Drawing アセンブリを利用して、リサイズ、回転、フォーマット変換などが可能です。

# アセンブリの読み込み
Add-Type -AssemblyName System.Drawing

# 画像の読み込み
$image = [System.Drawing.Image]::FromFile("C:\temp\input.jpg")

# 例:画像を時計回りに90度回転
$image.RotateFlip([System.Drawing.RotateFlipType]::Rotate90FlipNone)

# 例:PNGとして保存
$image.Save("C:\temp\output.png", [System.Drawing.Imaging.ImageFormat]::Png)

# メモリ解放(重要!)
$image.Dispose()

2. ImageMagick をPowerShellから叩く

「Pillowのような手軽さ」を求めるなら、ImageMagick をインストールして、そのCLI(magick コマンド)をPowerShellから制御するのが最も効率的です。

# リサイズとフォーマット変換を一行で
magick input.jpg -resize 50% output.png

PowerShellのループと組み合わせれば、フォルダ内の画像一括処理も非常に強力です。


3. モダンな選択肢:ImageSharp

もしあなたが PowerShell 7系(Core)を使っていて、より高度で高速な処理を求めるなら、.NET用の「ImageSharp」というライブラリを読み込んで使う手もあります。これはPillowに非常に近い操作感を持つモダンなライブラリです。

比較表:Python(Pillow) vs PowerShell

機能 Python (Pillow) PowerShell (.NET)
手軽さ 非常に高い 中(.NETの知識が必要)
速度 高速 高速(ネイティブ動作)
外部依存 pip install Pillow 標準なら不要(ImageMagick等なら必要)
得意分野 AI/画像解析連携 OS操作・ファイル管理との連携

正直なアドバイス

「餅は餅屋」という言葉通り、複雑な画像フィルタリングや描画を伴うなら、今のままPythonに下請けさせるのが一番楽です。

しかし、「特定のフォルダに来た画像をリサイズして保存するだけ」といった単純なワークフローであれば、PowerShellだけで完結させたほうが、Pythonの実行環境(仮想環境など)を気にしなくて済むため、管理がスッキリします。

まずは「サイズ変更」や「形式変換」など、どの程度の処理をPowerShell化したいか、具体的なやり方を作成してみましょうか?