Entonces, tengo alrededor de unos miles de archivos png de pixel art de un juego de pixel art que quiero mejorar. Descubrí mi software(filtro de imagen 2d)pero el software solo toma una imagen tanto en la versión GUI como en la CLI.
¿Cómo haría para automatizar?
La SINTAXIS es:
imgresizer.exe /load [IMAGE.png] /resize auto "LQ 4x" /save [OUTIMAGE].png
Respuesta1
El software solo toma una imagen tanto en la versión GUI como en la CLI.
Según la opción de ayuda de la línea de comandos para ImageResizer v129 ( imgresizer.exe -h
), puede especificar varios archivos para procesar en la línea de comandos:
Puede cargar y procesar varios archivos a la vez cargándolos después de guardarlos nuevamente.
ex. Código de ejemplo de ImageResizer
imageresizer.exe /load 1.bmp /resize 10x10 Pixel /save 1.jpg /load 2.bmp /resize 10x10 Pixel /save 2.jpg
A primera vista, esta opción parece estar disponible en las versiones independientes de ImageResizer desde ImageResizer-r17.exe
.
Además, desde ImageResizer v121 ( ImageResizer-r121.exe
) en adelante, los "scripts" parecen ser compatibles, por ejemplo:
ex. ejemplo_script.txt
/load 1.png /resize auto "LQ 4x" /save 1.png
/load 2.png /resize auto "LQ 4x" /save 2.png
ex. Comando ImageResizer
imgresizer.exe /script example_script.txt
Por lo tanto, el uso de esta opción también podría permitir procesar varios archivos a la vez.
Al igual que con los comandos no válidos habituales, ImageResizer parece imprimir su información de "ayuda" si no puede procesar el script dado.
¿Cómo haría para automatizar [esto]?
Enfoques generales
Dado que al menos algunas versiones de ImageResizer aparentemente pueden aceptar instrucciones por lotes ("scripts", arriba), sus opciones básicas serían:
Cree un script para llamar directamente
imageresizer.exe
repetidamente para cada archivo.Cree una secuencia de comandos (o utilice otros métodos) para crear archivos de texto que ImageResizer pueda consumir para procesar las imágenes que desee.
Ejemplos simples
En la carpeta que contiene sus archivos, cree un archivo de texto que contenga solo nombres de archivos y carpetas con, por ejemplo:
dir /b > filenames.txt
Elimine cualquier nombre de carpeta de, por ejemplo
filenames.txt
, . Repita este proceso para cualquier nombre de archivo que no desee procesar y luego guárdelo.
Opción 3A - Escritura Tradicional
LotePARA buclesse puede utilizar para llamar repetidamente a un ejecutable. Cree un archivo de texto con una extensión por lotes ( .bat
) y contenido similar al siguiente:
ex. cambiar tamaño.bat
FOR /F %%G IN (filenames.txt) DO (
imageresizer.exe /load %%G /resize auto "LQ 4x" /save %%G
)
Coloque, por ejemplo, filenames.txt
y este archivo por lotes en el mismo directorio que los archivos que desea procesar. Luego ejecuta ex. resizer.bat
desde la línea de comando o simplemente haciendo doble clic en ella. En este caso, %%G
¿se lee la línea del ej. filenames.txt
.
Opción 3B - "Script" de ImageResizer
Abrir, por ejemplo filenames.txt
, enBloc de notas++, luego usaexpresiones regularespara reemplazar los nombres de archivos simples con los comandos deseados:
Abre el Bloc de notas++Reemplazardiálogo con Ctrl+ H.
Asegúrese de que las opciones
Wrap around
yRegular expression
estén marcadas.En el
Find what:
campo, entre paréntesis, escriba.*
la extensión del archivo que desea afectar, ej..png
:(.*.png)
En el
Replace with
campo, coloque su comando ImageResizer pero en$1
lugar de los nombres de los archivos, por ejemplo:/load $1 /resize auto "LQ 4x" /save $1
%1
se reemplaza por las coincidencias encontradas con ex.(.*.png)
.Seleccionar
Replace all
.ex. Notepad++ - Cuadro de diálogo Reemplazar
Esto debería convertir todos los nombres de sus archivos en, por ejemplo:
/load file1.png /resize auto "LQ 4x" /save file1.png /load file2.png /resize auto "LQ 4x" /save file2.png
Guarde su nuevo archivo de texto (por ejemplo, como
example_script.txt
), luego utilíceloimageresizer.exe
para ejecutar el script, por ejemplo:imgresizer.exe /script example_script.txt
Pitón
Un ejemplo de cómo llamar imgresizer.exe /load [IMAGE.png] /resize auto "LQ 4x" /save [OUTIMAGE].png
a cada .png
imagen en el directorio actual y todos los subdirectorios a través dePython 3 en 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)
Notas de secuencias de comandos de Python
os.walk()
lee información de archivos/directorios ysubprocess.run()
se utiliza para llamar a comandos externos que no son de Python, etc., es decirimageresizer.exe
.Si utiliza una ruta completa para
ROOT_DIR
, utilice\\
en lugar de solo\
separadores de ruta, por ejemplo:ROOT_DIR = 'C:\\Example\\Path'
os.walk(ROOT_DIR)
produce tres elementos para cada directorio en un árbol:dirpath
es la ruta al (sub)directorio actual.dirnames
es una lista de los nombres de los subdirectorios endirpath
(excluyendo.
y..
).filenames
es una lista de los nombres de los archivos que no son de directorio endirpath
.
Los nombres en las listas
dirnames
yfilenames
anteriores son "simples", es decir, no contienen ningún componente de ruta.OSError
detecta errores producidos por el sistema operativo, es decir, con archivos, etc. ysubprocess.CalledProcessError
nos permite saber si hubo un problema con el proceso llamadosubprocess.run()
(es decir, devolvió un valor distinto de cero).
Referencias de importación de Python
Respuesta2
La respuesta anterior es correcta, sin embargo, quiero aportar mi granito de arena.
El proceso que deseas lo puedes realizar con PowerShell, si no sabes cómo abrirlo puedes usar:
Win+ R>>tipo powershell
>> Ctrl+ Shift+Enter
Luego puedes usar estos códigos para procesar recursivamente todas las imágenes:
$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)}
Simplemente reemplace "ruta\a\carpeta" con la ruta real.
imageresizer.exe
PD: El comando anterior solo funcionará si 1, se proporciona la ruta completa del ejecutable ; 2, cambió el directorio a la ruta donde se encuentra el ejecutable; Y finalmente, 3, no es necesario ir cd
a la ruta del .exe
o usar su ruta completa si ha agregado su ruta alCaminoVariable ambiental.