首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows批处理-使用jpegtran获取最小文件大小

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

Stack Overflow用户
提问于 2014-01-27 06:10:55
回答 3查看 874关注 0票数 1

我最近发现了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/):

代码语言:javascript
复制
@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,并且只保留文件大小较小的版本。我猜主要的问题是,这是否可以在一个脚本中完成,或者是否应该有一个脚本来保存文件,另一个脚本来选择要保留的版本。

EN

回答 3

Stack Overflow用户

发布于 2014-01-27 09:39:33

有趣的问题!首先,一个小细节:你不需要两个单独的for命令来处理两个扩展,你可以这样在同一个for中插入两个扩展:

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

现在关于你的问题:你必须优化所有文件两次:有和没有-progressive标志,然后比较每对文件的大小,以获得最小的一个:

代码语言:javascript
复制
@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"
票数 1
EN

Stack Overflow用户

发布于 2014-01-27 10:15:58

代码语言:javascript
复制
@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集-以防万一。

票数 0
EN

Stack Overflow用户

发布于 2014-01-27 22:55:07

这将为JPG/JPEG文件和compare the sizes创建a.binb.bin,并移动smallest文件以替换JPG文件。

它将处理c:\base\folder下的每个JPG/JPEG文件

首先在示例文件夹树上测试它。

代码语言:javascript
复制
@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
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21369952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档