Während der Fertigstellung des Beitrags „Bilder verkleinern“ bekam ich einen Anruf von Wolfgang, für den dieses Programm eigentlich gedacht war. Ich erklärte ihm die Funktionsweise und er hatte auch schon den Haken an der Sache gefunden, denn man kann mit dem dortigen Batch-Programm zwar die Bilder eines einzelnen Verzeichnisses verkleinern aber Wolfgang hat Hunderte Verzeichnisse.

Bei einem einzelnen neuen Verzeichnis, das einzutragen ist, leistet das vorher beschriebene Batch-Programm i_resizeR.bat gute Dienste. Wenn es aber darum geht, die Bilder in allen bestehenden Verzeichnissen zu verkleinern, wird es mühsam, weil man das Batch-Programm für alle Verzeichnisse händisch ausführen müsste.

Kein Problem, dann erweitern wir das Batch-Programm um eine rekursive Funktionalität. Das wäre auch gleich erledigt gewesen, aber es ergaben sich Probleme, die mit der veralteten Batch-Sprache zu einem ziemlich unübersichtlichen Programm geführt hätte und daher wurde dieser Weg verlassen.

Da es ohnehin wünschenswerte und weitergehende Funktionen gibt, wurde statt dieser Erweiterung des Batch-Programms eine PowerShell-Version dieses Programms mit dem Namen   i_resizeR.ps1 entworfen.

Dieses neue Programm hat folgende zusätzliche Eigenschaften:

  • Verkleinert Bilder mit den Endungen .jpg, .jpeg, .png und erzeugt Verkleinerungen im .jpg-Format
  • Es gibt vier Optionen, die man dem dem PowerShell-Skript mitgeben kann: /e /r /l /p

Schritt-für-Schritt-Anleitung

Vorbereitung (nur erstmals erforderlich)

  • Installieren von IrfanView
  • Aufnehmen des IrfanView-Ordners in die Umgebungsvariable PATH (Beschreibung siehe im Beitrags „Bilder verkleinern“)
  • Kopieren der Batch-Dateien i_resizeR.ps1 in ein Pfadverzeichnis (bei mir heißt dieses Verzeichnis, das ausführbare Dateien enthält, C:\_bin). Der vorangestellte Unterstrich hat die Wirkung, dass dieses Verzeichnis ganz oben im Verzeichnisbaum angezeigt wird und nicht irgendwo in der Mitte.

Einfügen und Verkleinerung von Bildern in einem beliebigen Ordner am PC

  • Anlegen eines Bilderordners irgendwo im Verzeichnisbaum
  • Kopieren der Originalbilder von der SD-Karte in diesen Bilderordner
  • Öffnen des Ordners, der den Bilderordner enthält, im Windows-Explorer
  • Markieren des Bilderordners
  • Öffnen des Kontext-Menüs (Rechte Maustaste oder Taste “Kontext-Menü”) bei gedrückter Shift-Taste
  • -> Auswählen von “Eingabeaufforderung hier öffnen” (öffnet eine Eingabeaufforderung und setzt den Pfad auf den Bilderordner)
  • Aufruf von i_resizeR.ps1 im Demomodus
    Beispiel: S:\Desktop\resize\bilder>powershell i_resizeR.ps1 
    Mit diesem Aufruf wird das Programm grundsätzlich durchlaufen aber nicht ausgeführt, und man sieht, welches Verzeichnis bearbeitet wird
  • Ausführung von i_resizeR.ps1
    Beispiel: S:\Desktop\resize\bilder>powershell i_resizeR.ps1 /e
    Mit dem Argument /e wird das Programm ausgeführt.

Verkleinern aller Bilder in einem Verzeichnisbaum

  • Öffnen des Ersten Verzeichnisses (das sind die ersten Schritte im vorigen Punkt „Einfügen und Verkleinerung von Bildern…“
  • Aufruf von i_resizeR.ps1 im Demomodus
    S:\Desktop\resize\bilder>powershell i_resizeR.ps1 /r
    Mit diesem Aufruf wird das Programm grundsätzlich durchlaufen aber nicht ausgeführt, und man sieht, welche Verzeichnisse bearbeitet werden würden.
  • Aufruf von i_resizeR
    S:\Desktop\resize\bilder>powershell i_resizeR.ps1 /r /e
    Mit dem Argument /e wird das Programm ausgeführt.

Das PowerShell-Skript i_resizeR.ps1

#Resize Images
cls
$recursive=$false
$LONGSIDE=2048
$ori=".ori"
$PathStartingAt = [environment]::CurrentDirectory
$execute=$false

function ResizeFiles($From0, $To)
{
    $From=$From0+"\*.jpg"
    $To=$To+"\*.jpg"
    #&'i_view32 "S:\Desktop\resize\bilder/.ori" /resize_long=$LONGSIDE /aspectratio /resample "/convert=S:\Desktop\resize\bilder"'
    $command = 'i_view32 "$From" /resize_long=$LONGSIDE /aspectratio /resample "/convert=$To"'
    iex "& $command"
    $From=$From0+"\*.jpeg"
    $command = 'i_view32 "$From" /resize_long=$LONGSIDE /aspectratio /resample "/convert=$To"'
    iex "& $command"
    $From=$From0+"\*.png"
    $command = 'i_view32 "$From" /resize_long=$LONGSIDE /aspectratio /resample "/convert=$To"'
    iex "& $command"
}
function MoveFiles($From, $To)
{
    Get-ChildItem -Path $From |
      Where-Object {$_.Name.ToLower().EndsWith(".jpg") -or $_.Name.ToLower().EndsWith(".jpeg") -or $_.Name.ToLower().EndsWith(".png")} |
      Move-Item -destination $To
}
function ResizeFilesInDirectory($path)
{
    Write-Host ("Resizing "+$path)
    $path_ori = $path+"\"+$ori
    if (Test-Path $path_ori)
    {
    }
    else
    {
        if ($execute) 
        {
            New-Item -ItemType directory -Path $path_ori > $null 
            MoveFiles $path $path_ori 
        }
    }
    if ($execute) 
    {
        ResizeFiles $path_ori $path
    }
}
function ResizeRecursive($files)
{
    foreach ($file in Get-ChildItem -Force $files) 
    {
        if ($file.Mode -like "d*") # directory
        {
            if ($file.Name.Contains(".ori"))
            {
                continue;
            }
            else
            {
                ResizeFilesInDirectory $file.FullName 
                ResizeRecursive $file.FullName
            }
        }
    }
}

$recursive_text="nonrecursive"
$execute_text="demomode"
echo $args
for ($i=0; $i -lt $args.count; $i++) 
{ 
    $arg = ([string]$args[$i]).ToLower()
    #Write-Host $arg
    if ($arg.StartsWith("/"))
    {
        echo $arg
        switch ($arg.Substring(1,1))
        {
        "r" { $recursive=$true; $recursive_text="recursive" }
        "l" { $LONGSIDE=[int]$arg.Substring(2) }
        "p" { $PathStartingAt=[string]$arg.Substring(2) }
        "e" { $execute=$true; $execute_text="executing"  }
        default {}
        }
    }
}

echo ("Resizing to: " + $LONGSIDE + " Pixel " + $recursive_text+ ", starting at: "+$PathStartingAt + " " + $execute_text)
ResizeFilesInDirectory $PathStartingAt 
if ($recursive) { ResizeRecursive $PathStartingAt }
echo ("Finished resizing in "+$PathStartingAt)

Alle Parameter

  • /r rekursiver Aufruf
  • /e Ausführung (wenn /e nicht angegeben ist, werden die Verzeichnisse nur durchlaufen aber es wird nichts verändert)
  • /l Veränderung der Bildgröße. Voreingestellt sind 2048 Pixel.
    Beispiel: /l400 setzt die längste Bilddimension auf 400 Pixel. Achtung: zwischen /l und 400 ist kein Abstand
  • /p Pfadangabe. Voreingestellt ist das aktuelle Verzeichnis. Aber es ist möglich, dieses Verzeichnis zu verändern. Beispiel: /pS:\Desktop\resize\bilder. Achtung: zwischen /p und S:\... ist kein Abstand. Eine besondere Schreibweise ist nötig, wenn sich in dem Pfad ein Blank befindet, dann nämlich muss man den Pfad in einfache Anführungszeichen setzen. Beispiel: /p'S:\Desktop\resize\bilder\Meine Bilder'.

Aufrufbeispiele

S:\Desktop\resize\bilder>powershell i_resizeR.ps1
Pfad: aktuelles Verzeichnis S:\Desktop\resize\bilder
Bildgröße: 2048 Pixel
Ausführung: nein
Rekursiv: nein

S:\Desktop\resize\bilder>powershell i_resizeR.ps1 /e
Pfad: aktuelles Verzeichnis S:\Desktop\resize\bilder
Bildgröße: 2048 Pixel
Ausführung: ja
Rekursiv: nein

S:\Desktop\resize\bilder>powershell i_resizeR.ps1 /e /r
Pfad: aktuelles Verzeichnis S:\Desktop\resize\bilder
Bildgröße: 2048 Pixel
Ausführung: ja
Rekursiv: ja

S:\Desktop\resize\bilder>powershell i_resizeR.ps1 /e /r /l400
Pfad: aktuelles Verzeichnis S:\Desktop\resize\bilder
Bildgröße: 400 Pixel
Ausführung: ja
Rekursiv: ja

S:\Desktop\resize\bilder>powershell i_resizeR.ps1 /e /r /pS:\Desktop\resize
Pfad: S:\Desktop\resize
Bildgröße: 2048 Pixel
Ausführung: ja
Rekursiv: ja

S:\Desktop\resize\bilder>powershell i_resizeR.ps1 /e /r /p'S:\Desktop\resize\bilder\Meine Bilder'
Pfad: S:\Desktop\resize\bilder\Meine Bilder
Bildgröße: 2048 Pixel
Ausführung: ja
Rekursiv: ja

Links

Zur Werkzeugleiste springen