[APORTE] [PowerShell] IrfanView | Crop image files

(1/1)

Eleкtro:
El siguiente script desarrollado en PowerShell y dependiente del programa de terceros IrfanView, sirve para hacer un recorte (crop) específico en los archivos de imagen del directorio actual.

En la sección "Variables" dentro del script pueden personalizar los puntos de recorte (x, y, width, height), así como la calidad de codificación para archivos JPG entre otras cosas configurables.




Código
<#
===========================================================================================
|                                                                                         |
|                                        Variables                                        |
|                                                                                         |
===========================================================================================
#>
 
$inputDirectoryPath = "$PSScriptRoot"
$fileNameSearchPattern = "*.*"
$imageExts = @("avif", "bmp", "jp2", "jpg", "png", "tga", "tif", "webp")
$recurse = $false
 
$irfanviewFullPath = "C:\Program Files\IrfanView\i_view64.exe"
 
# Cropping values
$x      = 12
$y      = 20
$width  = 620
$height = 560
 
# For cropping images that are jpg/jpeg
$jpgQuality = 95
 
 
<#
===========================================================================================
|                                                                                         |
|                                    Functions                                            |
|                                                                                         |
===========================================================================================
#>
 
function Show-WelcomeScreen {
   Clear-Host
   Write-Host ""
   Write-Host " $($host.ui.RawUI.WindowTitle)"
   Write-Host " +=========================================+"
   Write-Host " |                                         |"
   Write-Host " | This script will search for image files |"
   Write-Host " | in the current working directory, and   |"
   Write-Host " | use IrfanView to crop them using the    |"
   Write-Host " | specified cropping settings.            |"
   Write-Host " |                                         |"
   Write-Host " +=========================================+"
   Write-Host ""
   Write-Host " Script Settings         " -ForegroundColor DarkGray
   Write-Host " ========================" -ForegroundColor DarkGray
   Write-Host " Input Directory Path....: $inputDirectoryPath" -ForegroundColor DarkGray
   Write-Host " Recursive File Search...: $recurse" -ForegroundColor DarkGray
   Write-Host " Search File Name Pattern: $fileNameSearchPattern" -ForegroundColor DarkGray
   Write-Host " Search File Extensions..: $($imageExts -join ', ')" -ForegroundColor DarkGray
   Write-Host " IrfanView Full Path.....: $irfanviewFullPath" -ForegroundColor DarkGray
   Write-Host " JPG Quality.............: $jpgQuality%" -ForegroundColor DarkGray
   Write-Host " Cropping.values.........: X=$x, Y=$y, Width=$width, Height=$height" -ForegroundColor DarkGray
   Write-Host ""
}
 
function Confirm-Continue {
   Write-Host " Press 'Y' key to continue or 'N' to exit."
   Write-Host ""
   Write-Host " -Continue? (Y/N)"
   do {
       $key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
       $char = $key.Character.ToString().ToUpper()
       if ($char -ne "Y" -and $char -ne "N") {
           [console]::beep(1500, 500)
       }
   } while ($char -ne "Y" -and $char -ne "N")
   if ($char -eq "N") {Exit(1)}
}
 
function Validate-Parameters {
 
   if (-not (Test-Path -LiteralPath $inputDirectoryPath -PathType Container)) {
       Write-Host " Input directory path does not exists!" -BackgroundColor Black -ForegroundColor Red
       Write-Host ""
       Write-Host " Press any key to exit..."
       $key = $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown")
       Exit(1)
   }
 
   if (-not (Test-Path -LiteralPath $irfanviewFullPath -PathType Leaf)) {
       Write-Host " Irfanview file path does not exists!" -BackgroundColor Black -ForegroundColor Red
       Write-Host ""
       Write-Host " Press any key to exit..."
       $key = $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown")
       Exit(1)
   }
 
   if ($imageExts.Count -eq 0) {
       Write-Host " No image file extensions were specified!" -BackgroundColor Black -ForegroundColor Red
       Write-Host ""
       Write-Host " Press any key to exit..."
       $key = $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown")
       Exit(1)
   }
 
}
 
function Crop-Files {
   Clear-Host
 
   $imageFiles = $null
   if ($recurse) {
       $imageFiles = Get-ChildItem -LiteralPath $inputDirectoryPath -Filter $fileNameSearchPattern -Recurse | Where-Object { $imageExts -contains $_.Extension.ToLower().TrimStart('.') }
   } else {
       $imageFiles = Get-ChildItem -LiteralPath $inputDirectoryPath -Filter $fileNameSearchPattern | Where-Object { $imageExts -contains $_.Extension.ToLower().TrimStart('.') }
   }
 
   foreach ($imageFile in $imageFiles) {
       Write-Host " Cropping file: $($imageFile.FullName.Replace($inputDirectoryPath, "."))"
 
       $exitCode = $null
       try {
           $process = New-Object System.Diagnostics.Process
           $process.StartInfo.FileName = $irfanviewFullPath
           $process.StartInfo.Arguments = "`"$($imageFile.FullName)`" /crop=($x,$y,$width,$height) /jpgq=$jpgQuality /convert=""$($imageFile.FullName)"""
           $process.StartInfo.UseShellExecute = $false
           $started  = $process.Start() | Out-Null
           $exited   = $process.WaitForExit()
           $exitCode = $process.ExitCode
       } catch {
           Write-Host ""
           Write-Host " Error running IrfanView process." -BackgroundColor Black -ForegroundColor Red
           Write-Host ""
           Write-Error -Message ($_.Exception.Message)
           Write-Host ""
           Write-Host " Press any key to exit..."
           $key = $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown")
           Exit(1)
       }
 
       if ($exitCode -eq 0) {
           Write-Host " File cropped successfully." -ForegroundColor DarkGreen
           Write-Host ""
       } else {
           Write-Host " Error cropping file. IrfanView Exit Code: $exitCode" -BackgroundColor Black -ForegroundColor Red
           Write-Host ""
           Write-Host " Press any key to ignore and continue..."
           $key = $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown")
       }
   }
}
 
function Show-GoodbyeScreen {
   Write-Host " Operation Completed!" -BackgroundColor Black -ForegroundColor Green
   Write-Host ""
   Write-Host " Press any key to exit..."
   $key = $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown")
   Exit(0)
}
 
<#
===========================================================================================
|                                                                                         |
|                                         Main                                            |
|                                                                                         |
===========================================================================================
#>
 
[System.Console]::Title = "Crop image files - by Elektro"
#[System.Console]::SetWindowSize(146, 27)
[CultureInfo]::CurrentUICulture = "en-US"
 
try { Set-ExecutionPolicy -ExecutionPolicy "Unrestricted" -Scope "Process" } catch { }
 
Show-WelcomeScreen
Validate-Parameters
Confirm-Continue
Crop-Files
Show-GoodbyeScreen
 

Navegación

[0] Índice de Mensajes