PowerShellで画像を表示する。

powershell コンピュータ
powershell

PowerShellで画像を扱うプログラミングをしていると、加工した画像を確認表示をしたい場合があるのでスクリプトを作成してみました。
スクリプト名:ViewImage.ps1

<#
.SYNOPSIS
画像を表示

.DESCRIPTION
ビットマップオブジェクトをウィンドウで表示する。

.EXAMPLE
.\ViewImage.ps1 .\aaa.png

.EXAMPLE
.\aaa.png | .\ViewImage.ps1

.EXAMPLE
ls ~/Pictures/*.png | .\ViewImage.ps1

.EXAMPLE
[System.Drawing.Bitmap]::new(".\aaa.png") | .\ViewImage.ps1

.INPUTS
[Bitmap][]

.OUTPUTS
なし

.PARAMETER ImgPath
画像ファイル

.PARAMETER Help
ヘルプスイッチ

.LINK
関連URL

#>

using namespace System.Windows.Forms
using namespace System.Drawing
using namespace System.IO

param(
    [string]
    $ImgPath,
    [switch]
    $Help
)

# アセンブリのロード
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

function ViewImgae
{
    param(
        [Bitmap]
        $bmp
    )
    # メインフォームの生成
    $form = [Form]::new() | % {
        $_.Size = "800,600"
        $_
    }
    # コントロールの初期化配列
    $panel = [Panel]::new() | % {
        $_.Dock = "Fill"
        $_.AutoScroll = $true
        $_
    }
    $picbox = [PictureBox]::new() | % {
        $_.SizeMode = "AutoSize"
        $_.Image = $bmp
        $_
    }
    # コントロールの配置
    $panel.Controls.Add($picbox)
    $form.Controls.Add($panel)

    # フォームの表示
    $form.ShowDialog()
}

# 画像ファイルの読み込み
function LoadImage($path)
{
    $fs = [FileStream]::new($path, [FileMode]::Open, [FileAccess]::Read)
    $bmp = [Bitmap]::FromStream($fs)
    $fs.Close()
    return $bmp
}

$args = @($input)

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

# 単一ファイル
if (Test-Path $ImgPath)
{
    ViewImgae (LoadImage($ImgPath))
    Exit
}

# パイプライン
if ($args.Count -gt 0)
{
    # 最後の一つのみ処理
    $lastObj = $args | Select-Object -Last 1
    switch ($lastObj.GetType().Name)
    {
        'String'
        {
            ViewImgae (LoadImage($lastObj))
        }
        'FileInfo'
        {
            ViewImgae (LoadImage($lastObj.FullName))
        }
        'Bitmap'
        {
            ViewImgae $lastObj
        }
        default
        {
            Exit 1
        }
    }
}

想定する使い方は、パイプラインでビットマップオブジェクト(System.Drawing.Bitmap)をスクリプトに渡すとウィンドウが表示されます。

コメント