batch verwerking foto’s met powershell en imagemagick

Als ik foto’s op websites zoals google+ of facebook wil zetten dan zijn de foto’s vaak te groot. Voor Google+ neemt dit alleen teveel ruimte in beslag maar bij facebook word het bestand te veel gecomprimeerd. Om dit op te lossen, verklein ik de foto’s dan vaak.

Voor een paar foto’s is dit makkelijk te doen in gimp maar als je een hele collectie wilt uploaden dan wordt dit al wat vervelender.
Om dit te versimpelen maak ik gebruik van een powershell-script die imagemagick aanroept.

Dit werkt door in powershell naar de directory te gaan waar de foto’s staan en dan onderstaand script af te vuren. Ik heb het script van internet geplukt, vandaar dat er engelse termen in zitten.

# ----------------------------------------
# Configuratie-variabelen
# eerste variabele is de locatie van de foto's
# voor het gemak is dat de huidige directory
$srcfolder = (Get-Item -Path ".\" -Verbose).FullName
# de locatie waar de aangepaste foto's komen te staan
$destfolder = $srcfolder+"\magick\"
#locatie van het convert-programma
$im_convert_exe = "C:\Program Files\ImageMagick-6.8.5-Q16\convert.exe"
# extensie van de bestanden waarnaar gezocht word.
$src_filter = "*.jpg"
#extensie van de bestanden die aangemaakt worden.
$dest_ext = "jpeg"
# opties die aan convert-programme doorgegeven worden
# in dit geval moet het plaatje maximaal 960 pixels breed of 960 pixels hoog
$options = "-quality 95 -resize 960x960 "
#naam en locatie van logging
$logfile = $destfolder+"\convert_data.txt"
# ----------------------------------------

#logging-gegevens bepalen
$fp = New-Item -ItemType file $logfile -force
$count=0

foreach ($srcitem in $(Get-ChildItem $srcfolder\* -include $src_filter))
{
    $srcname = $srcitem.fullname

    # Construct the filename and filepath for the output
    $partial = $srcitem.FullName.Substring( $srcfolder.Length )
    $destname = $destfolder + $partial
    $destname= [System.IO.Path]::ChangeExtension( $destname , $dest_ext )
    $destpath = [System.IO.Path]::GetDirectoryName( $destname )

    # map aanmaken als die nog niet bestaat
    if (-not (test-path $destpath))
    {
        New-Item $destpath -type directory | Out-Null
    }

    # Perform the conversion by calling an external tool
    $cmdline =  " `"" + $im_convert_exe + "`" " + " `"" + $srcname  + "`" " + $options + " `"" + $destname + "`" " 
    echo $cmdline
    invoke-expression -command "& $cmdline"

    # Get information about the output file    
    $destitem = Get-item $destname

    # Show and record information comparing the input and output files
    $info = [string]::Format( "{0} `t {1} `t {2} `t {3} `t {4} `t {5}", $count, 
    $partial, $srcname, $destname, $srcitem.Length ,  $destitem.Length)
    echo $info
    Add-Content $fp $info

    $count=$count+1
}