- 浏览: 2597310 次
- 来自: 杭州
文章分类
- 全部博客 (1190)
- webwork (4)
- 网摘 (18)
- java (104)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (15)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (8)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
Aqu415:
,默认是netty还是hassion?
dubbo入门 -
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介
这次乐高的题目是如何提高图片的压缩率。帮助公司省流量的费用。
整个过程持续一周。最终的结果相当让人满意,压缩率比之前提高了67.5% ,为公司每个月省下至少2W 多RMB的流量费用=。=
而且这次的研究也让我对图片的压缩有了一定的心得。
马上分享一下:
-
选择一个合适的图片处理扩展包。
- 常见的扩展如GD,imagick,Gmagick。
- 老古董的GD丢掉吧,效率很低,而且压缩的图片体积很大=。= imagick是个不错的选择,在PHP的图片处理扩展中表现的很显眼。不管是对jpg或png的静态图片,还是对gif的动态图片,压缩和缩小放大尺寸都非常给力。
- Gmagic没怎么试过,而GraphicsMagick据说也是相当的给力,但网上很多评论基本上都是对效率的一些评测。感觉压缩上面不太给力,详细的描述可参看老王的博客http://hi.baidu.com/thinkinginlamp/blog/item/4b61e9241f08820f4c088d95.html
- 程序的优化,看下三个小组的解决方案和最终最好的解决方案。
大家对加水印这块无异议,仅在压缩上面做了文章,我只贴这里的代码。
优化前:
/*** 缩小图片尺寸.** @param $image 待处理的二进制图片* @param $width 处理后图片尺寸的宽度(px)* @param $height 处理后图片尺寸的高度(px)* @param $crop 是否裁剪图片** @return 处理好的二进制图片*/function resize($image, $width, $height, $crop) {$imagick = new Imagick();$imagick->readImageBlob($image);$w = $imagick->getImageWidth();$h = $imagick->getImageHeight();if ($w > $width || $h > $height) {if ($crop) {$imagick->cropThumbnailImage($width, $height);} else {$imagick->resizeImage($width, $height, Imagick::FILTER_LANCZOS, 1, true);}}$processed_image = $imagick->getImageBlob();return $processed_image;}
第一小组:
function resize($image, $width, $height, $crop) {
$im = new Imagick();
$im->readImageBlob($image);
$input_width = $width;
$input_height = $height;
$src_width = $im->getImageWidth();
$src_height = $im->getImageHeight();
$width_rate = $src_width/$width;
$height_rate = $src_height/$height;
if($width_rate>1||$height_rate>1){
if($crop){
if($width_rate>$height_rate){
$width = $src_width/$height_rate;
}else{
$height = $src_height/$width_rate;
}
}else{
if($width_rate>$height_rate){
$height = $src_height/$width_rate;
}else{
$width = $src_width/$height_rate;
}
}
$im->resizeImage($width, $height, Imagick::FILTER_CATROM, 1, false);
if($crop){
if($width>$input_width){
$im->cropImage ( $input_width , $height , ($width-$input_width)/2 , 0 );
}elseif($height>$input_height){
$im->cropImage ( $width , $input_height , 0 , ($height-$input_height)/2 );
}
}
}
$im->setImageCompression(Imagick::COMPRESSION_JPEG);
$im->setImageCompressionQuality(75);
$im->stripImage();
$im->setImageFormat(‘JPEG’);
$blob = $im->getImageBlob();
$im->clear();
$im->destroy();
return $blob;
}
第二小组:
function resize($image,$width,$height,$crop) {
$imagick = new Imagick();
$imagick->readImageBlob($image);
$imagick->setImageCompression($compression_type);
$imagick->setImageCompressionQuality(80);
if($crop) {
$imagick->cropThumbnailImage($width, $height);
}else{
$imagick->resizeImage($width, $height, Imagick::FILTER_CATROM, 1, true);
}
$imagick->stripImage();
$processed_image = $imagick->getImageBlob();
return $processed_image;
}
第三小组:
function resize($image, $width, $height, $crop) {
$imagick = new Imagick();
$imagick->readImageBlob($image);
if ($crop) {
$imagick->cropThumbnailImage($width, $height);
} else {
$imagick->resizeImage($width, $height, Imagick::FILTER_LANCZOS, 1, true);
}
$imagick->setImageFormat(‘JPEG’);
$imagick->setImageCompression(Imagick::COMPRESSION_JPEG);
$a = $imagick->getImageCompressionQuality() * 0.75;
if ($a == 0) $a = 75;
$imagick->setImageCompressionQuality($a);
$geo = $imagick->getImageGeometry();
$imagick->ThumbnailImage($geo['width'], $geo['height']);
$imagick->stripImage();
$blob = $imagick->getImageBlob();
$imagick->clear();
$imagick->destroy();
return $blob;
}
最终解决方案:
function resize($image, $width, $height, $crop) {
$imagick = new Imagick();
$imagick->readImageBlob($image);
$w = $imagick->getImageWidth();
$h = $imagick->getImageHeight();
if ($w > $width || $h > $height) {
if ($crop) {
$imagick->cropThumbnailImage($width, $height);
} else {
$imagick->resizeImage($width, $height, Imagick::FILTER_CATROM, 1, true);
}
}
$imagick->setImageFormat(‘JPEG’);
$imagick->setImageCompression(Imagick::COMPRESSION_JPEG);
$a = $imagick->getImageCompressionQuality() * 0.75;
if ($a == 0) {
$a = 75;
}
$imagick->setImageCompressionQuality($a);
$imagick->stripImage();
$blob = $imagick->getImageBlob();
$imagick->clear();
$imagick->destroy();
return $blob;
}
看下成绩:
对300张生产环境下抽取的原始图片进行测试,结果如下:
-
示例代码
:
29,220,912 (28,536KB) -
1组
11,282,151 (11,018KB) 比示例代码节省: 61.39% -
2组
16,281,139 (15,900KB) 比示例代码节省 : 44.28% -
3组
10,531,926 (10,285KB) 比示例代码节省 : 63.96%
性能方面都符合要求。除了第3组比示例代码慢5%左右,其他两组都比示例代码更快(1组约快15%,2组约快6%)
2组提交太慢太快,有一处遗漏,其实可以简单提高压缩比到58%左右
之后,综合3组的代码,弄了个best版本,测试结果为,
-
best
9,626,986 (9,401KB) 比示例代码节省: 67.05%
总结 :
1、 压缩率尽可能的小,这个要和业务部门商量,找到一个平衡点。(请注意best方法设置品质方法使用获取到当前图片的压缩率然后再取75%,如果当前图片压 缩率为60%,如果使用$imagick->setImageCompressionQuality(80)方法将使图片压缩率提高至80%,这会 使图片变大!!!)
2、一定要移除图片的exif信息!!!! 这部分内容详情请查看 http://baike.baidu.com/view/22006.htm
3、压缩尺寸使用Imagick::FILTER_CATROM方法对速度有一定的提升,图片本身的品质没有大的变化。
4、$imagick->setImageFormat(‘JPEG’)也很给力。
5、简单算了一下,这几行代码每个月给我们公司省至少2W RMB的流量费用,如果我们的图片库越来越大,那将更加给力了。
发表评论
-
ConcurrentHashMap 的实现原理
2016-06-12 15:37 571概述 我们在之前的博文中了解到关于 HashMap 和 ... -
BloomFilter——大规模数据处理利器
2016-04-25 15:09 567参考:http://www.cnblogs.com/hea ... -
Base64笔记
2014-05-08 16:32 647原文:http://www.ruanyif ... -
运算符的优先级
2014-02-21 22:06 941很久没有去深究运算符的优先级了,今天写SQL解析思考了一下。 ... -
beansdb使用的压缩算法-Quicklz压缩算法
2014-02-09 20:17 0据这里http://blog.yufeng.i ... -
跳表SkipList的原理和实现
2014-02-07 17:29 988参考:跳表SkipList的原理和实现 -
一种高效无锁内存队列的实现
2014-02-06 10:59 1970原文:http://www.searchtb. ... -
拆分文件统计topN的问题
2014-01-20 18:48 992如果对一个只包含ip地址文件进行统计,需要求出频率最高的前 ... -
Integer的numberOfLeadingZeros方法解释
2014-01-13 20:42 1066int numberOfLeadingZeros(int i ... -
rank排名算法整理
2014-01-07 13:44 10991.Delicious.com 热门书签排行榜 按照&q ... -
利用switch判断各种case
2013-12-27 16:35 0String env = "daily" ... -
如何创建一个短链服务
2013-12-26 16:23 0参考: http://stackoverflow.com ... -
HAProxy的独门武器:ebtree
2013-12-07 18:57 970原文:http://tech.uc.cn/?p= ... -
统计单词出现频率
2013-10-07 20:58 890这里有一个大文本,文件请从 http://10.125.9 ... -
Reddit评论排名算法
2013-03-16 00:48 1537上一篇文章介绍了Reddit的排名算法,今天继续上一篇文章 ... -
大数据量,海量数据 处理方法总结
2013-01-13 23:46 1103大数据量的问题是很多面试笔试中经常出现的问题,比如bai ... -
STL系列
2013-01-13 23:42 906STL系列之一 deque双向队列 STL系 ... -
java Map排序(按key和按value)
2012-12-10 15:54 93251、按照key排序 对于java中Map的排序,有排序Map ... -
算法文档集合
2012-11-24 15:59 858Treelink算法介绍 一些基础算法介绍 ... -
各种进制基础知识
2012-11-06 14:37 96410进制是人类最熟悉的数字计算 2进制是机器最基本的单位 ...
相关推荐
Grearo图片压缩工具 功能介绍【必读】: 1 图片批量压缩(30以内,依个人机器以及被压缩图片大小而定); 2 图片限定宽度,等比例压缩; 3 图片限定高度,等比例压缩; 4 图片限定高度,宽度压缩;...
C#/Core下,最完美的图片压缩,支持各种图片格式,无损压缩,无损剪切,按尺寸/比例压缩、剪切图片,根据自己需要任意处理图片
图片压缩
GIF支持透明与动画,而JPG可以牺牲一部分画质按不同的比例压缩,就是图所占的空间越小,网页显示得越快,为了追求JPG在确保一定画质的前提下,进行最大比例的压缩,出现了不少专门压缩JPG与GIF的图片压缩软件,不过这类的...
图片压缩软件图片压缩软件图片压缩软件图片压缩软件图片压缩软件图片压缩软件图片压缩软件图片压缩软件图片压缩软件图片压缩软件图片压缩软件图片压缩软件图片压缩软件图片压缩软件图片压缩软件图片压缩软件图片压缩...
一款精美图片压缩网站源码.rar 源码介绍 一款很好看的图片压缩网站,原本的源码引用的国外js站点,我给下载放到本地调用了,访问速度更快。 一款很好看的图片压缩网站,原本的源码引用的国外js站点,我给下载放到...
本次实验的图片压缩算法即主要基于离散余弦变换与huffman编码来进行压缩。 通过上述流程框图不难看出,压缩算法主要由6个部分组成,以下将对这六个环节进行逐一说明。 ①将图片分割为小块。由于一般的图片信息处理...
图片压缩到最小.rar
图片压缩,阿里巴巴SimpleImage 相关jar文件。其中包含依赖jar: commons-io-2.4.jar;commons-lang.jar;commons-logging-1.1.1.jar jai_codec-1.1.3.jar;jai_core-1.1.3.jar; 包含jar:aliSimpleImage.jar。...
java图片压缩处理
本文实例为大家分享了微信小程序图片压缩的具体代码,供大家参考,具体内容如下 设计思路: 选择图片后调用微信压缩图片接口,压缩后接收压缩图片的临时地址,调用微信储存接口保存图片至本地。 参数: imagesrc:...
图片压缩工具图片压缩工具图片压缩工具图片压缩工具图片压缩工具图片压缩工具
png图片压缩器,方便你尽可能的缩小图片的大小。
实现图片压缩,可以节约内存,应用场合:ListView异步加载大量网络图片时,可以适当压缩显示,可以有效防止内存溢出,适合新手学习之用,gb编码
java图片压缩处理java图片压缩处理java图片压缩处理java图片压缩处理java图片压缩处理java图片压缩处理
图片压缩工具PNG图片压缩工具压缩率高不失真
图片压缩 修改路劲 图片压缩flex demo
完美支持各个主流浏览器,chrome,火狐, ios ,android 微信等的浏览器。解决某些手机拍照 图片旋转问题,解决图片压缩问题。欢迎使用
Grearo图片压缩工具(修改版) 增加功能: 1,图象压缩平滑处理,插补优化; 2,去除原版本图象压缩后出现马赛克; 3,解决大量图片压缩会出现“程序假死”现象; 功能介绍【必读】: 1 图片...
java图片压缩处理(可以压缩为任意大小