2014-01-26 3 views
1

Недавно я обнаружил jpegtran - инструмент, который может без потерь оптимизировать jpeg-файлы. Это инструмент командной строки, который может выполнять множество операций без потерь в jpegs в зависимости от предоставленных флагов. В этом случае представляющие интерес флаги -оптимизируются, -копии нет и -прогрессивные. Первый оптимизирует jpeg путем оптимизации таблиц Huffman, второй - для всех метаданных, а третий создает прогрессивную jpeg, которая позволяет браузерам отображать более качественную версию файла до загрузки всего файла.Windows batch - получение наименьшего размера файла с помощью jpegtran

Получение минимально возможного размера файла с помощью jpegtran не так просто, как может показаться на первый взгляд. Разумеется, прогрессивные jpegs должны быть больше, поскольку в случае переплетения gifs и png (которые, хотя и не такие же, как прогрессивные jpgs достигают аналогичной цели), всегда приводят к большему размеру файла, однако это не относится к прогрессивным jpegs , Я сделал несколько тестов и исследовал проблему в Интернете, и кажется, что невозможно определить, будет ли данный jpeg меньше при сохранении в качестве базовой линии (-оптимизации) или прогрессивной (-прогрессивной). Я также тестировал использование обоих флагов, но размер файла при использовании флагов -optimize и -progressive такой же, как при использовании только -стратегического флага.

Моя цель - оптимизировать несколько папок с сотнями jpegs в каждом из них. Поскольку такой пакетный скрипт кажется очевидным решением. К сожалению, у меня нет большого опыта работы с пакетными сценариями, и поэтому я решил искать один онлайн. Я нашел пару, но это один я решил пойти с первоначально (http://blog.stationfour.com/automating-png-jpg-image-optimization-in-windows/):

@echo none 
cd %1 
md "%~1\OptimizedJPEGS" 
for %%i in (*.jpg) do "C:\Program Files\Image Optimization\jpegtran.exe" -optimize -copy none "%%i" "%~1\OptimizedJPEGS\%%i" 
move /Y "%~1\OptimizedJPEGS\*.*" "%~1" 
for %%i in (*.jpeg) do "C:\Program Files\Image Optimization\jpegtran.exe" -optimize -copy none "%%i" "%~1\OptimizedJPEGS\%%i" 
move /Y "%~1\OptimizedJPEGS\*.*" "%~1" 
rd "%~1\OptimizedJPEGS" 

я изменить код, удалив прогрессивный флаг и добавив еще один цикл также оптимизировать файлы с расширением .jpeg (исходный скрипт только оптимизировал файлы с расширением .jpg).

Проблема, с которой я столкнулся сейчас, заключается в том, как написать скрипт, который сохранит каждый jpeg в целевом каталоге с -оптимизированными и -progressive флажками отдельно и сохранит только версию с меньшим размером файла. Я предполагаю, что главный вопрос заключается в том, можно ли это сделать в рамках одного сценария или должен быть один скрипт для сохранения файлов, а другой - для выбора версии.

ответ

1

Интересный вопрос! Прежде всего, маленькая деталь: вам не нужно два отдельных for команды для обработки двух расширений, вы можете вставить оба расширения в том же for так:

for %%i in (*.jpg *.jpeg) do "C:\Program Files\Image Optimization\jpegtran.exe" -optimize -copy none "%%i" "%~1\OptimizedJPEGS\%%i" 

Теперь о вашей проблеме: вы должны оптимизировать все файлы дважды: с и без -progressive флага, а затем сравнить размер каждой пары файлов для того, чтобы получить самый маленький:

@echo off 
cd %1 

rem Create optimizations with no Progressive 
md "%~1\OptimizedNotProg" 
for %%i in (*.jpg *.jpeg) do "C:\Program Files\Image Optimization\jpegtran.exe" -optimize -copy none "%%i" "%~1\OptimizedNotProg\%%i" 

rem Create optimizations with Progressive 
md "%~1\OptimizedProg" 
for %%i in (*.jpg *.jpeg) do "C:\Program Files\Image Optimization\jpegtran.exe" -progressive -optimize -copy none "%%i" "%~1\OptimizedProg\%%i" 

rem Delete the larger versions 
for %%i in (*.jpg *.jpeg) do (
    for /F "tokens=1,2 delims=;" %%a in ("%~1\OptimizedNotProg\%%~NXi;%~1\OptimizedProg\%%~NXi") do (
     if %%~Za gtr %%~Zb (
     del "%%a" 
    ) else (
     del "%%b" 
    ) 
    ) 
) 

rem Move the smaller versions 
move /Y "%~1\OptimizedNotProg\*.*" "%~1" 
rd "%~1\OptimizedNotProg" 
move /Y "%~1\OptimizedProg\*.*" "%~1" 
rd "%~1\OptimizedProg" 
0
@ECHO OFF 
SETLOCAL 
:: temporary filename 
:tmploop 
SET "tempfile=%temp%\%random%" 
IF EXIST "%tempfile%*" GOTO tmploop 
ECHO.>"%tempfile%.a" 
pushd %1 
md OptimizedJPEGS 2>nul 
for %%i in (*.jpg *.jpeg) do (
COPY /b "%%i" "%tempfile%.j1" >nul 
FOR %%m IN ("-optimize" "-progressive" "-progressive -optimize") DO (
    "C:\Program Files\Image Optimization\jpegtran.exe" %%~m -copy none "%%i" "%tempfile%.j2" 
    FOR /f "skip=1delims=" %%e IN ('dir /b/os "%tempfile%.j*"') DO (
    DEL "%tempfile%%%~xe" 
    REN "%tempfile%.j*" "%%~ne.j1" 
) 
) 
move /Y "%tempfile%.j*" ".\OptimizedJPEGS\%%i" >nul 
) 
POPD 
DEL "%tempfile%*" 
GOTO :EOF 

Это должно решить проблему.

Сначала создайте временное имя файла и убедитесь, что оно уникально.
Затем перейдите в выбранный каталог
Найти все целевые файлы; первая копия оригинала .j1
Тогда для каждого из комбинаций переключателей, процесс .j2 и удаление в зависимости от того, что больше из .j1 и .j2
Наконец двигаться кратчайшим назад к OptimizedJPEGS подкаталогу

Я думал было бы лучше построить новый набор JPEG в Оптимизированном каталоге и оставить оригинал в покое - на всякий случай.

0

Это должно создать a.bin и b.bin для JPG/JPEG файлов и compare the sizes, и переместить smallest один, чтобы заменить файл JPG.

Он будет обрабатывать каждый JPG/JPEG файл под c:\base\folder

проверить его на дереве папок образца первой.

@echo off 
for /r "c:\base\folder" %%z in (*.jpg *.jpeg) do (
    del "%%~dpz\a.bin" "%%~dpz\b.bin" 2>nul 
    "C:\Program Files\Image Optimization\jpegtran.exe" -optimize -copy none "%%z" "%%~dpz\a.bin" 
    "C:\Program Files\Image Optimization\jpegtran.exe" -progressive -optimize -copy none "%%z" "%%~dpz\b.bin" 
     for %%a in ("%%~dpz\a.bin") do for %%b in ("%%~dpz\b.bin") do (
     if %%~za GEQ %%~zb (move /y "%%~dpz\b.bin" "%%z") else (move /y "%%~dpz\a.bin" "%%z") 
    ) 
    del "%%~dpz\a.bin" "%%~dpz\b.bin" 2>nul 
) 
Смежные вопросы