ResizeImageModule.psm1

function Resize-Image {
    <#
    .SYNOPSIS
        Resize-Image resizes an image file.
 
    .DESCRIPTION
        This function uses the native .NET API to resize an image file and save it to a file.
        It supports the following image formats: BMP, GIF, JPEG, PNG, TIFF
 
    .PARAMETER InputFile
        Type [string]
        The parameter InputFile is used to define the value of image name or path to resize.
 
    .PARAMETER OutputFile
        Type [string]
        The parameter OutputFile is used to define the value of output image resize.
 
    .PARAMETER Width
        Type [int32]
        The parameter Width is used to define the value of new width to image.
 
    .PARAMETER Height
        Type [int32]
        The parameter Height is used to define the value of new height to image.
 
    .PARAMETER ProportionalResize
        Type [bool]
        The optional parameter ProportionalResize is used to define if execute proportional resize.
 
    .EXAMPLE
        Resize-Image -InputFile "C:/image.png" -OutputFile "C:/image2.png" -Width 300 -Height 300
 
    .NOTES
        Author: Ronildo Souza
        Last Edit: 2018-10-09
        Version 1.0.0 - initial release
        Version 1.0.1 - add proportional resize
    #>

    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string]$InputFile,
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string]$OutputFile,
        [Parameter(Mandatory = $true)]
        [int32]$Width,
        [Parameter(Mandatory = $true)]
        [int32]$Height,
        [Parameter(Mandatory = $false)]
        [bool]$ProportionalResize = $true)

    # Add assemblies
    Add-Type -AssemblyName System
    Add-Type -AssemblyName System.Drawing

    $image = [System.Drawing.Image]::FromFile((Get-Item $InputFile))

    $ratioX = $Width / $image.Width;
    $ratioY = $Height / $image.Height;
    $ratio = [System.Math]::Min($ratioX, $ratioY);

    [int32]$newWidth = If ($ProportionalResize) { $image.Width * $ratio } Else { $Width }
    [int32]$newHeight = If ($ProportionalResize) { $image.Height * $ratio } Else { $Height }

    $destImage = New-Object System.Drawing.Bitmap($newWidth, $newHeight)

    # Draw new image on the empty canvas
    $graphics = [System.Drawing.Graphics]::FromImage($destImage)
    $graphics.DrawImage($image, 0, 0, $newWidth, $newHeight)
    $graphics.Dispose()

    # Save the image
    $destImage.Save($OutputFile)
}

function Resize-ImagesInFolder {
    <#
    .SYNOPSIS
        Resize-ImagesInFolder resizes an image files in folder.
 
    .DESCRIPTION
        This function uses the native .NET API to resize an image file and save it to a file.
        It supports the following image formats: BMP, GIF, JPEG, PNG, TIFF
 
    .PARAMETER Width
        Type [int32]
        The parameter Width is used to define the value of new width to image.
 
    .PARAMETER Height
        Type [int32]
        The parameter Height is used to define the value of new height to image.
 
    .PARAMETER FolderPath
        Type [string]
        The optional parameter FolderPath is used to define the value of image files folder path.
 
    .PARAMETER ProportionalResize
        Type [bool]
        The optional parameter ProportionalResize is used to define if execute proportional resize.
 
    .EXAMPLE
        Resize-ImagesInFolder -Width 300 -Height 300 [-FolderPath]
 
    .NOTES
        Author: Ronildo Souza
        Last Edit: 2018-10-09
        Version 1.0.0 - initial release
        Version 1.0.1 - add proportional resize
    #>

    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true)][int32]$Width,
        [Parameter(Mandatory = $true)][int32]$Height,
        [Parameter(Mandatory = $false)]
        [string]$FolderPath = "",
        [Parameter(Mandatory = $false)]
        [bool]$ProportionalResize = $true)

    $imageList = Get-ChildItem -Path $FolderPath | Where-Object {$_.Extension -in (".png", ".jpg", ".jpeg", ".bmp", ".gif", ".tiff")}

    if ($imageList.Length -gt 0) {
        foreach ($image in $imageList) {
            $pathWindowsTemp = $env:SystemRoot + "\temp\pictures-rim_ps\"
            $extension = $image.Extension
            $imageInputFullName = $image.FullName
            $imageInputBaseName = $image.BaseName
            $imageOutput = $FolderPath + "\" + $imageInputBaseName + "_RESIZE-RIM_PS" + $extension
            $imageInput = $pathWindowsTemp + $imageInputBaseName + $extension
            $imageNameBKP = $FolderPath + "\" + $imageInputBaseName + $extension + ".bkp"

            # Create temp folder and image file copy
            New-Item -ItemType Directory -Path $pathWindowsTemp -Force
            Copy-Item $imageInputFullName $pathWindowsTemp -Force

            # Create backup image file
            if (!(Test-Path "$imageNameBKP" -PathType Leaf)) {
                Rename-Item -Path "$imageInputFullName" -NewName "$imageNameBKP" -Force
            }

            # Resize the current image file of loop
            Resize-Image -InputFile "$imageInput" -OutputFile "$imageOutput" -Width $Width -Height $Height -ProportionalResize $ProportionalResize

            # "Rename" item with override
            $Destination = Join-Path -Path $image.Directory.FullName -ChildPath "$imageInputBaseName$extension"
            Move-Item -Path $imageOutput -Destination $Destination -Force

            Write-Output $image.Name
        }

        Read-Host -Prompt "Success Resize!"
        Exit-PSHostProcess
    }
    else {
        Write-Error "*** Folder not contain image files! ***"
    }
}

Export-ModuleMember -Function Resize-Image, `
                              Resize-ImagesInFolder