`
zhangchibang
  • 浏览: 344979 次
社区版块
存档分类
最新评论

图片压缩的一些心得

    博客分类:
  • PHP
阅读更多

http://blog.lizhigang.net/archives/228

 

这次乐高的题目是如何提高图片的压缩率。帮助公司省流量的费用。

整个过程持续一周。最终的结果相当让人满意,压缩率比之前提高了67.5%,为公司每个月省下至少2W多RMB的流量费用=。=

而且这次的研究也让我对图片的压缩有了一定的心得。

马上分享一下:

  1. 选择一个合适的图片处理扩展包。
    • 常见的扩展如GD,imagick,Gmagick。
    • 老古董的GD丢掉吧,效率很低,而且压缩的图片体积很大=。=   imagick是个不错的选择,在PHP的图片处理扩展中表现的很显眼。不管是对jpg或png的静态图片,还是对gif的动态图片,压缩和缩小放大尺寸都非常给力。
    • Gmagic没怎么试过,而GraphicsMagick据说也是相当的给力,但网上很多评论基本上都是对效率的一些评测。感觉压缩上面不太给力,详细的描述可参看老王的博客http://hi.baidu.com/thinkinginlamp/blog/item/4b61e9241f08820f4c088d95.html
  2. 程序的优化,看下三个小组的解决方案和最终最好的解决方案。

大家对加水印这块无异议,仅在压缩上面做了文章,我只贴这里的代码。

优化前:

/**
* 缩小图片尺寸.
*
* @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的流量费用,如果我们的图片库越来越大,那将更加给力了。

分享到:
评论

相关推荐

    奇异值分解实现图片压缩代码【三个代码+一个实验报告】

    实验报告介绍了奇异值分解在彩色图片压缩中的应用研究。详细解释了奇异值分解的原理,通过分解任意矩阵为三个部分的乘积来实现数据压缩。其次,提供了奇异值分解的代码实现过程,展示了对彩色图片进行压缩的结果。...

    html5 canvas移动浏览器上实现图片压缩上传

    而每次都上传原始大小的图片(后台处理压缩)十分影响用户体验,所以研究了一下通过canvas压缩图片并上传的方法,以下是整理的一些思路和心得: 一、<input type="file">获取本地图片,并将图片绘制到画布中。...

    学习 WINFORM 以及 WPF 的心得

    通过这篇文章,我们可以了解到作者在学习 WINFORM 和 WPF 的过程中所获得的一些经验和心得。文章分为多个部分,分别介绍了 WINFORM 实用工具、WPF 嵌入 FLASH、INKCANVAS 技术等。 WINFORM 实用工具 首先,作者...

    web笔记心得

    12. 性能优化:包括减少HTTP请求、压缩资源、利用缓存、优化图片大小等,以提升网页加载速度和用户体验。 13. 调试工具:开发者工具是每个前端工程师的必备武器,如Chrome DevTools,用于调试JavaScript、分析网络...

    答辩用ppt制作心得

    * 图片压缩与编辑:压缩图片为 jpeg 等格式,使用acdsee 等工具 * 统计图表的制作:使用 PowerPoint 或 Excel 等软件 * 插入多媒体与动画:插入 avi 等多媒体和 swf 动画 * 其他文字与动画技巧:制作不断闪烁的文字...

    jQuery框架心得

    【jQuery框架心得】 jQuery是由John Resig创建的一个高效、简洁的JavaScript库,它极大地简化了JavaScript的DOM操作、事件处理、动画制作以及AJAX交互。jQuery的理念是“WRITE LESS, DO MORE”,即通过少量的代码...

    网站的制作毕业论文心得与体会参考.doc

    此外,网站的性能优化同样关键,包括图片压缩、代码压缩、缓存策略等,都是提升网站加载速度的有效手段。 在开发过程中,遇到了许多问题,例如浏览器兼容性、安全漏洞和性能瓶颈等。通过查阅资料、参与论坛讨论,...

    网页设计的心得体会.docx

    网站的优化同样重要,包括代码优化、图片压缩和SEO策略。优化不仅能提高网页加载速度,还能提高搜索引擎的可见度,从而吸引更多的访问者。 个人网站的建立通常包括前端和后端两部分。前端设计涉及网页的视觉呈现,...

    2021网页制作的心得体会.docx

    以下是我从提供的文件内容中提炼出的一些关键知识点: 1. **标题的重要性**:标题不仅是网页的“脸面”,更是网页内容的浓缩体现。一个吸引人的、具有概括性的标题能第一时间引起浏览者的兴趣,它需要简洁、有特色...

    游戏资源解包心得和思想

    在深入探讨游戏资源解包的心得与思想之前,我们首先需要理解什么是“游戏资源解包”。游戏资源解包,简而言之,就是将游戏中的各种资源(如图像、音频、视频等)从游戏的安装包或运行时加载的资源文件中提取出来的...

    web学习总结(2)

    - 页面加载速度优化:如延迟加载、图片压缩、减少HTTP请求、利用缓存等策略。 - 性能监控:使用Lighthouse、PageSpeed Insights等工具评估和改进网站性能。 6. **前端开发**: - 响应式设计:确保网页在不同设备...

    微信小程序wxapkg解包心得

    这种文件实际上是经过加密和压缩的,包含JavaScript代码、WXML(微信小程序的标记语言)、WXSS(微信小程序的样式表)以及图片和其他资源。解包过程通常包括解密和解析两个步骤。 解密`.wxapkg`文件通常需要用到...

    ASP.NET学习过程中总结的一些技巧

    可以通过减少数据库查询、缓存频繁访问的数据、压缩响应、使用GZIP等方式提升性能。同时,使用ASP.NET的输出缓存,可以显著减少服务器的负载。 10. **持续集成与自动化测试** 通过引入持续集成工具如Jenkins或...

    基于Bootstrap的汽车车展展示html网站模板

    图片优化:采用图片压缩技术,确保网站加载速度快,同时保持图片的高质量。 页面模块介绍: 首页:展示车展的亮点、参展车型、时间地点等信息,通过轮播图展示最新车型。 车型展示:按品牌、类型或价格分类展示汽车...

    垃圾分类后的心得体会5篇.docx

    在信息技术中,数据可能被分类为结构化数据(如数据库中的记录)和非结构化数据(如文本、图片或音频文件)。这种分类有助于提高检索效率,确保信息安全,并便于数据分析。 其次,数据的循环利用类似于可回收垃圾的...

    页面细节处理心得

    一个页面的细节,从重构的角度去看,页面的精细度,代码的可读性、扩展性,为下游服务的代码注释,交互接口样式的书写,代码的压缩,图片的优化等都可以归为细节处理。一个页面的细节,从重构的角度去看,页面的精细...

    ScrollView.zip

    因此,建议对大图片进行压缩,或者使用LazyLoading策略只加载可视区域内的内容。 2. 检查触摸事件冲突:有时,ScrollView内的其他组件可能需要处理触摸事件,这时可能需要重写onInterceptTouchEvent()和onTouchEvent...

Global site tag (gtag.js) - Google Analytics