Como eu automatizaria o software de linha de comando que processa apenas uma imagem por vez?

Como eu automatizaria o software de linha de comando que processa apenas uma imagem por vez?

Então, tenho cerca de alguns milhares de pngs de pixel art de um jogo de pixel art que desejo aprimorar. Eu descobri meu software(2dimagefiltro)mas o software captura apenas uma imagem na versão GUI e CLI.

Como eu faria para automatizar?
SINTAXE é:

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

Responder1

O software captura apenas uma imagem na versão GUI e CLI.

De acordo com a opção de ajuda da linha de comando do ImageResizer v129 ( imgresizer.exe -h), você pode especificar vários arquivos para processar na linha de comando:

Você pode carregar e processar vários arquivos de uma vez, carregando-os depois de salvá-los novamente.

ex. Código de exemplo do ImageResizer

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

À primeira vista, esta opção parece estar disponível nas versões independentes do ImageResizer desde ImageResizer-r17.exe.


Além disso, do ImageResizer v121 ( ImageResizer-r121.exe) em diante, "scripts" parecem ser suportados, por exemplo:

ex. exemplo_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

Portanto, usar esta opção também pode permitir que vários arquivos sejam processados ​​ao mesmo tempo.


Tal como acontece com os comandos inválidos regulares, o ImageResizer parece imprimir suas informações de "ajuda" se não conseguir processar o script fornecido.


Como eu iria automatizar [isso]?

Abordagens Gerais

Como pelo menos algumas versões do ImageResizer aparentemente podem receber instruções em lote ("scripts", acima), suas escolhas básicas seriam:

  • Crie um script para chamar imageresizer.exerepetidamente cada arquivo diretamente.

  • Crie um script (ou use outros métodos) para criar arquivos de texto para o ImageResizer consumir a fim de processar as imagens desejadas.

Exemplos simples

  1. Na pasta que contém seus arquivos, crie um arquivo de texto contendo apenas nomes de arquivos e pastas com ex.:

     dir /b > filenames.txt
    
  2. Remova todos os nomes de pasta, por exemplo filenames.txt. Repita para todos os nomes de arquivo que você não deseja processar e salve.


Opção 3A – Escrita Tradicional

LoteLoops FORpode ser usado para chamar repetidamente um executável. Crie um arquivo de texto com extensão em lote ( .bat) e conteúdo semelhante ao seguinte:

ex. resizer.bat

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

Coloque, por exemplo, filenames.txte este arquivo em lote no mesmo diretório dos arquivos que você deseja processar. Então execute ex. resizer.batna linha de comando ou apenas clicando duas vezes nele. Neste caso, %%Ga linha é lida do ex. filenames.txt.


Opção 3B - ImageResizer "Script"

Abra, por exemplo, filenames.txtemBloco de notas++, então useexpressões regularespara substituir os nomes de arquivo simples pelos comandos desejados:

  • Abra o Bloco de Notas++Substituirdiálogo com Ctrl+ H.

  • Certifique-se de que as opções Wrap arounde Regular expressionestejam marcadas.

  • No Find what:campo, entre parênteses, coloque .*a extensão do arquivo que deseja afetar ex. .png:

    (.*.png)
    
  • No Replace withcampo, coloque o comando ImageResizer mas no $1lugar dos nomes dos arquivos ex.:

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

    %1é substituído pelas correspondências encontradas com ex. (.*.png).

  • Selecione Replace all.

    ex. Notepad++ - Caixa de diálogo Substituir

    insira a descrição da imagem aqui

  • Isso deve transformar todos os seus nomes de arquivos em ex.:

    /load file1.png /resize auto "LQ 4x" /save file1.png
    /load file2.png /resize auto "LQ 4x" /save file2.png 
    
  • Salve seu novo arquivo de texto (por exemplo, como example_script.txt) e use-o imageresizer.exepara executar o script, por exemplo:

    imgresizer.exe /script example_script.txt
    

Pitão

Um exemplo de chamada imgresizer.exe /load [IMAGE.png] /resize auto "LQ 4x" /save [OUTIMAGE].pngpara cada .pngimagem no diretório atual e todos os subdiretórios viaPython 3 no 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 script Python

  • os.walk()lê informações de arquivo/diretório e é usado para chamar comandos externos, não-Python , subprocess.run()etc.imageresizer.exe

  • Se estiver usando um caminho completo para ROOT_DIR, use \\em vez de apenas \para separadores de caminho, por exemplo:

    ROOT_DIR = 'C:\\Example\\Path'
    
  • os.walk(ROOT_DIR)produz três itens para cada diretório em uma árvore:

    • dirpathé o caminho para o (sub)diretório atual.

    • dirnamesé uma lista dos nomes dos subdiretórios em dirpath(excluindo .e ..).

    • filenamesé uma lista dos nomes dos arquivos que não são de diretório em dirpath.

  • Os nomes nas listas dirnamese filenamesacima são "vazios", ou seja, não contêm nenhum componente de caminho.

  • OSErrorcaptura erros produzidos pelo sistema operacional, ou seja, com arquivos etc. e subprocess.CalledProcessErrornos informa se houve um problema com o processo chamado por subprocess.run()(ou seja, ele retornou um valor diferente de zero).


Referências de importação do Python

sistema operacional

os.path

subprocesso

Responder2

A resposta acima está correta, mas quero acrescentar meus dois centavos.

O processo que você deseja pode ser feito com PowerShell, caso não saiba como abri-lo pode usar:

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

Então você pode usar estes códigos para processar recursivamente todas as imagens:

$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)}

Basta substituir "caminho para pasta" pelo caminho real.

PS O comando acima só funcionará se 1, o caminho completo do executável imageresizer.exefor fornecido; 2, você alterou o diretório para o caminho onde o executável está localizado; E finalmente, 3, você não precisa cdacessar o caminho do .exeou usar seu caminho completo se você adicionou seu caminho aoCaminhovariável de ambiente.

informação relacionada