Тема: CMD/BAT: Image Catalyst
Добрый день!
Я являюсь одним из разработчиков проекта Image Catalyst. Суть проекта - оптимизация/сжатие изображений формата PNG и JPEG без потери качества в рамках того же формата. Как происходит оптимизация можно ознакомится здесь.
Сам проект состоит из приложений по оптимизации и самого batch (на счет batch и хотел поговорить). Отличительная особенность batch в том, что в нем реализована многопоточность для оптимизации PNG, что в свою очередь в разы ускоряет процесс оптимизации.
Хочу попросить участников форма посмотреть на batch и высказать свое мнение и, при возможности, дать советы
Вот ссылка на последнюю версию проекта http://rghost.ru/36228331
@echo off
>nul chcp 866
::Lorents & Res2001 2010-2012
setlocal enabledelayedexpansion
if "%~1" equ "thrt" call:threatwork "%~2" %3 %4 & exit /b
if "%~1" equ "updateic" call:icupdate & exit /b
set "name=Image Catalyst"
set "version=2.2"
title [Loading] %name% %version%
set "fullname=%~0"
set "scrpath=%~dp0"
set "sconfig=%scrpath%tools\"
set "scripts=%scrpath%tools\scripts\"
set "tmppath=%TEMP%\Image Catalyst\%random%"
if exist "%systemroot%\system32\tasklist.exe" (
for /f "tokens=* delims=" %%a in ('tasklist /v /fi "imagename eq cmd.exe" ^| find /c "%name%" ') do (
if %%a equ 1 if exist "%TEMP%\Image Catalyst\" rd /s /q "%TEMP%\Image Catalyst\"
)
)
set "apps=%~dp0Tools\apps\"
PATH %apps%;%PATH%
if not exist "%apps%advdef.exe" set "nofile=%nofile%advdef.exe "
if not exist "%apps%deflopt.exe" set "nofile=%nofile%deflopt.exe "
if not exist "%apps%defluff.exe" set "nofile=%nofile%defluff.exe "
if not exist "%apps%initool.exe" set "nofile=%nofile%initool.exe "
if not exist "%apps%jhead.exe" set "nofile=%nofile%jhead.exe "
if not exist "%apps%jpegtran.exe" set "nofile=%nofile%jpegtran.exe "
if not exist "%apps%pngout.exe" set "nofile=%nofile%pngout.exe "
if not exist "%apps%touch.exe" set "nofile=%nofile%touch.exe "
if not exist "%apps%truepng.exe" set "nofile=%nofile%truepng.exe "
if not exist "%apps%zlib.dll" set "nofile=%nofile%zlib.dll "
if not exist "%sconfig%config.ini" set "nofile=%nofile%config.ini "
if not exist "%scripts%jpeg_scan_rgb.txt" set "nofile=%nofile%jpeg_scan_rgb.txt "
if not exist "%scripts%jpeg_scan_bw.txt" set "nofile=%nofile%jpeg_scan_bw.txt "
if not exist "%scripts%xmlhttprequest.js" set "nofile=%nofile%xmlhttprequest.js "
if defined nofile (
title [Error] %name% %version%
echo ───────────────────────────────────────────────────────────────────────────────
echo Приложение не смогло получить доступ к следующим файлам:
echo.
for %%j in (%nofile%) do echo - %%j
echo.
echo Для выхода из приложения нажмите на Enter.
echo ───────────────────────────────────────────────────────────────────────────────
pause>nul & goto:eof
)
set "ImageNumPNG=0"
set "ImageNumJPG=0"
set "TotalNumPNG=0"
set "TotalNumJPG=0"
set "TotalSizeJPG=0"
set "ImageSizeJPG=0"
set "TotalSizePNG=0"
set "ImageSizePNG=0"
set "changePNG=0"
set "percPNG=100"
set "changeJPG=0"
set "percJPG=100"
set "png="
set "jpeg="
set "updateurl=http://x128.ho.ua/update.ini"
set "configpath=%~dp0\Tools\config.ini"
set "logfile=%tmppath%\Images.csv"
set "iculog=%tmppath%\icu.log"
set "iculck=%tmppath%\icu.lck"
set "countPNG=%tmppath%\countpng"
set "countJPG=%tmppath%\countjpg"
for /f "tokens=*" %%i in ('initool /f:"%configpath%" /s:"options" /k:"fs" ') do if /i "%%~i" equ "true" set "fs=/s"
for /f "tokens=*" %%i in ('initool /f:"%configpath%" /s:"options" /k:"threatpng" ') do call:sethreat %%~i & set "threatpng=!threat!" & set "threat="
for /f "tokens=*" %%i in ('initool /f:"%configpath%" /s:"options" /k:"update" ') do set "updatecheck=%%i"
set "sec-jpeg="
for /f "tokens=*" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"ft" ') do if /i "%%~i" equ "true" set "ft=-ft"
for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"dc" ') do if /i "%%~i" equ "true" set "sec-jpeg=-dc"
for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"de" ') do if /i "%%~i" equ "true" set "sec-jpeg=%sec-jpeg% -de"
for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"di" ') do if /i "%%~i" equ "true" set "sec-jpeg=%sec-jpeg% -di"
for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"dx" ') do if /i "%%~i" equ "true" set "sec-jpeg=%sec-jpeg% -dx"
for /f "tokens=1" %%i in ('initool /f:"%configpath%" /s:"jpeg" /k:"du" ') do if /i "%%~i" equ "true" set "sec-jpeg=%sec-jpeg% -du"
for /f "tokens=*" %%i in ('initool /f:"%configpath%" /s:"png" /k:"na" ') do set na=%%i
for /f "tokens=*" %%i in ('initool /f:"%configpath%" /s:"png" /k:"nc" ') do if /i "%%~i" equ "false" set "nc=-nc"
for /f "tokens=*" %%i in ('initool /f:"%configpath%" /s:"png" /k:"chunks" ') do set chunks=%%i
set "threatjpg=1"
if %threatpng% equ 1 (set "multithreat=0") else set "multithreat=1"
if "%~1" neq "" (
set "params=%*"
) else (
title [Manual] %name% %version%
echo ───────────────────────────────────────────────────────────────────────────────
echo Оптимизировать изображения формата PNG и JPEG можно следующими способами:
echo 1. перенесите файлы и/или папки с файлами на иконку "Image Catalyst.bat";
echo 2. запустите "Image Catalyst.bat" с параметрами "файл/папка с файлами".
echo.
echo Настоятельно рекомендуется перед оптимизацией изучить справку ^(ReadMe.txt^)
echo Для выхода из приложения нажмите на Enter.
echo ───────────────────────────────────────────────────────────────────────────────
pause>nul & exit
)
for %%a in (%params%) do (
call:initsource "%%~a"
if defined ispng (
if not defined isfolder (
set /a "TotalNumPNG+=1"
) else (
for /f "delims=" %%i in ('dir /b %fs% /a-d-h "%%~a\*.png" 2^>nul ^| find /c /v "" ') do set /a "TotalNumPNG+=%%i"
)
)
if defined isjpeg (
if not defined isfolder (
set /a "TotalNumJPG+=1"
) else (
for /f "delims=" %%i in ('dir /b %fs% /a-d-h "%%~a\*.jpg" "%%~a\*.jpeg" "%%~a\*.jpe" 2^>nul ^| find /c /v "" ') do set /a "TotalNumJPG+=%%i"
)
)
)
if "%TotalNumPNG%" equ "0" set "multithreat=0"
set "params1="
for %%a in (%params%) do (
set "err="
1>nul 2>nul dir "%%~a" || (
title [Error] %name% %version%
echo ───────────────────────────────────────────────────────────────────────────────
echo Указанный путь к папке или файлу не найден.
echo Для выхода из приложения нажмите на Enter.
echo ───────────────────────────────────────────────────────────────────────────────
set "err=1"
pause>nul & exit
)
if not defined err (
call:initsource "%%~a"
if not defined ispng if not defined isjpeg set "err=2"
if not defined err (
if defined ispng if not defined png call:png "%%~a"
if defined isjpeg if not defined jpeg call:jpeg "%%~a"
set "params1=!params1! %%a"
)
)
)
if not defined params1 (
title [Error] %name% %version%
echo ───────────────────────────────────────────────────────────────────────────────
echo Файлы формата PNG и JPEG не найдены.
echo Для выхода из приложения нажмите на Enter.
echo ───────────────────────────────────────────────────────────────────────────────
pause>nul & exit
)
if not exist "%tmppath%" 1>nul 2>&1 md "%tmppath%"
1>nul 2>&1 del /f /q "%tmppath%\*"
if "%png%" equ "0" set "multithreat=0"
if %multithreat% neq 0 >"%logfile%" echo.
if not defined png set "png=0"
if not defined jpeg set "jpeg=0"
cls
if /i "%na%" equ "false" (
set "na=-na"
) else (
if %png% equ 1 set "na=-a1"
if %png% equ 2 set "na=-a0"
if %png% equ 3 set "na=-a1"
if %png% equ 4 set "na=-a0"
if %png% equ 5 set "na=-a1"
if %png% equ 6 set "na=-a0"
)
echo _______________________________________________________________________________
echo.
call:setitle
if /i "%updatecheck%" equ "true" start "" /b cmd.exe /c ""%fullname%" updateic"
set stime=%date% %time:~0,2%:%time:~3,2%:%time:~6,2%
for %%a in (%params1%) do (
call:initsource "%%~a"
if defined ispng if "%png%" neq "0" call:pngwork "%%~a"
if defined isjpeg if "%jpeg%" neq "0" call:jpegwork "%%~a"
)
:waithreat
set "thrt="
for /l %%z in (1,1,%threatpng%) do if exist "%tmppath%\thrtpng%%z.lck" (set "thrt=1") else call:typelog & call:setitle
for /l %%z in (1,1,%threatjpg%) do if exist "%tmppath%\thrtjpg%%z.lck" (set "thrt=1") else call:typelog & call:setitle
if defined thrt >nul 2>&1 ping -n 1 -w 500 127.255.255.255 & goto:waithreat
call:end
pause>nul & exit /b
:icupdate
if not exist "%scripts%xmlhttprequest.js" exit /b
>"%iculck%" echo.Update IC
cscript //nologo //E:JScript "%scripts%xmlhttprequest.js" %updateurl% 2>nul 1>"%iculog%" || 1>nul 2>&1 del /f /q "%iculog%"
1>nul 2>&1 del /f /q "%iculck%"
exit /b
:createthreat
if %2 equ 1 call:threatwork "%~3" %1 1 & call:typelog & exit /b
for /l %%z in (1,1,%2) do (
if not exist "%tmppath%\thrt%1%%z.lck" (
call:typelog
>"%tmppath%\thrt%1%%z.lck" echo Обработка файла: %~3
start "" /b cmd.exe /c ""%fullname%" thrt "%~3" %1 %%z "
exit /b
)
)
1>nul 2>&1 ping -n 1 -w 500 127.255.255.255
goto:createthreat
:typelog
if %multithreat% equ 0 exit /b
if exist "%tmppath%\typelog.lck" exit /b
>"%tmppath%\typelog.lck" echo.typelog %typenum%
if not defined typenum set "typenum=1"
for /f "usebackq skip=%typenum% tokens=1-5 delims=;" %%b in ("%logfile%") do (
if "%%d" equ "" (
echo File - "%%~b"
echo Error - %%c
) else (
echo File - "%%~b"
echo In - %%c байт
echo Out - %%d байт ^(%%e байт, %%f%%^)
)
echo _______________________________________________________________________________
echo.
set /a "typenum+=1"
)
1>nul 2>&1 del /f /q "%tmppath%\typelog.lck"
exit /b
:threatwork
if /i "%2" equ "png" call:pngfilework %1 %3 & call:countplus "%countPNG%"
if /i "%2" equ "jpg" call:jpegfilework %1 %3
if exist "%tmppath%\thrt%2%3.lck" >nul 2>&1 del /f /q "%tmppath%\thrt%2%3.lck"
exit /b
:countplus
if %multithreat% equ 0 exit /b
call:waitflag "%~1.lck"
>"%~1.lck" echo.%~1
>>"%countPNG%" echo.1
1>nul 2>&1 del /f /q "%~1.lck"
exit /b
:waitflag
if exist "%~1" (1>nul 2>&1 ping -n 1 -w 500 127.255.255.255 & goto:waitflag)
exit /b 0
:initsource
set "isjpeg="
set "ispng="
set "isfolder="
1>nul 2>nul dir /ad "%~1" && set "isfolder=1"
if not defined isfolder (
if /i "%~x1" equ ".png" set "ispng=1"
if /i "%~x1" equ ".jpg" set "isjpeg=1"
if /i "%~x1" equ ".jpeg" set "isjpeg=1"
if /i "%~x1" equ ".jpe" set "isjpeg=1"
) else (
1>nul 2>nul dir /b %fs% /a-d-h "%~1\*.png" && set "ispng=1"
1>nul 2>nul dir /b %fs% /a-d-h "%~1\*.jpg" "%~1\*.jpeg" "%~1\*.jpe" && set "isjpeg=1"
)
exit /b
:sethreat
if "%~1" equ "" (set "threat=%NUMBER_OF_PROCESSORS%") else (
set /a "threat=%~1+1-1"
if "!threat!" equ "0" set "threat=%NUMBER_OF_PROCESSORS%"
)
exit /b
:png
title [PNG: %TotalNumPNG%] %name% %version%
echo ─────────────────────────
echo Параметр оптимизации PNG:
echo ─────────────────────────
echo.
echo Non-interlaced:
echo [1] Xtreme [2] Advanced
echo.
echo Interlaced:
echo [3] Xtreme [4] Advanced
echo.
echo Default:
echo [5] Xtreme [6] Advanced
echo.
echo [0] Пропустить оптимизацию изображений формата PNG
echo.
:loop1
set png=
echo ─────────────────────────────────────────────────────────────
set /p png="#Укажите параметр оптимизации PNG и нажмите на Enter [0-8]: "
echo ─────────────────────────────────────────────────────────────
echo.
if "%png%" equ "" set "png=0"
if "%png%" equ "0" exit /b
if "%png%" neq "1" if "%png%" neq "2" if "%png%" neq "3" if "%png%" neq "4" if "%png%" neq "5" if "%png%" neq "6" if "%png%" neq "7" if "%png%" neq "8" (
echo ──────────────────────────────────────────────────────────────────
echo Error. Вы указали неправильное значение параметра оптимизации PNG.
echo ──────────────────────────────────────────────────────────────────
echo.
goto:loop1
)
exit /b
:jpeg
title [JPEG: %TotalNumJPG%] %name% %version%
echo ──────────────────────────
echo Параметр оптимизации JPEG:
echo ──────────────────────────
echo.
echo [1] Optimize [2] Progressive
echo.
echo [3] Maximum [4] Default
echo.
echo [0] Пропустить оптимизацию изображений формата JPEG
echo.
:loop2
set jpeg=
echo ──────────────────────────────────────────────────────────────
set /p jpeg="#Укажите параметр оптимизации JPEG и нажмите на Enter [0-4]: "
echo ──────────────────────────────────────────────────────────────
echo.
if "%jpeg%" equ "0" set "jpeg=0"
if "%jpeg%" equ "0" exit /b
if "%jpeg%" neq "1" if "%jpeg%" neq "2" if "%jpeg%" neq "3" if "%jpeg%" neq "4" (
echo ───────────────────────────────────────────────────────────────────
echo Error. Вы указали неправильное значение параметра оптимизации JPEG.
echo ───────────────────────────────────────────────────────────────────
echo.
goto:loop2
)
exit /b
:setitle
if "%jpeg%" equ "0" if "%png%" equ "0" (title %~1%name% %version% & exit /b)
if %multithreat% neq 0 (
set "ImageNumPNG=0"
for %%b in ("%countPNG%") do set /a "ImageNumPNG=%%~zb/3" 2>nul
)
if "%jpeg%" equ "0" (
title %~1[PNG: %ImageNumPNG%/%TotalNumPNG%] %name% %version%
) else (
if "%png%" equ "0" (
title %~1[JPEG: %ImageNumJPG%/%TotalNumJPG%] %name% %version%
) else (
title %~1[PNG: %ImageNumPNG%/%TotalNumPNG%] [JPEG: %ImageNumJPG%/%TotalNumJPG%] %name% %version%
)
)
exit /b
:pngwork
if defined isfolder (
for /f "delims=" %%i in ('dir /b %fs% /a-d-h "%~1\*.png" ') do (
call:createthreat png %threatpng% "%%~fi"
set /a "ImageNumPNG+=1" & call:setitle
)
) else (
call:createthreat png %threatpng% "%~1"
set /a "ImageNumPNG+=1" & call:setitle
)
exit /b
:pngfilework
set pnglog="%tmppath%\png%2.log"
1>nul 2>&1 copy /b /y "%~f1" "%tmppath%\%~nx1" || (call:saverrorlog "%~f1" "Не удается найти указанный файл" & exit /b)
attrib "%~f1" | 1>nul 2>&1 findstr /b /r ".....R" && (call:saverrorlog "%~f1" "Файл только для чтения" & exit /b)
truepng -info "%tmppath%\%~nx1" >%pnglog% 2>nul
find /i "The file being readed is not a valid" <%pnglog% 1>nul 2>&1 && (call:saverrorlog "%~f1" "Указанный файл не является форматом PNG" & exit /b)
find /i "apng" <%pnglog% >nul && (call:saverrorlog "%~f1" "Animated PNG" & exit /b)
if %multithreat% equ 0 for %%a in ("%~f1") do set /a "TotalSizePNG+=%%~za"
set "psize=%~z1"
if %png% equ 1 call:Non-interlaced-Xtreme "%tmppath%\%~nx1" >nul
if %png% equ 2 call:Non-interlaced-Advanced "%tmppath%\%~nx1" >nul
if %png% equ 3 call:Interlaced-Xtreme "%tmppath%\%~nx1" >nul & set "isinterlaced=1"
if %png% equ 4 call:Interlaced-Advanced "%tmppath%\%~nx1" >nul & set "isinterlaced=1"
if %png% gtr 4 (
find /i "Interlaced" <%pnglog% >nul
if errorlevel 1 (
if %png% equ 5 call:Non-interlaced-Xtreme "%tmppath%\%~nx1" >nul
if %png% equ 6 call:Non-interlaced-Advanced "%tmppath%\%~nx1" >nul
) else (
if %png% equ 5 call:Interlaced-Xtreme "%tmppath%\%~nx1" >nul
if %png% equ 6 call:Interlaced-Advanced "%tmppath%\%~nx1" >nul
)
)
if %png% gtr 4 (
call:backup "%~f1" "%tmppath%\%~nx1" >nul
) else (
set "isinterlaced%2="
find /i "Interlaced" <%pnglog% >nul && set "isinterlaced%2=1"
if %png% lss 3 (
if not defined isinterlaced%2 (
call:backup "%~f1" "%tmppath%\%~nx1" >nul
) else (
1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
)
) else (
if defined isinterlaced%2 (
call:backup "%~f1" "%tmppath%\%~nx1" >nul
) else (
1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
)
)
)
truepng -nz -md %chunks% "%~f1" >nul
deflopt -k "%~f1" >nul
defluff < "%~f1" > "%tmppath%\%~n1-defluff.png" 2>nul
1>nul 2>&1 move /y "%tmppath%\%~n1-defluff.png" "%~f1"
deflopt -k "%~f1" >nul
call:savelog "%~f1" !psize!
if %multithreat% equ 0 for %%a in ("%~f1") do set /a "ImageSizePNG+=%%~za"
del /f /q %pnglog% >nul
set "isinterlaced%2="
set "pnglog="
exit /b
:jpegwork
if defined isfolder (
for /f "delims=" %%i in ('dir /b %fs% /a-d-h "%~1\*.jpg" "%~1\*.jpeg" "%~1\*.jpe" ') do (
call:createthreat jpg %threatjpg% "%%~fi"
set /a "ImageNumJPG+=1" & call:setitle
)
) else (
call:createthreat jpg %threatjpg% "%~1"
set /a "ImageNumJPG+=1" & call:setitle
)
exit /b
:jpegfilework
1>nul 2>&1 copy /b /y "%~f1" "%tmppath%\%~nx1" || (call:saverrorlog "%~f1" "Не удается найти указанный файл" & exit /b)
1>"%tmppath%\%~n1.txt" 2>&1 jhead -v "%tmppath%\%~nx1"
find /i "Not JPEG:" <"%tmppath%\%~n1.txt" 1>nul 2>&1 && (call:saverrorlog "%~f1" "Указанный файл не является форматом JPEG" & exit /b)
find /i "Jpeg process" <"%tmppath%\%~n1.txt" >nul
if errorlevel 1 (
set ep=Baseline
) else (
find /i "Progressive" <"%tmppath%\%~n1.txt" 1>nul 2>&1 || (call:saverrorlog "%~f1" "Указанный файл не поддерживается" & exit /b)
set ep=Progressive
)
if %multithreat% equ 0 for %%a in ("%~f1") do set /a "TotalSizeJPG+=%%~za"
set "jsize1=%~z1"
if %jpeg% equ 1 (
jpegtran -copy all -optimize -perfect "%tmppath%\%~nx1" "%tmppath%\%~nx1"
if /i "!ep!" equ "Baseline" (
for %%j in ("%tmppath%\%~nx1") do set "jsize2=%%~zj"
if !jsize1! leq !jsize2! (
1>nul 2>&1 del /f /q "%tmppath%\%~nx1"
) else (
touch -r "%~f1" "%tmppath%\%~nx1"
1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
if errorlevel 1 call:saverrorlog "%~f1" "Файл только для чтения" & exit /b
)
)
if /i "!ep!" equ "Progressive" (
touch -r "%~f1" "%tmppath%\%~nx1"
1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
if errorlevel 1 call:saverrorlog "%~f1" "Файл только для чтения" & exit /b
)
)
if %jpeg% equ 2 (
find /i "3 color components" <"%tmppath%\%~n1.txt" >nul
if errorlevel 1 (set cm=bw) else (set cm=rgb)
jpegtran -copy all -scans "%scripts%jpeg_scan_!cm!.txt" -perfect "%tmppath%\%~nx1" "%tmppath%\%~nx1"
if /i "!ep!" equ "Baseline" (
touch -r "%~f1" "%tmppath%\%~nx1"
1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
if errorlevel 1 call:saverrorlog "%~f1" "Файл только для чтения" & exit /b
)
if /i "!ep!" equ "Progressive" (
for %%j in ("%tmppath%\%~nx1") do set "jsize2=%%~zj"
if !jsize1! leq !jsize2! (
1>nul 2>&1 del /f /q "%tmppath%\%~nx1"
) else (
touch -r "%~f1" "%tmppath%\%~nx1"
1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
if errorlevel 1 call:saverrorlog "%~f1" "Файл только для чтения" & exit /b
)
)
)
if %jpeg% equ 3 (
find /i "3 color components" <"%tmppath%\%~n1.txt" >nul
if errorlevel 1 (set cm=bw) else (set cm=rgb)
jpegtran -copy all -optimize -perfect "%tmppath%\%~nx1" "%tmppath%\%~nx1.opt"
jpegtran -copy all -scans "%scripts%jpeg_scan_!cm!.txt" -perfect "%tmppath%\%~nx1" "%tmppath%\%~nx1.pro"
for %%j in ("%tmppath%\%~nx1.opt") do set "jsize2=%%~zj"
for %%j in ("%tmppath%\%~nx1.pro") do set "jsize3=%%~zj"
if !jsize2! leq !jsize3! (
1>nul 2>&1 move /y "%tmppath%\%~nx1.opt" "%tmppath%\%~nx1"
1>nul 2>&1 del /f /q "%tmppath%\%~nx1.pro"
) else (
1>nul 2>&1 move /y "%tmppath%\%~nx1.pro" "%tmppath%\%~nx1"
1>nul 2>&1 del /f /q "%tmppath%\%~nx1.opt"
)
for %%j in ("%tmppath%\%~nx1") do set "jsize4=%%~zj"
if !jsize1! leq !jsize4! (
1>nul 2>&1 del /f /q "%tmppath%\%~nx1"
) else (
touch -r "%~f1" "%tmppath%\%~nx1"
1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
if errorlevel 1 call:saverrorlog "%~f1" "Файл только для чтения" & exit /b
)
)
if %jpeg% equ 4 (
if /i "!ep!" equ "Baseline" jpegtran -copy all -optimize -perfect "%tmppath%\%~nx1" "%tmppath%\%~nx1"
if /i "!ep!" equ "Progressive" (
find /i "3 color components" <"%tmppath%\%~n1.txt" >nul
if errorlevel 1 (set cm=bw) else (set cm=rgb)
jpegtran -copy all -scans "%scripts%jpeg_scan_!cm!.txt" -perfect "%tmppath%\%~nx1" "%tmppath%\%~nx1"
)
for %%j in ("%tmppath%\%~nx1") do set "jsize2=%%~zj"
if !jsize1! leq !jsize2! (
1>nul 2>&1 del /f /q "%tmppath%\%~nx1"
) else (
touch -r "%~f1" "%tmppath%\%~nx1"
1>nul 2>&1 move /y "%tmppath%\%~nx1" "%~f1"
if errorlevel 1 call:saverrorlog "%~f1" "Файл только для чтения" & exit /b
)
)
1>nul 2>&1 del /f /q "%tmppath%\%~n1.txt"
jhead %sec-jpeg% %ft% "%~f1" 1>nul 2>nul
call:savelog "%~f1" !jsize1!
if %multithreat% equ 0 for %%a in ("%~f1") do set /a "ImageSizeJPG+=%%~za"
set "ep="
set "cm="
exit /b
:backup
if %~z1 leq %~z2 (del /f /q %2) else (1>nul 2>&1 move /y %2 %1)
exit /b
:savelog
set /a "change=%~z1-%2"
set /a "perc=%~z1*100/%2"
if %multithreat% neq 0 (
call:waitflag "%tmppath%\typelog.lck"
>"%tmppath%\typelog.lck" echo.savelog %~1
>>"%logfile%" echo.%~1;%2;%~z1;%change%;%perc%
1>nul 2>&1 del /f /q "%tmppath%\typelog.lck"
) else (
echo File - "%~f1"
echo In - %~z1 байт
echo Out - %~z1 байт ^(%change% байт, %perc%%%^)
echo _______________________________________________________________________________
echo.
)
exit /b
:saverrorlog
1>nul 2>&1 del /f /q "%tmppath%\%~nx1"
if %multithreat% equ 0 (
echo File - "%~f1"
echo Error - %~2
echo _______________________________________________________________________________
echo.
) else (
call:waitflag "%tmppath%\typelog.lck"
>"%tmppath%\typelog.lck" echo.saverrorlog %~1
>>"%logfile%" echo.%~1;%~2
1>nul 2>&1 del /f /q "%tmppath%\typelog.lck"
)
exit /b
:end
set ftime=%date% %time:~0,2%:%time:~3,2%:%time:~6,2%
call:setitle "[Finished] "
if "%jpeg%" equ "0" if "%png%" equ "0" 1>nul ping -n 1 -w 500 127.255.255.255 2>nul & goto:finmessage
if %multithreat% neq 0 for /f "usebackq tokens=1-5 delims=;" %%a in ("%logfile%") do if "%%c" neq "" (
if /i "%%~xa" equ ".png" set /a "TotalSizePNG+=%%b" & set /a "ImageSizePNG+=%%c"
if /i "%%~xa" equ ".jpg" set /a "TotalSizeJPG+=%%b" & set /a "ImageSizeJPG+=%%c"
if /i "%%~xa" equ ".jpeg" set /a "TotalSizeJPG+=%%b" & set /a "ImageSizeJPG+=%%c"
if /i "%%~xa" equ ".jpe" set /a "TotalSizeJPG+=%%b" & set /a "ImageSizeJPG+=%%c"
)
set /a "changePNG=%ImageSizePNG%-%TotalSizePNG%" 2>nul
set /a "percPNG=%ImageSizePNG%*100/%TotalSizePNG%" 2>nul
set /a "changeJPG=%ImageSizeJPG%-%TotalSizeJPG%" 2>nul
set /a "percJPG=%ImageSizeJPG%*100/%TotalSizeJPG%" 2>nul
1>nul 2>&1 del /f /q "%logfile%" "%countJPG%" "%countPNG%"
if "%jpeg%" equ "0" (
echo PNG: %changePNG% байт, %percPNG%%%
) else (
if "%png%" equ "0" (
echo JPEG: %changeJPG% байт, %percJPG%%%
) else (
echo PNG: %changePNG% байт, %percPNG%%%
echo JPEG: %changeJPG% байт, %percJPG%%%
)
)
echo.
echo Started at - %stime%
echo Finished at - %ftime%
echo.
:finmessage
echo Оптимизация изображений завершена. Для выхода из приложения нажмите на Enter.
echo _______________________________________________________________________________
:waitupdate
if /i "%updatecheck%" neq "true" exit /b
if exist "%iculck%" (
1>nul ping -n 1 -w 500 127.255.255.255 2>nul
goto:waitupdate
)
if exist "%iculog%" (
for /f "tokens=*" %%i in ('initool /f:"%iculog%" /s:"update" /k:"ver" ') do set "veru=%%~i"
for /f "tokens=*" %%i in ('initool /f:"%iculog%" /s:"update" /k:"url" ') do set "urlu=%%~i"
if "%version%" neq "!veru!" (
title [Update] %name% %version%
echo.
echo Доступна новая версия %name% !veru!
echo Вы можете загрузить её по адресу: !urlu!
echo _______________________________________________________________________________
)
1>nul 2>&1 del /f /q "%iculog%"
)
if exist "%tmppath%" 1>nul 2>&1 rd /s /q "%tmppath%"
exit /b
:Non-interlaced-Xtreme
set "kp="
truepng -i0 -zc9 -zm3-9 -zs0-3 -fe -fs:7 %nc% %na% -force "%~f1"
for /f "tokens=2 delims=/f " %%j in ('pngout -l "%~f1"') do set "filter=%%j"
if "!filter!" neq "0" set "kp=-kp"
set "psize1=%~z1"
pngout -s3 -k1 "%~f1"
set "psize2=%~z1"
if !psize1! neq !psize2! (
for /l %%j in (1,1,8) do pngout -s3 -k1 -n%%j "%~f1"
) else (
pngout -s0 -f6 -k1 -ks !kp! "%~f1"
advdef -z4 "%~f1"
)
exit /b
:Non-interlaced-Advanced
truepng -i0 -zc9 -zm8-9 -zs0-1 -f0,5 -fs:7 %nc% %na% -force "%~f1"
advdef -z4 "%~f1"
exit /b
:Interlaced-Xtreme
truepng -i1 -zc9 -zm8-9 -zs0-3 -fe -fs:7 %nc% %na% -force "%~f1"
advdef -z4 "%~f1"
exit /b
:Interlaced-Advanced
truepng -i1 -zc9 -zm8-9 -zs0-1 -f0,5 -fs:7 %nc% %na% -force "%~f1"
advdef -z4 "%~f1"
exit /b