一度に 1 つのイメージのみを処理するコマンド ライン ソフトウェアを自動化するにはどうすればよいですか?

一度に 1 つのイメージのみを処理するコマンド ライン ソフトウェアを自動化するにはどうすればよいですか?

ピクセルアートのゲームから数千のピクセルアートのpngファイルを持っていて、それを拡大したいと思っています。ソフトウェアを見つけました(2D画像フィルター)ただし、ソフトウェアは GUI バージョンと CLI バージョンの両方で 1 つのイメージのみを取得します。

自動化するにはどうすればいいでしょうか?
構文は次のとおりです:

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

答え1

ソフトウェアは、GUI バージョンと CLI バージョンの両方で 1 つのイメージのみを取得します。

ImageResizer v129 ( ) のコマンドライン ヘルプ オプションによるとimgresizer.exe -h、コマンドラインで処理する複数のファイルを指定できます。

再度保存してから読み込むことで、複数のファイルを一度に読み込んで処理することができます。

ex. 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 aroundおよびオプションがマークされていることを確認しますRegular expression

  • フィールドの括弧内にFind what:.*変更したいファイル拡張子を入力します。例.png:

    (.*.png)
    
  • フィールドに、ファイル名の代わりにReplace withImageResizer コマンドを入力します。例:$1

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

    %1は、たとえば で見つかった一致に置き換えられます(.*.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各イメージを呼び出す例.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)ツリー内の各ディレクトリに対して 3 つの項目が生成されます。

    • dirpath現在の(サブ)ディレクトリへのパスです。

    • dirnamesは、 内のサブディレクトリ名のリストですdirpath(.とを除く..)。

    • filenamesは、 内のディレクトリ以外のファイルの名前のリストですdirpath

  • dirnames上記のリストとリスト内の名前はfilenames「裸」であり、パス コンポーネントは含まれていません。

  • OSErrorOS によって生成されたエラー (ファイルなど) をキャッチし、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」を実際のパスに置き換えるだけです。

PS 上記のコマンドは、1、実行可能ファイルのフルパスが指定されている場合にのみ機能します。2、実行可能ファイルが配置されているパスにディレクトリを変更した。そして最後に、3、パスを追加した場合は、パスを指定したり、フルパスを使用するimageresizer.exe必要はありません。cd.exeパス環境変数。

関連情報