PowerShellでJPG画像のリサイズとウォーターマーク画像との合成を同時に行う

Quick Edit Pencil
指定したフォルダー内(サブフォルダも含む)のJPGファイルを一括で処理します。

# -----   ユーザー指定   -----

## 変数
#
#ターゲットディレクトリ
$path = "E:\OneDrive\画像\COOLSCAN3_LS-30"
#
#MIXする画像は正方形のαありのPNGで透過処理等が済んでいる前提です。
$miximage = "E:\OneDrive\ドキュメント\透かし\WATERMARK.PNG"
#
#リサイズ値(幅または高さのどちらか一方を指定すると、縦横比率を計算したサイズを決定するようにしてあります。)
$width = 360
$height = 0

#リサイズ付加名(リサイズ画像のあるディレクトリ名+$risize_name、画像名+$risize_name+.jpgとなります。)
$risize_name = "_RESIZE"

# -----   コード部分   -----

## WSHのShellオブジェクトを生成
$shell=New-Object -Com Shell.Application;

## 指定されたパス配下のJPGファイルを取得(サブフォルダーも含む)
$target = Get-ChildItem $path -include *.jpg -exclude *$risize_name.JPG -recurse | Where-Object {-not $_.PSIsContainer}

# アセンブリの読み込み(リサイズ)
[void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")
#[void][reflection.assembly]::LoadWithPartialName("System.Drawing.Imaging")

#MIXする画像の読み込み(MIX)
$image2 = New-Object System.Drawing.Bitmap($miximage)

## ファイル分だけ繰り返し
$target | ForEach-Object {

    # 画像ファイルの読み込み(リサイズ)
    $image = New-Object System.Drawing.Bitmap($_.FullName)

    $resize_Width = 0
    $resize_Height = 0
    #受け取った引数から、新しいサイズを決定する
    if ( $width -gt 0 -and $height -eq 0 )
    {
    $resize_Width = $width
    $resize_Height = $image.Height / ($image.Width / $resize_Width)
    }
    elseif ( $height -gt 0 -and $width -eq 0 )
    {
    $resize_Height = $height
    $resize_Width = $image.Width / ($image.Height / $resize_Height)
    }
    elseif ( $width -gt 0 -and $height -gt 0 )
    {
    $resize_Width = $width
    $resize_Height = $height
    }
    else
    {
    Write-Host "画像サイズを指定してください"
    return
    }

    # 縮小先のオブジェクトを生成(リサイズ)
    $canvas = New-Object System.Drawing.Bitmap([int]($resize_Width), [int]($resize_Height))

    # 縮小先へ描画(リサイズ)
    $graphics = [System.Drawing.Graphics]::FromImage($canvas)
    $graphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBilinear
    $graphics.Clear([System.Drawing.Color]::White)
    $graphics.DrawImage($image, (New-Object System.Drawing.Rectangle(0, 0, $canvas.Width, $canvas.Height)))
    # MIX処理(リサイズ画像に上からDrawする)
    $image2_FitSize = @($resize_Width,$resize_Height) | sort
    #$graphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBilinear
    $graphics.DrawImage($image2, (New-Object System.Drawing.Rectangle([int](($resize_Width - $image2_FitSize[0]) /2) ,[int](($resize_Height - $image2_FitSize[0]) / 2), $image2_FitSize[0], $image2_FitSize[0])))

    ## リサイズ画像の保存フォルダーを作成
    $savepath = $_.DirectoryName + $risize_name
    New-Item $savepath -itemType Directory -Force

    # 保存(リサイズとMIX)
    $canvas.Save($savepath + "\" + $_.BaseName + $risize_name + ".JPG", [System.Drawing.Imaging.ImageFormat]::Jpeg)
    
    # リサイズ合成画像の作成日時にリサイズオリジナル画像の作成日時と更新日時を比較して古い日時を含める
    $renameFile = $savepath + "\" + $_.BaseName + $risize_name + ".JPG"
    $timeStamp = @($_.CreationTime,$_.LastWriteTime) | sort
    Set-ItemProperty $renameFile -Name CreationTime -Value $timeStamp[0]

    # オブジェクトの破棄(リサイズ)
    $graphics.Dispose()
    $canvas.Dispose()
    $image.Dispose()

}

# オブジェクトの破棄(MIX)
$image2.Dispose()

#本スクリプトの参考にしたページ
#PowerShell で画像の回転、リサイズを行う
#http://qiita.com/miyamiya/items/d1a975fb6618d46eda0c
#Powershellでα画像を合成する方法
#http://qiita.com/recomemos/items/528358a1e192aecbc38c
#09.画像ファイルをリサイズする
#http://hiros-dot.net/PowerShell/myfunction/myfunction09.htm

このブログの人気の投稿

PowerShellのGetDetailsOf メソッドでプロパティの詳細情報のID番号と項目名を列挙します

PowerShellで複数ファイルのプロパティを取得する方法(準備編)

書字方向 横書方向変換スクリプト 左書きから右書きへ(コピペ用途)

ヤバい!JAPANNEXT WQHD対応 27型ワイド液晶ディスプレイ「JN-IPS2716WQHD」を注文してみた!!!

Blender: 辺の長さを数値で指定するアドオン

エクセル VBA マウスカーソルの移動とクリック