Public/Resize-Image.ps1
function Resize-Image { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] $Image, [Parameter(Mandatory = $false, ParameterSetName = "Sizes")] [switch]$ProportionalResize = $false, [Parameter(Mandatory = $true, ParameterSetName = "Sizes")] [int32]$Width, [Parameter(Mandatory = $true, ParameterSetName = "Sizes")] [int32]$Height, [Parameter(Mandatory = $true, ParameterSetName = "Ratio")] [decimal]$Ratio = 0.5 ) begin { Write-Verbose "Cmdlet Resize-Image - Begin" } process { Write-Verbose "Cmdlet Resize-Image - Process" $isByte = Test-ByteArrayType $Image $isStream = Test-StreamType $Image if (!$isByte -and !$isStream ) { throw [System.ArgumentException]::new("Invalid input. Accepted types are: [System.IO.Stream] and [System.Byte[]]") } if ($isByte) { $stream = [System.IO.MemoryStream]::new($Image) } else { $stream = $Image } $img = [System.Drawing.Image]::FromStream($stream) if ($PSCmdlet.ParameterSetName -eq 'Sizes') { $ratioX = $Width / $img.Width; $ratioY = $Height / $img.Height; $ratio = [System.Math]::Min($ratioX, $ratioY); } $autoRatio = $PSCmdlet.ParameterSetName -eq 'Ratio' [int32]$newWidth = if ($ProportionalResize -or $autoRatio) { $img.Width * $ratio } Else { $Width } [int32]$newHeight = if ($ProportionalResize -or $autoRatio) { $img.Height * $ratio } Else { $Height } $destImage = New-Object System.Drawing.Bitmap($newWidth, $newHeight) $graphics = [System.Drawing.Graphics]::FromImage($destImage) $graphics.DrawImage($img, 0, 0, $newWidth, $newHeight) $graphics.Dispose() $stream2 = [System.IO.MemoryStream]::new() $destImage.Save($stream2, [System.Drawing.Imaging.ImageFormat]::Png) $stream2 } end { Write-Verbose "Cmdlet Resize-Image - End" } } |