PowerSehllで画像ファイルをトリミングするスクリプト

PoweShell コンピュータ
PowerShell

多量の画像ファイルを一括トリミング出来ると嬉しい場面もあるので作ってみました。
引数の-Pathに画像ファイルのパス(文字列)を配列で渡すと一括処理します。
また、パイプラインでも画像ファイルのパス(文字列)を渡すと同様に処理するようになっています。

スクリプト

<#
.SYNOPSIS
画像ファイルを指定サイズでトリミングします
 はサポートしていません

.DESCRIPTION
画像ファイルを指定サイズで切り取り新たなファイルで保存します。
対象となる画像ファイルはが複数ある場合は配列またはパイプラインで引渡ます。
対応画像形式はJpeg,png,bitmap等、System.Drawing.Imageで取り扱える形式になります。
保存時再圧縮をしますのでJpeg等非可逆圧縮の画像は劣化します。
切り取り開始座標及び幅、高さを省略すると同サイズの画像がコピーされます。

.EXAMPLE
Trimming-Picture [-Path]<String[]> [[-Destination]] [[-X]] [[-Y]] [[-Width]] [[-Height]]

.PARAMETER Path
ソース画像ファイルのパス

.PARAMETER Destination
トリミング後の画像ファイルを保存するフォルダ。
デフォルトはカレントディレクトリ。
出力ファイル名の形式は(ベース名)_trim.(拡張子)

.PARAMETER X
ソース画像の切り取り開始位置のX座標。ピクセル単位

.PARAMETER Y
ソース画像の切り取り開始位置のY座標。ピクセル単位

.PARAMETER Width
ソース画像を切り取る幅。ピクセル単位

.PARAMETER Height
ソース画像を切り取る高さ。ピクセル単位

#>


Add-Type -AssemblyName System.Drawing

function Trimming-Picture
{
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline=$True,Mandatory=$true)]
        [string[]]
        $Path,
        [Parameter(ValueFromPipeline=$false,Mandatory=$false)]
        [string]
        $Destination = ".",
        [Parameter(ValueFromPipeline=$false,Mandatory=$false)]
        [int32]
        $X = 0,
        [Parameter(ValueFromPipeline=$false,Mandatory=$false)]
        [int32]
        $Y = 0,
        [Parameter(ValueFromPipeline=$false,Mandatory=$false)]
        [int32]
        $Width = -1,
        [Parameter(ValueFromPipeline=$false,Mandatory=$false)]
        [int32]
        $Height = -1
    )
    begin {
        if ("." -eq $Destination) {
            $Destination = pwd
        }
    }

    process {
        foreach ($p in $Path) {

            if (-not($p)) { return }
            if (-not(Test-Path -LiteralPath $p)) { return }

            $InputImage = [System.Drawing.Image]::FromFile($p)
            if (-1 -eq $Width) { $X = 0; $Width = $InputImage.Width }
            if (-1 -eq $Height) { $Y = 0; $Height = $InputImage.Height }

            if ($InputImage.Width -lt ($X+$Width)) { $Width = $Width - (($X+$Width)-$InputImage.Width) }
            if ($InputImage.Height -lt ($Y+$Height)) { $Height = $Height - (($Y+$Height)-$InputImage.Height) }

            $Bitmap = New-Object System.Drawing.Bitmap($Width, $Height)
            $Graphic = [System.Drawing.Graphics]::FromImage($Bitmap)

            $SrcRect = New-Object System.Drawing.Rectangle($X, $Y, $Width, $Height)
            $DstRect = New-Object System.Drawing.Rectangle(0, 0, $SrcRect.Width, $SrcRect.Height)
            $Graphic.DrawImage($InputImage, $DstRect, $SrcRect, 2)

            $Extension = [System.IO.Path]::GetExtension($p)
            $Basename = [System.IO.Path]::GetFileNameWithoutExtension($p)
            $Filename = $Basename + "_trim" + $Extension
            $OutputPath = Join-Path $Destination $Filename

            $Bitmap.Save($OutputPath, $InputImage.RawFormat.Guid)

            $Bitmap.Dispose()
            $InputImage.Dispose()

            return $OutputPath
        }
    }
    end {
    }
}
if (-not($MyInvocation.PSCommandPath)) {
 
    $uri = "https://maywork.net/wp/wp-content/uploads/2018/10/logo.png"
    $local_path = Join-Path (pwd) "logo.png"

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    Invoke-WebRequest -Uri $uri -OutFile $local_path

    $local_path | Trimming-Picture -X 100 -Y 100 -Width 200 -Height 100

    rm $local_path
}

トリミング前

トリミング後

コメント