Pillowを使って画像を縮小させるスクリプトをメモしておこう!

はてなブログやホームページに画像をアップすると思ったより大きいと感じることがしばしばあったので、画像を縮小させるスクリプトを書いてみたのでメモしておく。
第一引数に対象ファイルを指定、第二引数に幅、高さを何分のいちにするかを指定。
対象のファイルはひとつだけ指定できる。

#
# shrink_image.py  file  div
#
import sys
import os
from PIL import Image

av = sys.argv
if len(av) < 3:
    r = '2'
else:
    r = av[2]

fn = sys.argv[1]
base,ext = os.path.splitext(os.path.basename(fn))
new_fn = base + "_" + r + ext 
print(new_fn)
img = Image.open(fn)
t = img.size
w,h = t
n = int(r)
tpl = (w//n,h//n)
print("{} => {}".format(t,tpl))
new_img = img.resize(tpl)
new_img.save(new_fn)

pythonスクリプトpowershellスクリプトをかぶせておこう。
対象のファイル・パスはパイプラインから受け取れるように、『PowerShell実践ガイドブック』のガイドに従い[CmdletBinding()]属性を付加してAdvanced Functionの形にした。これで対象のファイル・パスをパイプラインに流し込めばよい。

#
# shrink image  
#
Function Shrink-Image {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$True,
                   ValueFromPipeline=$True)]
        [ValidateNotNullOrEmpty()]
        [String]$Path,

        [int]$Div = 2
    )
    begin {
    }
    process {
        $cmd = "python '${home}\Documents\Python Scripts\shrink_image.py' "
        $cmd += "'"
        $cmd += $Path
        $cmd += "' "
        $cmd += $Div
        invoke-expression $cmd
    }
    end {
    }
}

実行例(パイプラインから渡す)

(base) PS >ls *.jpg  |  shrink-image -div 10
img0001_10.jpg
(800, 500) => (80, 50)
img0002_10.jpg
(800, 500) => (80, 50)
(base) PS >

ただ、メモしたこと自体を忘れてしまうかもしれない。