Windows10のスクリーンショット画像を一括加工しzip化するスクリプト

コンピュータ
PowerShellのあれこれ

Windows10で追加された機能で個人的に一番良いと思うのはスクリーンショットです。
「Win」+「PrintScreen」を押せばユーザーのピクチャディレクトリ内のScreenShotsというディレクトリに「スクリーンショット(連番).png」という形式で画像ファイルが保存されていきます。

便利なので、スクリーンショットガンガン取得していると画像ファイル数が膨大になってしまいます。

たまに整理するのですが、その作業内容はおおむね画像ファイルをzipファイルにまとめで別の場所に保存しています。
毎度毎度の同じ作業の繰り返しなのでPowerShellスクリプトにしてみました。

ただ、せっかく画像ファイルを一件一件取得するので同時に画像ファイルの加工(回転と切り抜き)と画像ファイルのリネームも行っています。

画像加工が必要がない場合は加工部分を削ってください。Compress-Archiveの$outPathを$_.FullNameに書き換えればとりあえずzipファイルが出来上がるはずです。

ファイル名から連番を取り出して数値化し並べ替えをしています。(書き込み日付で並び替えでも良い)
なぜかというとファイルの並びが1の次が11来てしまうことへの対策です。また、こうしておくとファイルを連番の数値で絞り込み条件を書くことが出来ます。

このようなバッチ処理はワンライナーでスラスラと記述できると理想的ですが…

<#
.SYNOPSIS
 スクリーンショットの画像を一括加工しzipファイルに保存
.DISCRIPTION
回転→切り抜き→連番リネーム→zipファイル
元画像ファイルを削除
#>

using namespace System.Drawing

param(
    [int]$Width=600,
    [int]$Height=1200
);

$ptn = "\((\d+)\)\.png"

$zipPath = ".\{0}.zip" -f (Get-Date -f "yyyyMMddHHmmss")

ls ($env:USERPROFILE+"\Pictures\ScreenShots") |
    select FullName, @{
        Name = "SEQ";
        Expression = {if ($_.Name -match $ptn ) {[int]$Matches[1]} else {-1}
    } } |
    ? { $_.SEQ -gt -1} |
    sort -Property SEQ |
    % -Begin { $i = 1 } -Process {
        # 出力ファイルのパス
        #$outPath = ".\IMG{0:000}.png" -f $_.SEQ
        $outPath = ".\IMG{0:000}.png" -f $i++

        # 画像を読み込み
        $bmp = [Bitmap]::FromFile($_.FullName)

        # 画像を90度回転
        $bmp.RotateFlip([RotateFlipType]::Rotate90FlipNone)

        # 切り取り座標を計算
        $x = [int](($bmp.Width - $Width) / 2)
        $y = [int](($bmp.Height - $Height) / 2)

        # 出力画像生成
        $bmp2 = [Bitmap]::new($Width, $Height)

        # グラフィックオブジェクトを生成
        $g = [Graphics]::FromImage($bmp2)

        # 切り抜き
        $g.DrawImage(
            $bmp,
            [Rectangle]::new(0, 0, $Width, $Height),
            [Rectangle]::new($x, $y, $Width, $Height),
            [GraphicsUnit]::Pixel
        )

        # 保存
        $bmp2.Save($outPath, $bmp.RawFormat)

        # zipファイルに追加
        Compress-Archive `
             -LiteralPath $outPath `
             -DestinationPath $zipPath `
             -CompressionLevel NoCompression `
             -Update

        # 破棄
        $g.Dispose()
        $bmp.Dispose()
        $bmp2.Dispose()

        # 削除
        rm $outPath
        rm $_.FullName
    }

コメント