Как автоматизировать программное обеспечение командной строки, которое обрабатывает только одно изображение за раз?

Как автоматизировать программное обеспечение командной строки, которое обрабатывает только одно изображение за раз?

Итак, у меня есть несколько тысяч пиксельных 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 сможет использовать для обработки нужных вам изображений.

Простые примеры

  1. В папке с вашими файлами создайте текстовый файл, содержащий только имена файлов и папок, например:

     dir /b > filenames.txt
    
  2. Удалите все имена папок, например 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

Операционные системы

os.путь

подпроцесс

решение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или использовать его полный путь, если вы добавили его путь кПутьпеременная окружения.

Связанный контент