¿Cómo automatizaría el software de línea de comandos que solo procesa una imagen a la vez?

¿Cómo automatizaría el software de línea de comandos que solo procesa una imagen a la vez?

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.exerepetidamente 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

  1. 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
    
  2. 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.txty este archivo por lotes en el mismo directorio que los archivos que desea procesar. Luego ejecuta ex. resizer.batdesde 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 aroundy Regular expressionesté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 withcampo, coloque su comando ImageResizer pero en $1lugar de los nombres de los archivos, por ejemplo:

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

    %1se reemplaza por las coincidencias encontradas con ex. (.*.png).

  • Seleccionar Replace all.

    ex. Notepad++ - Cuadro de diálogo Reemplazar

    ingrese la descripción de la imagen aquí

  • 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ícelo imageresizer.exepara 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].pnga cada .pngimagen 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 y subprocess.run()se utiliza para llamar a comandos externos que no son de Python, etc., es decir imageresizer.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:

    • dirpathes la ruta al (sub)directorio actual.

    • dirnameses una lista de los nombres de los subdirectorios en dirpath(excluyendo .y ..).

    • filenameses una lista de los nombres de los archivos que no son de directorio en dirpath.

  • Los nombres en las listas dirnamesy filenamesanteriores son "simples", es decir, no contienen ningún componente de ruta.

  • OSErrordetecta errores producidos por el sistema operativo, es decir, con archivos, etc. y subprocess.CalledProcessErrornos permite saber si hubo un problema con el proceso llamado subprocess.run()(es decir, devolvió un valor distinto de cero).


Referencias de importación de Python

sistema operativo

os.ruta

subproceso

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.exePD: 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 cda la ruta del .exeo usar su ruta completa si ha agregado su ruta alCaminoVariable ambiental.

información relacionada