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,非常可观。

g1

欢迎提出你对这个脚本的优化建议。

更新

在使用上面的批处理处理图片时,经常发现有些图片的尺寸过大,比如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增强了检查功能,不会影响正常的执行结果。

阅读余下内容
 

《 “Windows命令行下批量优化图片脚本” 》 有 3 条评论

  1. 临时文件可以不用的

    @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"
    )
    )

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注


京ICP备12002735号