Как выполнить пакетное сжатие PNG с PNGQUANT и сохранить все преобразованные изображения с их исходными именами в другую папку?

Я хочу сжать все png файлы изображений, существующие в каталоге, и сохраните все эти преобразованные / сжатые файлы изображений в другую папку с их исходными именами изображений, используя pngquant:

Синтаксис для пакетного сжатия:

pngquant.exe --quality=40-55 images\*.png

Он сжимает все файлы изображений PNG в images каталог и сохраняет сжатые файлы как новые файлы в том же каталоге с добавлением -fs8 после имени исходного файла, например

arrow.png
arrow-fs8.png

arrow.png это исходный файл и arrow-fs8.png это выходной файл

Я хочу сохранить все преобразованные файлы с их оригинальными именами в отдельной папке.

Кто-нибудь знает, как это сделать с pngquant.exe?

Помогите вывести pngquant при запуске с опцией -h:

pngquant, 2.5.2 (October 2015), by Greg Roelofs, Kornel Lesinski.
   Compiled without support for color profiles. Using libpng 1.6.18.

usage:  pngquant [options] [ncolors] -- pngfile [pngfile ...]
        pngquant [options] [ncolors] - >stdout <stdin

options:
  --force           overwrite existing output files (synonym: -f)
  --skip-if-larger  only save converted files if they're smaller than original
  --output file     destination file path to use instead of --ext (synonym: -o)
  --ext new.png     set custom suffix/extension for output filenames
  --quality min-max don't save below min, use fewer colors below max (0-100)
  --speed N         speed/quality trade-off. 1=slow, 3=default, 11=fast & rough
  --nofs            disable Floyd-Steinberg dithering
  --posterize N     output lower-precision color (e.g. for ARGB4444 output)
  --verbose         print status messages (synonym: -v)

Quantizes one or more 32-bit RGBA PNGs to 8-bit (or smaller) RGBA-palette.
The output filename is the same as the input name except that
it ends in "-fs8.png", "-or8.png" or your custom extension (unless the
input is stdin, in which case the quantized image will go to stdout).
The default behavior if the output file exists is to skip the conversion;
use --force to overwrite. See man page for full list of options.

1 ответ

Решение

Вот закомментированный пакетный код для задачи с дополнительными функциями.

@echo off
setlocal

rem It is expected that pngquant.exe is in same directory as the
rem batch file and %~dp0 returns this path ending with a backslash.
set "ToolPath=%~dp0"

rem Use as source directory either the first specified parameter
rem on calling this batch file or the current working directory.
set "SourceFolder=%~f1"
if "%SourceFolder%" == "" set "SourceFolder=%CD%"

rem Replace all slashes by backslashes.
set "SourceFolder=%SourceFolder:/=\%"
rem Remove last character if it is a backslash.
if  "%SourceFolder:~-1%" == "\" set "SourceFolder=%SourceFolder:~0,-1%"

rem Use as output directory either the second specified parameter
rem on calling this batch file or the current working directory.
set "OutputFolder=%~f2"
if "%OutputFolder%" == "" set "OutputFolder=%CD%"
set "OutputFolder=%OutputFolder:/=\%"
if  "%OutputFolder:~-1%" == "\" set "OutputFolder=%OutputFolder:~0,-1%"

rem Set source directory as current directory. The source directory
rem can be also specified with an UNC path which is the reason why
rem command PUSHD is used and not command CD.
pushd "%SourceFolder%"

rem Either optimize all PNG files in source directory with output
rem also in source directory using default new file name or process
rem in a loop each PNG file separately with writing the optimized
rem image to output directory with same name as source file.

if /I "%SourceFolder%" == "%OutputFolder%" (
    "%ToolPath%pngquant.exe" --quality=40-55 --force *.png
) else (
    if not exist "%OutputFolder%" (
        md "%OutputFolder%"
        if errorlevel 1 (
            echo Failed to create the output folder:
            echo.
            echo %OutputFolder%
            echo.
            pause
            goto RestoreEnviroment
        )
    )
    for %%I in (*.png) do (
        "%ToolPath%pngquant.exe" --quality=40-55 --force --output "%OutputFolder%\%%I" "%%I"
    )
)

:RestoreEnviroment
rem Restore the previous current directory and delete the local copy of
rem the environment variables table, i.e. restore previous environment.
popd
endlocal

При запуске / вызове этого пакетного файла можно указать исходную папку в качестве первого параметра и выходную папку в качестве второго параметра.

Если исходная папка должна быть той же самой папкой, что и пакетный файл, и при запуске / вызове этого пакетного файла должна быть указана только выходная папка, укажите в качестве первого параметра просто . для текущей папки.

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • md /?
  • pause /?
  • popd /?
  • pushd /?
  • rem /?
  • set /?
  • setlocal /?
  • pngquant.exe -h
Другие вопросы по тегам