Windows命令行下批量优化图片脚本
很多时候我们需要将别人网站上的图片拿过来自己用,这些图片有些经过优化,有些没有,有些尺寸很小,但也有些特别大。而且图片的格式也不统一,大多是.jpg格式的,但也有.png/.gif 甚至 .bmp格式的。我发现很多外国的网站上喜欢使用 .png 格式的图片,也行是png图片格式不像其它图片那样有版权问题吧,但png的问题是体积非常大,而相同品质的jpg图片可能只有png图片的二分之一甚至三分之一。
我经常会遇到一个页面是有几十个png图片的问题,这时候必须将将这些图片优化压缩一下,因为你会发现其中有些看似很简单的普通的体积通常会有三、四百KB。由于经常会遇到这样的问题,我通常会将这个页面’另存为‘,保持到桌面,这样页面上的图片都会保存到一个文件夹里,我会用ImageMagic这个图片处理工具优化它们,如果一个图片一个图片的执行优化命令,那会非常费事,下面是我写的一个批处理文件,执行这个批处理文件,它会将指定文件目录下的所有图片全部转换成jpg格式,并且将图片质量压缩到80%品质:
@echo off for /f "delims=" %%i in ('dir /b /s %1') do ( "D:/Program Files/ImageMagick-6.8.9-Q16/convert.exe" %%i -quality 80 %%i.jpg echo %%i del %%i ) pause
需要注意的是,上面的ImageMagick的安装路径是我本机的路径,如果你需要使用这个脚本,需要将上面的路径该为自己的。这个脚本的执行过程是,首先遍历指定的目录(执行时提供的参数),然后用ImageMagick优化这个图片,并给这个文件改名,然后删除原文件。
我把这个脚本命名为batch-images-optimize.bat
,假设我将所有的图片都放入了my-images
目录里,执行的命令是这样的:
batch-images-optimize.bat my-images
执行完后你会发现,目录下的所有图片都变成了jpg格式,而且体积大幅度减小,我曾做过实验,优化前的目录下放置23个png图,总共体积是1.6M,执行完这个批处理命令后,总体积变成 465KB,体积减小了3/4,非常可观。
欢迎提出你对这个脚本的优化建议。
更新
在使用上面的批处理处理图片时,经常发现有些图片的尺寸过大,比如1400×1280,这样的图片尺寸过大导致体积过大,所以这里有了一个新需求,就是要减少图片的尺寸,下面的脚本能达到这样的目的:
@echo off setlocal enabledelayedexpansion for /f "delims=" %%i in ('dir /b /s %1') do ( echo %%i identify -format "%%[fx:w] %%[fx:h]" %%i > %%i.txt for /f "tokens=1,2" %%a in (%%i.txt) do set width=%%a&set height=%%b rm %%i.txt echo width:!width!, height:!height! if !width! LSS 600 ( "D:/Program Files/ImageMagick-6.8.9-Q16/convert.exe" %%i -quality 80 %%i.jpg ) ELSE ( "D:/Program Files/ImageMagick-6.8.9-Q16/convert.exe" %%i -resize 600 -quality 80 %%i.jpg ) del %%i )
上面的脚本中我限定宽带大于600的图片都要resize到600,而小于600的图片将不变。600这个值你是可以调整到自己需要的数值。这个脚本中用到了setlocal enabledelayedexpansion
,它的作用是让“变量延迟扩展”,而延迟扩展变量需要用“!width!”的方式引用。我在调试这个批处理脚本时,遇到循环读图片尺寸得到的数值总是第一张图片的尺寸,也就是图片尺寸变量赋值一次后再也不会改变,就是由于“变量延迟扩展”引起的。
还有一点,当图片格式是PNG时,有时执行脚本会遇到“iCCP: Not recognizing known sRGB profile”的错误提示,这说明这个PNG图片的数据格式不完整,但这只是个警告信息,它是由于高版本的ImageMagick增强了检查功能,不会影响正常的执行结果。
用fastStoneImageViewer批量就可以吧。
临时文件可以不用的
@echo off
for /f "delims=" %%i in ('dir /b /s %1') do (
echo;&echo %%i
for /f "tokens=1-2" %%a in ('identify -format "%%[fx:w] %%[fx:h]" "%%i"') do (
echo width:%%a, height:%%b
if %%a LSS 600 (
convert.exe "%%i" -quality 80 "%%i.jpg"
) ELSE (
convert.exe "%%i" -resize 600 -quality 80 "%%i.jpg"
)
if exist "%%i.jpg" del "%%i"
)
)
我不懂 ,帮顶!顶!顶!使劲顶!