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 ...
随机推荐
- php 技术知识点汇总
consul : 服务发现 做服务发现的框架常用的有 zookeeper eureka etcd consul zookeeper, php中的libzookeeper PHP使用 swagger ...
- DiSC小记
最近在单位进行管理培训时进行了一个DiSC的心理测试,DiSC是Dominance,influence,Steadiness和Conscientiousness四个英文单词的首字母缩写.这四个单词对应 ...
- Displaying Modal Window Messages in Oracle Forms Using Show_Alert
You can display modal windows in Oracle Forms to display normal messages, error message or asking fo ...
- hadoop datanode节点超时时间设置
datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长. HDFS默认的超时时长为10分 ...
- 微信小程序 - 关闭当前页面无法再通过左上角返回
考试的时候不可能答完以后,得到成绩后再通过左上角返回再重新答吧? 可以通过:open-type='redirectTo'实现
- jmeter 压测工具
Apache jmeter 压力测试 java 环境安装 https://www.cnblogs.com/smyhvae/p/3788534.html 下载地址和文档 http://itopic.or ...
- 【Python】切片
处理Python的部分元素,称之为切片. 创建切片 指定要是用的第一个元素和最后一个元素的索引,与range()函数一样,Python在到达你指定的第二个索引前面的元素后停止. 先定义一个列表vege ...
- 云数据库 RDS 版怎么创建数据库和账号MySQL 5.7版
若要使用云数据库RDS,您需要在实例中创建数据库和账号.对于MySQL 5.7版本的实例,您需要通过RDS控制台创建一个初始账号,然后可以通过数据管理(DMS)控制台创建和管理数据库.本文将主要介绍在 ...
- Java 使用StringBuffer注意
Stringbuffer使用注意 问题背景: 模拟客户端使用Socket请求服务器核心系统,核心系统正常响应,内容较大,近2715KB,大于2.6M多. 使用指定编码GBK来接收响应内容到过程中没 ...
- wampserver 安装多个php版本号报错之关键问题
近期喜欢上用wampserver来搭建php本地执行环境 主要是一键安装 特easy 之前一直用的是 appserv 也挺好用的 用了wamp后 才发现wamp更好用 duang duang 默认下载 ...