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.exe
fü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
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
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.txt
und diese Batchdatei im selben Verzeichnis wie die Dateien, die Sie verarbeiten möchten. Führen Sie dann ex. resizer.bat
von der Kommandozeile aus oder einfach per Doppelklick aus. In diesem Fall %%G
wird die Zeile aus ex. gelesen filenames.txt
.
Option 3B – ImageResizer „Skript“
Öffnen Sie zB filenames.txt
inNotizblock++, 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 around
undRegular expression
markiert 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 with
Feld Ihren ImageResizer-Befehl ein, jedoch mit$1
dem Dateinamen anstelle des Beispiels:/load $1 /resize auto "LQ 4x" /save $1
%1
wird durch die mit Beispiel gefundenen Übereinstimmungen ersetzt(.*.png)
.Wählen
Replace all
.zB Notepad++ - Ersetzen-Dialog
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 dannimageresizer.exe
zum 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].png
jedes .png
Bildes 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 undsubprocess.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:dirpath
ist der Pfad zum aktuellen (Unter-)Verzeichnis.dirnames
ist eine Liste der Namen der Unterverzeichnisse indirpath
(ausgenommen.
und..
).filenames
ist eine Liste der Namen der Nicht-Verzeichnisdateien indirpath
.
Die Namen in den
dirnames
obigenfilenames
Listen sind „nackt“, d. h. sie enthalten keine Pfadkomponenten.OSError
fängt vom Betriebssystem erzeugte Fehler ab, z. B. bei Dateien usw., undsubprocess.CalledProcessError
teilt uns mit, ob ein Problem mit dem aufgerufenen Prozess aufgetreten istsubprocess.run()
(z. B. wenn ein Wert ungleich Null zurückgegeben wurde).
Python-Importreferenzen
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.exe
angegeben 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 cd
den Pfad der Datei angeben .exe
oder ihren vollständigen Pfad verwenden, wenn Sie den Pfad zur Datei hinzugefügt haben.WegUmgebungsvariable.