Image Windows批处理-使用jpegtran获取最小的文件大小

Image Windows批处理-使用jpegtran获取最小的文件大小,image,file,batch-file,optimization,jpeg,Image,File,Batch File,Optimization,Jpeg,我最近发现了jpegtran,一种可以无损优化jpeg文件的工具。它是一个命令行工具,可以根据提供的标志对JPEG执行许多不同的无损操作。在这种情况下,感兴趣的标志是-optimize、-copy none和-progressive。第一种是通过优化哈夫曼表来优化jpeg,第二种是剥离所有元数据,而第三种是创建渐进式jpeg,允许浏览器在下载整个文件之前显示文件的低质量版本 使用jpegtran获得尽可能小的文件大小并不像乍看起来那么容易。毫无疑问,渐进式JPEG应该更大,因为在GIF和PNG交

我最近发现了jpegtran,一种可以无损优化jpeg文件的工具。它是一个命令行工具,可以根据提供的标志对JPEG执行许多不同的无损操作。在这种情况下,感兴趣的标志是-optimize、-copy none和-progressive。第一种是通过优化哈夫曼表来优化jpeg,第二种是剥离所有元数据,而第三种是创建渐进式jpeg,允许浏览器在下载整个文件之前显示文件的低质量版本

使用jpegtran获得尽可能小的文件大小并不像乍看起来那么容易。毫无疑问,渐进式JPEG应该更大,因为在GIF和PNG交织的情况下(虽然与渐进式JPG不同,但实现了类似的目标),总是会导致更大的文件大小,但渐进式JPEG的情况并非如此。我已经做了一些测试并在线研究了这个问题,似乎无法判断给定的jpeg在保存为基线(-optimize)或渐进(-progressive)时是否会变小。我还使用了这两个标志进行了测试,但同时使用-optimize和-progressive标志时的文件大小与仅使用-progressive标志时的文件大小相同

我的目标是优化几个文件夹,每个文件夹中有数百个JPEG。因此,批处理脚本似乎是显而易见的解决方案。不幸的是,我没有太多的批处理脚本经验,因此我决定在网上寻找一个。我找到了一对,但这是我最初决定选择的一对():

我确实修改了代码,删除了progressive标志,并添加了另一个循环来优化扩展名为.jpeg的文件(原始脚本只优化了扩展名为.jpg的文件)


我现在面临的问题是如何编写一个脚本,分别使用-optimized和-progressive标志将每个jpeg保存在目标目录中,并且只保留文件大小较小的版本。我想主要的问题是,这是否可以在一个脚本中完成,还是应该有一个用于保存文件的脚本和另一个用于选择要保留的版本的脚本。

有趣的问题!首先,一个小细节:处理两个扩展不需要两个单独的
命令,您可以用相同的
插入两个扩展,方法如下:

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"
@ECHO关闭
SETLOCAL
::临时文件名
:tmploop
设置“tempfile=%temp%\%random%”
如果存在“%tempfile%*”转到tmploop
ECHO.>%tempfile%.a
推送%1
md优化djpegs 2>nul
对于(*.jpg*.jpeg)中的%%i,请执行以下操作(
复制/b“%%i”“%tempfile%.j1”>nul
对于%%m IN(“-optimize”“-progressive”“-progressive-optimize”)执行以下操作(
“C:\Program Files\Image Optimization\jpegtran.exe”%%~m-copy none”%%i”“%tempfile%.j2”
对于/f“skip=1delims=“%%e IN('dir/b/os”%tempfile%.j*“)DO(
删除“%tempfile%%%~xe”
REN“%tempfile%.j*”“%%~ne.j1”
)
)
移动/Y“%tempfile%.j*”。\n优化djpegs\%i“>nul
)
流行音乐
删除“%tempfile%*”
后藤:EOF
这应该可以解决问题

首先,创建一个临时文件名并确保它是唯一的。
然后转到所选目录
查找所有目标文件;首先将原件复制到.j1
然后,对于每个开关组合,处理至.j2并删除.j1和.j2中较长的一个
最后将最短路径移回OptimizedJPEGS子目录


我认为最好在优化的目录中构建新的JPEG集,而不使用原始集,以防万一。

这应该为
JPG/JPEG
文件创建
a.bin
b.bin
,并比较大小
并移动
最小的
一个以替换
JPG
文件

它将处理
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
)
@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
)