所谓有图有真相,一图胜万言,图片的视觉冲击力、说明力和感染力非常强大。由于视频和音频的代价更高,网站通常选用图片配合文字说明来吸引顾客。图片可能不是网站的核心竞争力,但却是一个网站最最基础的用户体验。除了文学、学术等极少数网站之外,几乎所有的网站都会丰富的图片来装饰网页。
对于html,js,css等文件,自身通常很小且数量有限,压缩价值并不大,况且web服务器几乎都有gzip压缩功能。
因此,网站的流量绝大多数由图片传输构成,从这个意义上讲,通常的网站都是以图片为主并不过分。淘宝京东这些流量巨人,主要的带宽压力无不来自于海量的图片。要知道,程序本身是负责逻辑运算的,只有快慢优劣之分,并不消耗带宽。
压缩是图片优化的重要步骤,图片更小了,传输量就小,从而使网页加载速度更快,显性的提高了带宽的利用率,直接提升用户体验。
一般来说,网站首页理想的状况是1M以内。但为了不过分简洁,同时兼顾网站内容的丰富性,首页最好控制在2M的红线以内。
常见的图片格式主要是jpg和png,Linux下对应的无损压缩工具是jpegoptim和optipng
jpegoptim 是一个C语言写的图片压缩软件,效率比较高。我已经在生产环境使用,每天处理图片约几十G,根据粗测,200K左右的图片,每秒大约能处理30张图片,1个小时能处理大约10w张图片,图片无损压缩优化后体积减少约10% 。如果采用有损压缩,压缩速度会稍有下降,但经济效益会更可观。
直接运行命令(jpegoptim xx.jpg),如果图片已被压缩,则跳过,如可压缩,则会默认覆盖图片源文件。
参数 -p 可以保证源文件压缩后的属性不变(权限、属主和时间戳),
参数 -q 可以省略屏幕输出,在后台安静压缩。
参数 -s 可删除图片中的无关的信息,比如相机型号、光圈、快门、曝光度、日期、作者等等额外文本信息。
参数 -m 可指定压缩质量,比如-m95即保持95%的质量,这个是有损压缩,好处是压缩率高。
(用5%的损失可以换来30%-50%的体积裁剪,对质量要求不高的场合非常具有诱惑力。)
参数 --all-progressive 是指图片加载方式由模糊变清晰,而不是传统的自上而下。这可以造成图片加载更快的错觉,提高用户体验。
有一台图片服务器,上面都有海量的图片,主要图片格式都是jpg的。
由于是海量文件,第一时间想到了for循环,结果因为文件列表过于庞大,不得不放弃。
最后找到的办法是用find + exec ( 低于50k的图片压缩价值不大,这里略过)
folder=/webroot/images find $folder/$(date +%m%d) -type f -iname "*.jpg" -size +50k \ -exec /usr/sbin/jpegoptim -qps --all-progressive {} \;
这个脚本可以在晚上定期跑。也可以考虑用inotify工具做实时压缩。
update 2014-01-15
上面的脚本是单线程的,如果一天的图片实在是太多,可以接着考虑多线程脚本,并发压缩,提高效率,代价是服务器较高的负载压力,主要是CPU和IO。
假设目录结构是按照日期分布的,如下:
webroot/images/2014/0115/09 webroot/images/2014/0115/10 webroot/images/2014/0115/11 webroot/images/2014/0115/12 webroot/images/2014/0115/13
那么并行脚本应该这么写。
#!/usr/bin/env bash folder=/webroot/images if [ -d $folder/$(date +%m%d) ];then for hour in `ls $folder/$(date +%m%d)`; do find $folder/$(date +%m%d)/$hour -type f -iname *.jpg -size +50k \ -exec /usr/sbin/jpegoptim -qps --all-progressive {} \; done else echo $folder/$(date +%m%d) is not exsit. exit 0 fi
一天工作时间有8个小时,webroot
/images/2014/0115/下至少有6-8个,多至10多个子目录,
说实话,我还真担心那么多线程会搞垮服务器,因为jpegoptim 确实有点耗CPU和磁盘IO,
有没有办法控制线程数呢?有,时间数除以线程数,取模,
如果线程数是2,那么任意大于2的正整数除以2,余数只会是0和1
同理,如果线程数是3,那么任意大于3的正整数除以3,余数只会是0,1,2
在shell中,11取余数的办法是 echo $((11%2))
没空写了,自己想吧。
update 2014-04-22
更新jpegoptim 版本为1.3.1
图片其实没有我们眼睛看到的那么简单,背后还有很多文字信息,大致有:
EXIF:照片拍摄时的各种条件,比如光圈、快门、曝光度、相机品牌、拍摄时间等
IPTC:作者、版权、字幕、细节描述等
COMMENT:注释
一般来说,这些都是附着在图片元数据之上的信息,删除它们并不影响图片画质,
“图片瘦身”的办法如下
jpegoptim -p --strip-exif --strip-iptc --strip-com xxx.jpg
转载于:https://blog.51cto.com/purplegrape/1283203