所以,我有几千张像素艺术 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 使用,从而处理您想要的图像。
简单示例
在包含文件的文件夹中,创建一个仅包含文件和文件夹名称的文本文件,例如:
dir /b > filenames.txt
从中删除所有文件夹名称,例如
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 around
和Regular 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
每个图像的示例.png
Windows 上的 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 导入参考
答案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
添加到小路环境变量。