Wie kann ich eine Befehlszeilensoftware automatisieren, die immer nur jeweils ein Bild verarbeitet?

Wie kann ich eine Befehlszeilensoftware automatisieren, die immer nur jeweils ein Bild verarbeitet?

Ich habe also ein paar tausend Pixel-Art-PNGs aus einem Pixel-Art-Spiel, die ich hochskalieren möchte. Ich habe herausgefunden, dass meine Software(2dBildfilter)Die Software nimmt jedoch sowohl in der GUI- als auch in der CLI-Version nur ein Bild auf.

Wie gehe ich bei der Automatisierung vor?
Die SYNTAX lautet:

imgresizer.exe /load [IMAGE.png] /resize auto "LQ 4x" /save [OUTIMAGE].png

Antwort1

Die Software nimmt sowohl in der GUI- als auch in der CLI-Version nur ein Bild auf.

Gemäß der Befehlszeilen-Hilfeoption für ImageResizer v129 ( imgresizer.exe -h) können Sie in der Befehlszeile mehrere zu verarbeitende Dateien angeben:

Sie können mehrere Dateien auf einmal laden und verarbeiten, indem Sie sie nach dem erneuten Speichern laden.

Beispielcode für ImageResizer

imageresizer.exe /load 1.bmp /resize 10x10 Pixel /save 1.jpg /load 2.bmp /resize 10x10 Pixel /save 2.jpg

Auf den ersten Blick scheint diese Option in den Standalone-Versionen von ImageResizer seit verfügbar zu sein ImageResizer-r17.exe.


Ab ImageResizer v121 ( ImageResizer-r121.exe) scheinen auch „Skripte“ unterstützt zu werden, z. B.:

Beispiel: example_script.txt

/load 1.png /resize auto "LQ 4x" /save 1.png
/load 2.png /resize auto "LQ 4x" /save 2.png

Beispiel: ImageResizer-Befehl

imgresizer.exe /script example_script.txt

Die Verwendung dieser Option könnte daher auch die gleichzeitige Verarbeitung mehrerer Dateien ermöglichen.


Wie bei regulären ungültigen Befehlen scheint ImageResizer seine „Hilfe“-Informationen auszudrucken, wenn es das angegebene Skript nicht verarbeiten kann.


Wie kann ich [dies] automatisieren?

Allgemeine Ansätze

Da zumindest einige Versionen von ImageResizer offenbar Batch-Anweisungen (siehe „Skripte“ oben) annehmen können, haben Sie grundsätzlich die Wahl zwischen:

  • Erstellen Sie ein Skript, um es imageresizer.exefür jede Datei wiederholt direkt aufzurufen.

  • Erstellen Sie ein Skript (oder verwenden Sie andere Methoden), um Textdateien zu erstellen, die ImageResizer zum Verarbeiten der gewünschten Bilder verwenden kann.

Einfache Beispiele

  1. Erstellen Sie in dem Ordner, der Ihre Dateien enthält, eine Textdatei, die nur Datei- und Ordnernamen enthält, z. B.:

     dir /b > filenames.txt
    
  2. Entfernen Sie alle Ordnernamen, z. B. filenames.txt. Wiederholen Sie dies für alle Dateinamen, die Sie nicht verarbeiten möchten, und speichern Sie dann.


Option 3A – Traditionelle Schrift

ChargeFOR-Schleifenkann verwendet werden, um eine ausführbare Datei wiederholt aufzurufen. Erstellen Sie eine Textdatei mit der Batch-Erweiterung ( .bat) und einem Inhalt ähnlich dem folgenden:

Beispiel: resizer.bat

FOR /F %%G IN (filenames.txt) DO (
    imageresizer.exe /load %%G /resize auto "LQ 4x" /save %%G
)

Platzieren Sie eg filenames.txtund diese Batchdatei im selben Verzeichnis wie die Dateien, die Sie verarbeiten möchten. Führen Sie dann ex. resizer.batvon der Kommandozeile aus oder einfach per Doppelklick aus. In diesem Fall %%Gwird die Zeile aus ex. gelesen filenames.txt.


Option 3B – ImageResizer „Skript“

Öffnen Sie zB filenames.txtinNotizblock++, dann benutzeReguläre Ausdrückeum die einfachen Dateinamen durch die gewünschten Befehle zu ersetzen:

  • Öffnen Sie Notepad++ErsetzenDialog mit Ctrl+ H.

  • Stellen Sie sicher, dass die Optionen Wrap aroundund Regular expressionmarkiert sind.

  • Geben Sie dann in das Find what:Feld in Klammern .*die Dateierweiterung ein, die Sie ändern möchten, z. B .png.:

    (.*.png)
    
  • Geben Sie in das Replace withFeld Ihren ImageResizer-Befehl ein, jedoch mit $1dem Dateinamen anstelle des Beispiels:

    /load $1 /resize auto "LQ 4x" /save $1
    

    %1wird durch die mit Beispiel gefundenen Übereinstimmungen ersetzt (.*.png).

  • Wählen Replace all.

    zB Notepad++ - Ersetzen-Dialog

    Bildbeschreibung hier eingeben

  • Dadurch sollten alle Ihre Dateinamen beispielsweise wie folgt umgewandelt werden:

    /load file1.png /resize auto "LQ 4x" /save file1.png
    /load file2.png /resize auto "LQ 4x" /save file2.png 
    
  • Speichern Sie Ihre neue Textdatei (z. B. als example_script.txt) und verwenden Sie dann imageresizer.exezum Ausführen des Skripts, z. B.:

    imgresizer.exe /script example_script.txt
    

Python

Ein Beispiel für den Aufruf imgresizer.exe /load [IMAGE.png] /resize auto "LQ 4x" /save [OUTIMAGE].pngjedes .pngBildes im aktuellen Verzeichnis und allen Unterverzeichnissen überPython 3 unter Windows:

# An example of how to use os.walk() and subprocess.run() to find desired files
# and feed them to ImageResizer.

import os
import os.path
import subprocess


# --- Variables, Etc. ---

# Directory where our files are stored. '.' is the current directory (whichever
# directory this script appears in). However, this can be any starting folder.
ROOT_DIR = '.'

# What type of files are we looking for?
# PREFIX = 'image_'
EXT = '.png'

# A list to hold our file path information.
full_paths = []


# --- Functions ---

# A small, custom function to build our ImageResizer command.
def build_command(filepath):

    # This string is directly invoked at the command line. Watch for spacing.
    # "\" breaks our long command into two separate lines.
    cmd_str = 'imageresizer /load ' + filepath + \
              ' /resize auto "LQ 4x" /save ' + filepath + '.jpg'

    return cmd_str


# ----- Main -----

for dirpath, dirnames, filenames in os.walk(ROOT_DIR):

    # Track the full path to our individual files.
    for name in filenames:

        # if name.startswith(PREFIX) and name.endswith(EXT):
        if name.endswith(EXT):

            # Test code
            # print(name)

            full_path = os.path.join(dirpath, name)
            full_paths.append(full_path)

# -----

# Visual aid
print('')

for path_item in full_paths:

    # Test code
    # print(path_item)

    # Put our file paths in quotes so we don't get errors when processing
    # sub-directories with spaces in their names.
    path_item = '"' + path_item + '"'

    try:

        # Custom function -> build_command()
        cmd = build_command(path_item)

        # Test code
        # print(cmd)

        subprocess.run(cmd, check=True)

    # Catch/print errors produced when calling ImageResizer with subprocess.
    except (OSError, subprocess.CalledProcessError) as err:

        # pass

        print('')
        print(err)

Hinweise zum Python-Skript

  • os.walk()liest Datei-/Verzeichnisinformationen und subprocess.run()wird zum Aufrufen externer, nicht-Python-Befehle usw. verwendet, z. B. imageresizer.exe.

  • Wenn Sie einen vollständigen Pfad für verwenden ROOT_DIR, verwenden Sie \\statt nur \Pfadtrennzeichen, z. B.:

    ROOT_DIR = 'C:\\Example\\Path'
    
  • os.walk(ROOT_DIR)ergibt drei Elemente für jedes Verzeichnis in einem Baum:

    • dirpathist der Pfad zum aktuellen (Unter-)Verzeichnis.

    • dirnamesist eine Liste der Namen der Unterverzeichnisse in dirpath(ausgenommen .und ..).

    • filenamesist eine Liste der Namen der Nicht-Verzeichnisdateien in dirpath.

  • Die Namen in den dirnamesobigen filenamesListen sind „nackt“, d. h. sie enthalten keine Pfadkomponenten.

  • OSErrorfängt vom Betriebssystem erzeugte Fehler ab, z. B. bei Dateien usw., und subprocess.CalledProcessErrorteilt uns mit, ob ein Problem mit dem aufgerufenen Prozess aufgetreten ist subprocess.run()(z. B. wenn ein Wert ungleich Null zurückgegeben wurde).


Python-Importreferenzen

Betriebssystem

os.Pfad

Unterprozess

Antwort2

Die obige Antwort ist korrekt, ich möchte jedoch meinen Senf dazugeben.

Der gewünschte Vorgang kann mit PowerShell durchgeführt werden. Wenn Sie nicht wissen, wie Sie es öffnen, können Sie Folgendes verwenden:

Win+ R>>Typ powershell>> Ctrl+ Shift+Enter

Anschließend können Sie mit diesen Codes alle Bilder rekursiv verarbeiten:

$files=(Get-ChildItem -path "path\to\folder" -force -recurse -filter "*.png").fullname | %{if ($_ -match "\s") {'"'+$_+'"'}}
foreach ($file in $files) {Invoke-Command $("imgresizer.exe /load {0} /resize auto "LQ 4x" /save {0}" -f $file)}

Ersetzen Sie einfach „Pfad\zum\Ordner“ durch den tatsächlichen Pfad.

PS Der obige Befehl funktioniert nur, wenn 1. der vollständige Pfad der ausführbaren Datei imageresizer.exeangegeben wird; 2. Sie das Verzeichnis in den Pfad geändert haben, in dem sich die ausführbare Datei befindet; Und schließlich 3. Sie müssen nicht cdden Pfad der Datei angeben .exeoder ihren vollständigen Pfad verwenden, wenn Sie den Pfad zur Datei hinzugefügt haben.WegUmgebungsvariable.

verwandte Informationen