한 번에 하나의 이미지만 처리하는 명령줄 소프트웨어를 어떻게 자동화합니까?

한 번에 하나의 이미지만 처리하는 명령줄 소프트웨어를 어떻게 자동화합니까?

그래서 저는 확장하고 싶은 픽셀 아트 게임의 픽셀 아트 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-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
)

filenames.txt예를 들어 이 배치 파일을 처리하려는 파일과 동일한 디렉토리에 배치하십시오 . 그런 다음 예를 실행하십시오. resizer.bat명령줄에서 또는 두 번 클릭하면 됩니다. 이 경우 %%Gex.에서 읽은 줄입니다. filenames.txt.


옵션 3B - ImageResizer "스크립트"

filenames.txt예를 들어 다음 에서 엽니다 .메모장++, 그런 다음 사용정규 표현식간단한 파일 이름을 원하는 명령으로 바꾸려면 다음을 수행하십시오.

  • 메모장을 엽니다++바꾸다Ctrl+ 를 사용한 대화상자 H.

  • Wrap around및 옵션이 표시되어 있는지 확인하십시오 Regular expression.

  • 해당 Find what:필드에서 괄호 .*안에 영향을 미치고 싶은 파일 확장자를 입력하세요. .png:

    (.*.png)
    
  • 필드 에 Replace withImageResizer 명령을 입력하되 $1파일 이름 대신 다음과 같은 이름을 사용하세요.

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

    %1ex와 일치하는 항목으로 대체됩니다. (.*.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윈도우의 파이썬 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"기본"입니다. 즉, 경로 구성 요소가 포함되어 있지 않습니다.

  • OSErrorOS에서 생성된 오류, 즉 파일 등을 포착하고 subprocess.CalledProcessError호출된 프로세스에 문제가 있었는지 알려줍니다 subprocess.run()(즉, 0이 아닌 값을 반환함).


Python 가져오기 참조

운영 체제

OS.경로

하위 프로세스

답변2

위의 답변은 정확하지만 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 위 명령은 실행 파일의 전체 경로가 imageresizer.exe제공되는 1인 경우에만 작동합니다. 2, 실행 파일이 있는 경로로 디렉터리를 변경했습니다. 마지막으로, 3. 경로를 에 추가한 경우 cd해당 경로로 이동 하거나 전체 경로를 사용할 필요가 없습니다..exe환경 변수.

관련 정보