PowerShell画像ファイルをパイプラインでPNG形式に変換するスクリプト

寺社境内名物集 コンピュータ
出典:国立国会図書館「NDLイメージバンク」 (https://rnavi.ndl.go.jp/imagebank/)

PowerShellのスクリプトにパイプラインでファイルを渡すサンプルスクリプトです。
副次的な効果なのですが、グレースケール画像がRGBA形式で保存されます。

スクリプト

ファイル名:ConvertTo-Png.ps1

<#
.SYNOPSIS
 画像ファイルをPngファイルに変更する

.PARAMETER Path
変換元画像ファイルのパスを指定。

.PARAMETER Destination 
変換後の画像ファイルの保存ディレクトリを指定。デフォルト:カレントディレクトリ

.PARAMETER Help
ヘルプメッセージを表示。

.INPUTS
String または System.IO.FileSystemInfo

.OUTPUTS
String 変換後の画像ファイルのパス

.EXAMPLE
PS> .\ConvertTo-Png.ps1 -Path "~/Pictures/hoge.jpg" -Destination "./" 

.EXAMPLE
PS> "~/Pictures/foo.jpg", "~/Pictures/bar.jpg" | .\ConvertTo-Png.ps1 -Destination "./" 

.EXAMPLE
PS> ls "~/Pictures/*.jpg" | .\ConvertTo-Png.ps1 -Destination "./" 

#>

Param(
    [string]$Path,
    [string]$Destination = ".",
    [switch]$Help
)

function ConvertTo-Png
{
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline=$true,Mandatory=$true)]
        [string[]]
        $path,
        [Parameter(ValueFromPipeline=$false,Mandatory=$true)]
        [string[]]
        $destination
    )
    begin {}
    process
    {
        foreach ($p in $Path)
        {
            $base = [System.IO.Path]::GetFileNameWithoutExtension($p)
            $outFile = Join-Path $destination ($base + ".png")
            $bmp = [System.Drawing.Image]::FromFile($p)
            $bmp.Save($outFile, [System.Drawing.Imaging.ImageFormat]::Png)
            $bmp.Dispose()
            $outFile
        }
    }
    end {}
}

if ("." -eq $Destination) { $Destination = pwd }

$args = @($input)

if ($Help -Or ( -Not $Path -And $args.Count -eq 0))
{
    Get-Help $PSCommandPath
    Exit 1
}

if ($args.Count -gt 0)
{
    if ($args[0] -is [System.IO.FileSystemInfo])
    {
        $args | % { $_.FullName } | ConvertTo-Png -destination $Destination
    }
    else
    {
        $args | ConvertTo-Png -destination $Destination
    }
}
else
{
    ConvertTo-Png -path $Path -destination $Destination
}

コメント