我如何才能自动化每次仅处理一个图像的命令行软件?

我如何才能自动化每次仅处理一个图像的命令行软件?

所以,我有几千张像素艺术 png 图片,它们来自一个像素艺术游戏,我想把它们放大。我发现我的软件(2d图像过滤器)但是该软件在 GUI 和 CLI 版本中都只拍摄一个图像。

我该如何实现自动化?
语法是:

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

答案1

该软件在 GUI 和 CLI 版本中都仅拍摄一个图像。

根据 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)开始,似乎支持“脚本”,例如:

例如 example_script.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。对任何您不想处理的文件名重复上述步骤,然后保存。


选项 3A - 传统字体

FOR 循环可用于重复调用可执行文件。创建一个带有批处理扩展名 ( .bat) 的文本文件,内容类似以下内容:

例如 resizer.bat

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

将 egfilenames.txt和此批处理文件放在与要处理的文件相同的目录中。然后resizer.bat从命令行运行 ex. 或只需双击它即可。在本例中,%%G是从 ex. 读取的行filenames.txt


选项 3B - ImageResizer“脚本”

打开filenames.txt例如记事本++,然后使用常用表达用您想要的命令替换简单文件名:

  • 打开 Notepad++代替Ctrl带有+ 的对话框H

  • 确保Wrap aroundRegular expression选项已标记。

  • Find what:字段的括号中输入.*您想要影响的文件扩展名,例如.png

    (.*.png)
    
  • 在该Replace with字段中,输入您的 ImageResizer 命令,但用$1文件名代替,例如:

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

    %1(.*.png)被用 ex .找到的匹配项替换。

  • 选择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
    

Python

通过以下方式调用当前目录和所有子目录中的imgresizer.exe /load [IMAGE.png] /resize auto "LQ 4x" /save [OUTIMAGE].png每个图像的示例.pngWindows 上的 Python 3

# 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.path

子进程

答案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”替换为实际路径即可。

PS 上述命令仅在以下情况下才有效:1,imageresizer.exe提供了可执行文件的完整路径;2,你将目录更改为可执行文件所在的路径;最后,3,如果你已将其cd路径.exe添加到小路环境变量。

相关内容