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 ...
随机推荐
- MySQL备份工具收集
说明:MySQL的备份不像SQL Server那么的简单,备份时需要分数据库引擎类型,现在主流的就两个:InnoDB和MyISAM,而这两种类型备份方式各不一样. MyISAM: mysqlhotco ...
- Jenkins连接TFS出现错误:“jenkins com.microsoft.tfs.core.exceptions.TECoreException”的问题收集
没成功解决过,下面提供一些收集的链接地址,因为这个问题真的很少. https://social.msdn.microsoft.com/Forums/vstudio/en-US/1a75a0b2-459 ...
- #译# Core Data概述 (转)
昨晚熬夜看发布会(本以为屌丝终于能买得起苹果了,谁知道...),因为看不了视频直播,所以就正好有空就把www.objc.io最新的一篇文章翻译了一下,同时感谢CocoaChina翻译组提供校对,以下为 ...
- doviceone- http组件进行webservice的POST请求
var http = mm("do_Http"); http.method = "POST"; // GET | POST http.timeout = 100 ...
- SecureCRT设置超级终端
SecureCRT可以代替Windows中的超级终端,用来连接网络设备的Console口新建连接Serial串口,配置为:Bits per second: 9600Data bits: 8Parity ...
- 一个项目多个App项目搭建
在testDjango项目中找到testDjango文件夹,打开urls.py路由配置文件并添加以下配置 from django.conf.urls import url,includefrom dj ...
- 从零开始搭建GitHub个人博客--第一步
最近一段时间工作不是很忙,便开始着手整理博客并梳理自己的简历 可是,打开cnblog后第一眼我便开始了纠结~ 原起: 一直在cnblog写博客,看博客,突然发现这种在线纯文档记录的方式俨然跟不上时代的 ...
- tomcat启动项目,起不起来
右键tomcat 选择publish
- Solidworks拖动装配体的时候物资动力有什么用
Solidworks物资动力就是模拟真实的场景,你在拖动或旋转零件的时候会和周围的零件碰撞,有相互力的作用. 1 标准拖动 2 碰撞检查 3 选择物资动力(零件上面的黑白相间小圆表示物体重心) ...
- maven springmvc-hibernate搭建以及源码下载
见:https://blog.csdn.net/fengshizty/article/details/43635305 下载源码参见:http://www.cnblogs.com/ljy2013/p/ ...