imagick图片压缩。
- 选择一个合适的图片处理扩展包。
- 常见的扩展如GD,imagick,Gmagick。
- 老古董的GD丢掉吧,效率很低,而且压缩的图片体积很大=。= imagick是个不错的选择,在PHP的图片处理扩展中表现的很显眼。不管是对jpg或png的静态图片,还是对gif的动态图片,压缩和缩小放大尺寸都非常给力。
- Gmagic没怎么试过,而GraphicsMagick据说也是相当的给力,但网上很多评论基本上都是对效率的一些评测。
- 程序的优化,看下三个小组的解决方案和最终最好的解决方案。
大家对加水印这块无异议,仅在压缩上面做了文章,我只贴这里的代码。
优化前:
/*** 缩小图片尺寸.** @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的流量费用,如果我们的图片库越来越大,那将更加给力了。
imagick图片压缩。的更多相关文章
- ZH奶酪:PHP图片压缩(TinyPNG在线API)和(使用Imagick扩展)
1.调用TinyPng网站提供的API 1.1.须知 (1)tinypng的官网:https://tinypng.com/ 不知道国内访问会不会很慢,在Singapore打开这个网站很流畅: (2)A ...
- Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩
目录: 前序 效果图 简介 全部代码 前序: 接触 golang 不久,一直是边学边做,边总结,深深感到这门语言的魅力,等下要跟大家分享是最近项目 服务端 用到的图片压缩程序,我单独分离了出来,做成了 ...
- 三款不错的图片压缩上传插件(webuploader+localResizeIMG4+LUploader)
涉及到网页图片的交互,少不了图片的压缩上传,相关的插件有很多,相信大家都有用过,这里我就推荐三款,至于好处就仁者见仁喽: 1.名气最高的WebUploader,由Baidu FEX 团队开发,以H5为 ...
- 前端构建工具之gulp(一)「图片压缩」
前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...
- gulp图片压缩
gulp图片压缩 网页性能优化,通常要处理图片,尤其图片量大的时候,更需要工具来批量处理,这里使用gulp,做个简单总结 image-resize压缩尺寸 var gulp = require('gu ...
- Android 图片压缩、照片选择、裁剪,上传、一整套图片解决方案
1.Android一整套图片解决方案 http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650820998&idx=1& ...
- Java中图片压缩处理
原文http://cuisuqiang.iteye.com/blog/2045855 整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享. 首先,要压缩的图片格式不能说动态图片,你 ...
- android 图片压缩
引用:http://104zz.iteye.com/blog/1694762 第一:我们先看下质量压缩方法: private Bitmap compressImage(Bitmap image) { ...
- HTML5 CANVAS 实现图片压缩和裁切
原文地址:http://leonshi.com/2015/10/31/html5-canvas-image-compress-crop/?utm_source=tuicool&utm_medi ...
随机推荐
- 为Zepto添加Slide动画效果
一.缘由 公司的移动端项目,采用zepto为主要框架,但是zepto毕竟是精简版的jquery,体积小了,功能自然没有这么强大,特别是动画和选择器这两块,需要我们自己去拓展. 在项目开发过程中,很多页 ...
- 快速销售订单 - OM:销售订单表单:级联行题头更改
PROFILE OM:销售订单表单:级联行题头更改
- PHP页面跳转几种实现方法
转载自冠威博客 [ http://www.guanwei.org/ ]本文链接地址:http://www.guanwei.org/post/PHPnotes/04/php-redirect-metho ...
- 2017.2.21 activiti实战--第十三章--流量数据查询与跟踪(一)查询接口介绍及运行时数据查询
学习资料:<Activiti实战> 第十三章 流量数据查询与跟踪 本章讲解运行时与历史数据的查询方法.主要包含三种:标准查询,Native查询,CustomSql查询. 13.1 Quer ...
- IDEA破解 2017 IDEA license server 激活(可用)
进入ide主页面,help-register-license server,然后输入 http://idea.iteblog.com/key.PHP(注意:php要小写)即可~
- 《学习bash》笔记--调试shell程序
在shell中,最简单的调试助手时输出语句echo,能够通过把很多echo语句放到代码中进行调试,但必须花费足够的时间以定位 要查看的信息.可能必须通过很多的输出才干发现要查找的信息. 1.set选项 ...
- 135 - ZOJ Monthly, August 2014
135 - ZOJ Monthly, August 2014 A:构造问题,推断序列奇偶性.非常easy发现最小值不是1就是0.最大值不是n就是n - 1,注意细节去构造就可以 E:dp.dp[i][ ...
- vue2.0 仿手机新闻站(一)项目开发流程
vue仿手机新闻站: 1.拿到静态页面,直接用vue边布局,边写 2.假数据 没有用任何UI组件,切图完成 做项目基本流程: 1.规划组件结构 Nav.vue Header.vue Home.vue ...
- html5,audio音乐播放器
最终,做了自己原来一直想要实现的事儿.得出的结果是,有些事儿一旦開始做了,那么它就并非非常难. 如今的我,正听着自己的播放器放出的<光辉岁月>写这篇周六清晨的博文.写的不是非常好.但也请各 ...
- GroupBox与Panel控件
1.GroupBox控件常常用于逻辑地组合一组控件,如RadioButton 及 CheckBox控件,显示一个框架,其上有一个标题. 2.Panel 可以包含多个控件,以便将这些控件编为一组,以便方 ...