我最近发现了jpegtran,一个可以无损优化jpeg文件的工具。它是一个命令行工具,可以根据提供的标志对jpeg执行许多不同的无损操作。在这种情况下,感兴趣的标志是-optimize、-copy none和-progressive。第一个是通过优化Huffman表来优化jpeg,第二个是剥离所有元数据,第三个是创建渐进式jpeg,它允许浏览器在下载整个文件之前显示较低质量的文件版本。
使用jpegtran获得尽可能小的文件大小并不像乍看起来那么容易。渐进jpegs应该更大是合乎情理的,因为在gifs和pngs交错的情况下(虽然与渐进jpgs实现类似的目标不同)总是导致更大的文件大小,然而对于渐进jpegs则不是这种情况。我已经做了一些测试,并在网上研究了这个问题,似乎没有办法知道当保存为基线(-optimize)或渐进式(-progressive)时,给定的jpeg是否会更小。我也使用这两个标志进行了测试,但同时使用-optimize和-progressive标志时的文件大小与仅使用-progressive标志时的文件大小相同。
我的目标是优化几个文件夹,每个文件夹包含数百个jpeg。因此,批处理脚本似乎是显而易见的解决方案。不幸的是,我对批处理脚本没有太多的经验,因此我决定在线寻找一个。我找到了几个,但这是我最初决定使用的(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的文件)。
我现在面临的问题是如何编写一个脚本,在目标目录中分别保存带有-optimized和-progressive标志的每个jpeg,并且只保留文件大小较小的版本。我猜主要的问题是,这是否可以在一个脚本中完成,或者是否应该有一个脚本来保存文件,另一个脚本来选择要保留的版本。
发布于 2014-01-27 09:39:33
有趣的问题!首先,一个小细节:你不需要两个单独的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"发布于 2014-01-27 10:15:58
@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集会更好,而不使用原始的JPEG集-以防万一。
发布于 2014-01-27 22:55:07
这将为JPG/JPEG文件和compare the sizes创建a.bin和b.bin,并移动smallest文件以替换JPG文件。
它将处理c:\base\folder下的每个JPG/JPEG文件
首先在示例文件夹树上测试它。
@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
)https://stackoverflow.com/questions/21369952
复制相似问题