タイトル通りです
高解像度写真で行き詰まっているための急場しのぎのコード
Get-ImageBasedOnArea.ps1
# 規定面積より大きいピクセル数の画像を取得する
function Get-ImageBasedOnArea{
# 条件分岐のための規定面積
param(
[int]$default = 2000000
)
# アセンブリロード
Add-Type -AssemblyName system.drawing
# 画像を取得
$image = New-Object System.Drawing.Bitmap($_.fullname)
# 画像の縦横幅を取得しピクセル面積を求める
$width = $image.Width
$height = $image.Height
$area = $width * $height
# ピクセル面積が規定より大きい場合、$_を返す
if($area -gt $default){
return $_
}
$image.Dispose()
}
Windowsのペイントツールで開かない画像が出てきたためこんなことをしています。
加えて画像のリサイズも
Resize-Image.ps1
# 規定面積へ画像をリサイズ
function Resize-Image{
# ダウンサイジングの規定面積
param(
[int]$down_area = 1500000
)
# アセンブリロード
Add-Type -AssemblyName system.drawing
# 画像を取得
$image = New-Object System.Drawing.Bitmap($_.fullname)
# 画像の面積の平方根を取得 => $square
$square = [Math]::Sqrt($image.Width * $image.Height)
# ダウンサイジング規定面積の平方根 => $down_square
$down_square = [Math]::Sqrt($down_area)
# ダウンサイジング後の縦横幅
$ratio = $down_square / $square
[int]$new_width = $image.Width * $ratio
[int]$new_height = $image.Height * $ratio
# ダウンサイジング後のオブジェクトを作成 => $canvas
$canvas = New-Object System.Drawing.Bitmap($new_width, $new_height)
# 描画
$graphics = [System.Drawing.Graphics]::FromImage($canvas)
$graphics.DrawImage($image, (New-Object System.Drawing.Rectangle(0, 0, $canvas.Width, $canvas.Height)))
# 画像の保存
$new_name = $_.basename + "_down.jpg"
$path = Join-Path $_.DirectoryName -ChildPath $new_name
$canvas.Save($path,[System.Drawing.Imaging.ImageFormat]::Jpeg)
# オブジェクト破棄
$graphics.Dispose()
$canvas.Dispose()
$image.Dispose()
}