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.exe
repetidamente 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
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
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.txt
e este arquivo em lote no mesmo diretório dos arquivos que você deseja processar. Então execute ex. resizer.bat
na linha de comando ou apenas clicando duas vezes nele. Neste caso, %%G
a linha é lida do ex. filenames.txt
.
Opção 3B - ImageResizer "Script"
Abra, por exemplo, filenames.txt
emBloco 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 around
eRegular expression
estejam marcadas.No
Find what:
campo, entre parênteses, coloque.*
a extensão do arquivo que deseja afetar ex..png
:(.*.png)
No
Replace with
campo, coloque o comando ImageResizer mas no$1
lugar 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
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-oimageresizer.exe
para 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].png
para cada .png
imagem 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 emdirpath
(excluindo.
e..
).filenames
é uma lista dos nomes dos arquivos que não são de diretório emdirpath
.
Os nomes nas listas
dirnames
efilenames
acima são "vazios", ou seja, não contêm nenhum componente de caminho.OSError
captura erros produzidos pelo sistema operacional, ou seja, com arquivos etc. esubprocess.CalledProcessError
nos informa se houve um problema com o processo chamado porsubprocess.run()
(ou seja, ele retornou um valor diferente de zero).
Referências de importação do Python
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.exe
for fornecido; 2, você alterou o diretório para o caminho onde o executável está localizado; E finalmente, 3, você não precisa cd
acessar o caminho do .exe
ou usar seu caminho completo se você adicionou seu caminho aoCaminhovariável de ambiente.