Итак, у меня есть несколько тысяч пиксельных png-файлов из пиксельной игры, которые я хочу масштабировать. Я обнаружил, что мое программное обеспечение(2dimagefilter)Однако программное обеспечение делает только одно изображение как в версии с графическим интерфейсом, так и в версии с интерфейсом командной строки.
Как бы я подошел к автоматизации?
СИНТАКСИС такой:
imgresizer.exe /load [IMAGE.png] /resize auto "LQ 4x" /save [OUTIMAGE].png
решение1
Программное обеспечение делает только одно изображение как в версии с графическим интерфейсом, так и в версии с командной строкой.
Согласно параметру справки командной строки для ImageResizer v129 ( imgresizer.exe -h
), вы можете указать несколько файлов для обработки в командной строке:
Вы можете загружать и обрабатывать несколько файлов одновременно, повторно загрузив их после сохранения.
напр. пример кода ImageResizer
imageresizer.exe /load 1.bmp /resize 10x10 Pixel /save 1.jpg /load 2.bmp /resize 10x10 Pixel /save 2.jpg
На первый взгляд эта опция доступна в автономных версиях ImageResizer с ImageResizer-r17.exe
.
Кроме того, начиная с ImageResizer v121 ( ImageResizer-r121.exe
), по-видимому, поддерживаются «скрипты», например:
напр. пример_скрипта.txt
/load 1.png /resize auto "LQ 4x" /save 1.png
/load 2.png /resize auto "LQ 4x" /save 2.png
например, команда ImageResizer
imgresizer.exe /script example_script.txt
Таким образом, использование этой опции может позволить обрабатывать несколько файлов одновременно.
Как и в случае с обычными недопустимыми командами, ImageResizer, по-видимому, выводит свою «справочную» информацию, если не может обработать заданный скрипт.
Как бы я автоматизировал [это]?
Общие подходы
Поскольку, по крайней мере, некоторые версии ImageResizer, по-видимому, могут принимать пакетные инструкции («скрипты» выше), у вас есть два основных выбора:
Создайте скрипт для непосредственного
imageresizer.exe
повторного вызова каждого файла.Создайте скрипт (или используйте другие методы) для создания текстовых файлов, которые ImageResizer сможет использовать для обработки нужных вам изображений.
Простые примеры
В папке с вашими файлами создайте текстовый файл, содержащий только имена файлов и папок, например:
dir /b > filenames.txt
Удалите все имена папок, например
filenames.txt
, . Повторите для всех имен файлов, которые вы не хотите обрабатывать, затем сохраните.
Вариант 3А — традиционный шрифт
Партияциклы FORможет использоваться для многократного вызова исполняемого файла. Создайте текстовый файл с расширением batch ( .bat
) и содержимым, аналогичным следующему:
например resizer.bat
FOR /F %%G IN (filenames.txt) DO (
imageresizer.exe /load %%G /resize auto "LQ 4x" /save %%G
)
Поместите eg filenames.txt
и этот пакетный файл в тот же каталог, что и файлы, которые вы хотите обработать. Затем запустите ex. resizer.bat
из командной строки или просто дважды щелкнув по нему. В этом случае, %%G
это строка, прочитанная из ex. filenames.txt
.
Вариант 3B - ImageResizer "Скрипт"
Открыть например filenames.txt
вБлокнот++, затем используйтеобычные выражениячтобы заменить простые имена файлов на нужные вам команды:
Откройте Notepad++Заменятьдиалог с Ctrl+ H.
Убедитесь, что отмечены опции
Wrap around
и .Regular expression
В
Find what:
поле в скобках введите.*
расширение файла, на которое вы хотите повлиять, например.png
:(.*.png)
В
Replace with
поле введите команду ImageResizer, но вместо$1
имен файлов укажите, например:/load $1 /resize auto "LQ 4x" /save $1
%1
заменяется найденными совпадениями с ex.(.*.png)
.Выбирать
Replace all
.например, Notepad++ - диалоговое окно замены
Это должно преобразовать все ваши имена файлов в, например:
/load file1.png /resize auto "LQ 4x" /save file1.png /load file2.png /resize auto "LQ 4x" /save file2.png
Сохраните новый текстовый файл (например, как
example_script.txt
), а затем используйте егоimageresizer.exe
для запуска скрипта, например:imgresizer.exe /script example_script.txt
Питон
Пример вызова imgresizer.exe /load [IMAGE.png] /resize auto "LQ 4x" /save [OUTIMAGE].png
каждого .png
изображения в текущем каталоге и всех подкаталогах черезPython 3 на 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)
Заметки о скрипте Python
os.walk()
считывает информацию о файле/каталоге иsubprocess.run()
используется для вызова внешних команд, не относящихся к Python, и т. д., т. еimageresizer.exe
.При использовании полного пути для
ROOT_DIR
, используйте\\
вместо него\
разделители пути, например:ROOT_DIR = 'C:\\Example\\Path'
os.walk(ROOT_DIR)
выдает три элемента для каждого каталога в дереве:dirpath
— это путь к текущему (под)каталогу.dirnames
представляет собой список имен подкаталоговdirpath
(исключая.
и..
).filenames
представляет собой список имен файлов, не являющихся каталогами, в форматеdirpath
.
Имена в списках
dirnames
иfilenames
выше являются «голыми», т.е. они не содержат никаких компонентов пути.OSError
перехватывает ошибки, возникающие в ОС, например, с файлами и т. д., иsubprocess.CalledProcessError
сообщает нам, возникла ли проблема с вызванным процессомsubprocess.run()
(например, он вернул ненулевое значение).
Ссылки на импорт Python
решение2
Ответ выше правильный, однако я хочу добавить свои пять копеек.
Необходимый вам процесс можно выполнить с помощью PowerShell. Если вы не знаете, как его открыть, вы можете использовать:
Win+ R>>тип powershell
>> Ctrl+ Shift+Enter
Затем вы можете использовать эти коды для рекурсивной обработки всех изображений:
$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)}
Просто замените «path\to\folder» на фактический путь.
P.S. Приведенная выше команда будет работать только в том случае, если: 1) imageresizer.exe
указан полный путь к исполняемому файлу; 2) вы изменили каталог на путь, где находится исполняемый файл; И, наконец, 3) вам не нужно cd
указывать путь к .exe
или использовать его полный путь, если вы добавили его путь кПутьпеременная окружения.