Windowsで写真加工をすることに。いつもはフリーソフトにお願いするのですが会社への承認が必要なためPowerShellで対応しています。ここはそのための備忘録兼スクリプト倉庫です。
###JPEG画像を縦方向で分割するスクリプト
ピクセルを分割して出た余りの幅は、各分割画像に割り振るようにしてあります。
Divide-Jpg.ps1
#カレントフォルダからJpeg情報を取得
$jpg = dir -Filter *.jpg
# .NET Frameworkのアセンブリをロード
Add-Type -AssemblyName System.Drawing
#分割数
$div = 5
$jpg | %{
# 元画像読み込み
$oldbmp = New-Object System.Drawing.Bitmap($_.FullName)
# 元画像の名前とフォルダへのパス、分割画像を入れるファルダ作成
$name = $_.BaseName
$directory = $_.DirectoryName + "\$name"
mkdir $directory -Force > $null
# 元画像を縦に分割した幅と高さと余り幅。余り幅の挿入点。分割幅合計
$width = [math]::Floor($oldbmp.Width / $div)
$height = $oldbmp.Height
$remainder = $oldbmp.Width % $div
$insert = [math]::Floor($div / ($div - $remainder))
$sumwidth = 0
1..$div | %{
# 余りピクセルを入れる分岐
if(($_ % $insert) -ne 0){$add = 1}else{$add = 0}
$newwidth = ($width + $add)
# 分割幅でトリミング
$rect = New-Object System.Drawing.Rectangle($sumwidth, 0, $newwidth, $height)
$newbmp = $oldbmp.Clone($rect, $oldbmp.PixelFormat)
# トリミング画像保存
$path = Join-Path $directory -ChildPath (($_).ToString("00") + ".jpg")
$newbmp.Save( $path, [System.Drawing.Imaging.ImageFormat]::Jpeg)
#分割幅を合計する
$sumwidth += $newwidth
}
#オブジェクト破棄
$oldbmp.Dispose()
$newbmp.Dispose()
}
###分割した画像を合成するスクリプト
上とは逆に画像を合成するものです。
Comvined-Jpg.ps1
#カレントフォルダからJpeg情報を取得
$jpg = dir -Filter *.jpg
# .NET Frameworkのアセンブリをロード
Add-Type -AssemblyName System.Drawing
# 幅と高さの合計
$SumWidth,$SumHeight = 0,0
$jpg | %{
$bmp = New-Object System.Drawing.Bitmap($_.FullName)
$SumWidth += $bmp.Width
$SumHeight += $bmp.Height
$bmp.Dispose()
}
# 合成先のオブジェクトを生成
$canvas = New-Object System.Drawing.Bitmap($SumWidth, ($SumHeight / $jpg.Count))
# 合成先へ描画
$graphics = [System.Drawing.Graphics]::FromImage($canvas)
$newwidth = 0
$jpg | %{
$image = New-Object System.Drawing.Bitmap($_.FullName)
$graphics.DrawImage($image, (New-Object System.Drawing.Rectangle($newwidth, 0, $image.Width, $image.Height)))
$newwidth += $image.Width
}
# 保存
$path = Join-Path $jpg[0].DirectoryName -ChildPath "combined.jpg"
$canvas.Save($path, [System.Drawing.Imaging.ImageFormat]::Jpeg)
# オブジェクトの破棄
$graphics.Dispose()
$canvas.Dispose()
$image.Dispose()
##参考にさせていただいた記事