如何自動化一次只處理一張影像的命令列軟體?

如何自動化一次只處理一張影像的命令列軟體?

因此,我有來自像素藝術遊戲的大約幾千個像素藝術 png,我想對其進行升級。我找到了我的軟體(二維影像濾鏡)但該軟體在 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) 開始,似乎支援“腳本”,例如:

前任。範例腳本.txt

/load 1.png /resize auto "LQ 4x" /save 1.png
/load 2.png /resize auto "LQ 4x" /save 2.png

前任。影像調整器命令

imgresizer.exe /script example_script.txt

因此,使用此選項也可以允許同時處理多個檔案。


與常規無效命令一樣,如果 ImageResizer 無法處理給定的腳本,它似乎會列印其「幫助」資訊。


我將如何自動化[這個]?

一般方法

由於至少某些版本的 ImageResizer 顯然可以接受批次指令(上面的「腳本」),因此您的基本選擇是:

  • 建立一個腳本直接imageresizer.exe對每個檔案重複呼叫。

  • 建立一個腳本(或使用其他方法)來製作 ImageResizer 使用的文字文件,以便處理您想要的圖像。

簡單的例子

  1. 在包含文件的資料夾中,建立一個僅包含文件和資料夾名稱的文字文件,例如:

     dir /b > filenames.txt
    
  2. 從例如 中刪除任何資料夾名稱filenames.txt。對您不想處理的任何檔案名稱重複此操作,然後儲存。


選項 3A - 傳統文字

批次FOR 迴圈可用於重複調用可執行檔。建立一個具有批次副檔名 ( .bat) 且內容類似於以下內容的文字檔案:

前任。調整大小.bat

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

將egfilenames.txt和該批次檔放在與您要處理的檔案相同的目錄中。然後運行前。resizer.bat從命令行或只需雙擊它。在本例中,%%G是從 ex 讀取的行。filenames.txt


選項 3B - ImageResizer“腳本”

打開filenames.txt例如記事本++,然後使用常用表達將簡單的檔案名稱替換為您所需的命令:

  • 開啟記事本++代替Ctrl有+ 的對話框H

  • 確保標記Wrap aroundRegular expression選項。

  • 在該Find what:欄位的括號中,輸入.*您希望影響 ex 的檔案副檔名。.png:

    (.*.png)
    
  • 在該Replace with欄位中,輸入 ImageResizer 命令,但用$1代替檔案名,例如:

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

    %1被替換為 ex 找到的匹配項。(.*.png)

  • 選擇Replace all

    前任。 Notepad++ - 取代對話框

    在此輸入影像描述

  • 這應該會將所有檔案名稱變成 ex.:

    /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 導入參考

作業系統

作業系統路徑

子流程

答案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”替換為實際路徑即可。

imageresizer.exePS 上述命令僅在 1(提供了可執行檔的完整路徑)時才有效; 2、將目錄更改為可執行檔所在的路徑;最後,3,如果您已將其路徑新增cd.exe小路環境變數。

相關內容