图片无损压缩

简介:

所谓有图有真相,一图胜万言,图片的视觉冲击力、说明力和感染力非常强大。由于视频和音频的代价更高,网站通常选用图片配合文字说明来吸引顾客。图片可能不是网站的核心竞争力,但却是一个网站最最基础的用户体验。除了文学、学术等极少数网站之外,几乎所有的网站都会丰富的图片来装饰网页。


对于html,js,css等文件,自身通常很小且数量有限,压缩价值并不大,况且web服务器几乎都有gzip压缩功能。


因此,网站的流量绝大多数由图片传输构成,从这个意义上讲,通常的网站都是以图片为主并不过分。淘宝京东这些流量巨人,主要的带宽压力无不来自于海量的图片。要知道,程序本身是负责逻辑运算的,只有快慢优劣之分,并不消耗带宽。


无损压缩是图片优化的重要步骤,顾名思义,就是在不改变图片画质的前提下进行容量压缩,图片更小了,传输量就小,从而使网页加载速度更快,显性的提高了带宽的利用率,直接提升用户体验。一般来说,网站首页最起码要控制在2M的红线以内,为了不过分简洁,同时兼顾网站内容足够丰富,理想的状况是1M以内。


常见的图片格式主要是jpeg和png,Linux下对应的无损压缩工具是jpegoptim和optipng


jpegoptim 是一个C语言写的无损压缩软件,效率比较高。我已经在生产环境使用,每天处理图片约10G-30G,根据粗测,每秒大约能处理30张图片,1个小时能处理大约10w张图片,图片优化后体积减少约10% ,经济效益比较可观。


直接运行命令(jpegoptim xx.jpg),如果图片已被压缩,则跳过,如可压缩,则会默认覆盖图片源文件。

参数 -p 可以保证源文件压缩后的属性不变(权限、属主和时间戳),

参数 -q 可以省略屏幕输出,在后台安静压缩。


注意:jpegoptim 在1.3.1版本之前有个bug,-p 参数仅仅保留时间戳不变,权限和属性为600和当前操作用户。


有一台图片服务器,上面都有海量的图片,主要图片格式都是jpg的。


由于是海量文件,第一时间想到了for循环,结果因为文件列表过于庞大,不得不放弃。


最后找到的办法是用find + exec


1
2
3
folder= /webroot/images
find  $folder/$( date  +%m%d) - type  f -iname *.jpg \
         - exec  /usr/sbin/jpegoptim  -q -p {} \;


这个脚本可以在晚上定期跑。也可以考虑用inotify工具做实时压缩。


update 2014-01-15

上面的脚本是单线程的,如果一天的图片实在是太多,可以接着考虑多线程脚本,并发压缩,提高效率,代价是服务器较高的负载压力,主要是CPU和IO。


假设目录结构是按照日期分布的,如下:

1
2
3
4
5
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


那么并行脚本应该这么写。

1
2
3
4
5
6
7
8
9
10
11
12
#!/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 \
             - exec  /usr/sbin/jpegoptim  -q -p {} \;
         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:注释


一般来说,这些都是附着在图片元数据之上的信息,删除它们并不影响图片画质,

“图片瘦身”的办法如下


1
jpegoptim -p --strip-exif --strip-iptc  --strip-com  xxx.jpg










本文转自 紫色葡萄 51CTO博客,原文链接:http://blog.51cto.com/purplegrape/1283203,如需转载请自行联系原作者
目录
相关文章
|
7天前
|
Python
图像序列帧恢复为GIF动图
使用Python的imageio库将图像序列帧恢复为GIF动图,支持自定义持续时间和尺寸调整。
图像序列帧恢复为GIF动图
|
5月前
|
存储 编解码 算法
无损压缩和有损压缩
【4月更文挑战第26天】无损压缩和有损压缩
80 2
|
机器学习/深度学习 计算机视觉
【图片操作】提取GIF的图片帧
gif是我们日常生活中常用的一种图片,它介于视频和图片之间。我们可以用图片的内存体验到一些视频的感觉。但是有时候我们会想把gif的图片全部提取出来,今天我们就来实现一下这个操作。
397 0
|
计算机视觉 异构计算
|
异构计算 Python
|
存储 编解码 算法
图形学 | 格物致知!PNG 除了无损压缩你还知道什么?
图形学 | 格物致知!PNG 除了无损压缩你还知道什么?
287 0
图形学 | 格物致知!PNG 除了无损压缩你还知道什么?
|
数据安全/隐私保护 Android开发
RxPermissions+Matisse+Luban实现图片选择并压缩
前言:这次带来的是使用RxPermissions+知乎图片选择器Matisse+图片压缩工具Luban实现图片选择的功能。 implementation 'com.
1498 0
|
存储 编解码
压缩gif图片尺寸
平时写博客, 为了效果的生动形象, 经常需要嵌入一些gif图片, 但mac的retina显示器分辨率高, 录制出的gif图片往往很大,同时简书限制gif图片不能超过10M, 我在网上查了很多调整gif尺寸的方法, 大多是一些在线转换的方法, 但而且...
2792 0
|
C# 数据安全/隐私保护
C# 压缩PDF图片
文档中包含图片的话,会使得整个文档比较大,占用存储空间且不利于快速、高效的传输文件。针对一些包含大量高质图片的PDF文档,若是对图片进行压缩,可以有效减少文档的占用空间。并且,在文档传输过程中也可以减少传送时间,提高效率。
1263 0