PHP:ImageMagick完美代替GB类库处理图像-阿里云开发者社区

开发者社区> y0umer> 正文

PHP:ImageMagick完美代替GB类库处理图像

简介: 在使用php开发之中大家都习惯使用gb类库来处理图像信息,但是函数很多的gb类库也是很头疼,使用起来要一个个的查询函数和看官方手册,下面将介绍一个很强大的图像处理工具----ImageMagick,这个在liunx下面处理图像信息将会更简洁。
+关注继续查看

在使用php开发之中大家都习惯使用gb类库来处理图像信息,但是函数很多的gb类库也是很头疼,使用起来要一个个的查询函数和看官方手册,下面将介绍一个很强大的图像处理工具----ImageMagick,这个在liunx下面处理图像信息将会更简洁。

先看一下百度百科的介绍:
ImageMagick是一套功能强大、稳定而且免费的工具集和开发包,可以用来读、写和处理超过89种基本格式的图片文件,包括流行的TIFF、JPEG、GIF、 PNG、PDF以及PhotoCD等格式。利用ImageMagick,你可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存。对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成。同时ImageMagick提供了一个高质量的2D工具包,部分支持SVG。现在,ImageMagic的主要精力集中在性能、减少bug以及提供稳定的API和ABI上。

功能
1. 将图片从一个格式转换到另一个格式,包括直接转换成图标。
2. 改变尺寸、旋转、锐化(sharpen)、减色、图片特效 
3. 缩略图片的合成图( a montage of image thumbnails) 
4. 适于web的背景透明的图片  
5. 将一组图片作成gif动画,直接convert

将几张图片作成一张组合图片,montage 
 
在一个图片上写字或画图形,带文字阴影和边框渲染。  
8. 给图片加边框或框架  
9. 取得一些图片的特性信息  
10,几乎包括了gimp可以作到的常规插件功能。甚至包括各种曲线参数的渲染功能。只是那命令的写法,够复杂。  ImageMagick几乎可以在任何非专有的操作系统上编译,无论是32位还是64位的CPU,包括LINUX,Windows '95/'98/ME/NT 4.0/2000/XP, Macintosh (MacOS 9 /10), VMS 和 OS/2.

安装:
ImageMagick提供多个版本 liunx, mac, win 都可以使用
具体的安装和下载可以查考官网:http://www.imagemagick.org/script/index.php

下面是对其比较常用的功能介绍

1.对用户上传图片进行缩放 对于用户自己上传的图片不能简单的 用css限制大小,因为这样每次加载图片时候还是会加载整幅大图。占用多余的宽带,并且影响页面加载速度。应该根据实际显示需要进行缩放。比如我想要用户相册里的图片大小不能超过500x300: 用ImageMagick处理起来很简单 Im代码

convert -resize "500x300>" input.jpg output.jpg #如果图片比500x300小就保持原样,以防小图片被放大失真。


2.生成不同比例缩略图 一般相册等应用,都会提供缩略图和预览图,这些缩略图同样不能简单的用css来限制大小,要为每个图片生成不同比例的预览图。

 3.去除多余信息 Exif信息是数码相机在拍摄过程中采集的一系列信息,这些信息放置在我们熟知的jpg文件的头部,也就是说Exif信息是镶嵌在JPEG图像文件格式内的一组拍摄参数,主要包括摄影时的光圈、快门、ISO、日期时间等各种与当时摄影条件相关的讯息,相机品牌型号,色彩编码,拍摄时录制的声音以及全球定位系统(GPS)等信息。简单的说,它就好像是傻瓜相机的日期打印功能一样,只不过Exif信息所记录的资讯更为详尽和完备。不过,具有Exif信息的JPEG图像文件要比普通的JPEG文件略大一点。还有就是像PS这种软件处理过的图片会有“program comments”。如果不是专业的摄影类网站,这些信息是没有用的,可以去掉:
Im代码

convert -strip input.jpg output.jpg 

4.调节压缩比 大多时候,我们的网站并不需要那么清晰的图片,适量调节JPG图片的压缩比会减少图片大小,肉眼并不会分辨出质量被压缩后的图片。通常75%是最佳比例。
Im代码
convert -quality 75% input.jpg output.jpg 

上面几个步骤可以一次搞定:
Im代码
convert -resize "500x300" -strip -quality 75% input.jpg output.jpg 

上面说的都是针对JPG格式的处理方式,下面说一下BMP,GIF,PNG等格式的处理。 对于BMP直接转成JPG就可以了。再按照上面的方式处理。 而GIF和PNG貌似有些特殊。GIF的一些特性(动画效果,透明等)是JPG没有的,可以根据实际情况选择转或不转,如果转换成jpg,取第一帧只需要这样:
Im代码
convert -format jpg input.gif input.jpg 

PNG也可以通过减少PNG图片color数量的办法达到压缩的目的。但是这种办法压缩出来的图像可以明显看出来失真,而且呈锯齿状。 对于真实世界的PNG图片(通常指照片),一般先转换成JPG,再通过上面的办法来压缩。 但是要注意一点,透明或半透明的PNG图片在转换成JPG时透明部分会变成黑色。。。建议做用户头像时候不要转成JPG。。很难看~~~ 本人头像就是深受毒害。。 关于图片扩展名 发现大部分网站喜欢把用户上传的图片(头像,相册等)都统一转成特定格式(一般都是jpg)。这样做的潜在弊端就是在用像ImageMagick这样的软件处理的时候会根据扩展名做隐式格式转换。 个人觉得在保存图片的时候不加扩展名处理起来更灵活一些。

 注:把上面的命令行用mini_magick改写用到rails里很容易的。mini_magick本质就调用系统命令行嘛~~

具体实例:下面是一个图片上传类:
实现对图片大小的统一缩放

/**
* @filesource upload.func.php
* 上传图片, 需要 ImageMagick
*/
/**
* 上传文件
*$size:大小(格式100x100,中间是小写x)
* 返回值:
* 0 文件类型错误
*/
function upFile($size, $subdir){
set_time_limit(0);
$fileType = array("jpg","gif","bmp","jpeg","png");

$upPath = dirname(dirname(dirname(__FILE__)))
.DIRECTORY_SEPARATOR.'rooms'.DIRECTORY_SEPARATOR.'Img'
.DIRECTORY_SEPARATOR.$subdir.DIRECTORY_SEPARATOR;
// if(file_exists($upPath)) unlink($upPath);mkdir($upPath);
if( !is_dir($upPath))	mkdir($upPath);
$a = strtolower( pathinfo($_FILES['uploadfile']['name'], PATHINFO_EXTENSION) );
//判断文件类型
if(!in_array( $a, $fileType )) {
//$text=implode(",",$fileType);
return 2; //echo "您只能上传以下类型文件: ",$text,"<br>";
} else{ //生成目标文件的文件名 
$filename=explode(".", $_FILES['uploadfile']['name']);

do{ 
$filename[0]=$size; //图片名称按尺寸命名
$name=implode(".", $filename);
$uploadfile= $upPath.$name;


}while( file_exists($uploadfile) );

try {
if ( copy($_FILES['uploadfile']['tmp_name'], $uploadfile) ){

///usr/bin/convert
exec("/usr/local/imagemagick/bin/convert -resize '{$size}>!' {$uploadfile} {$uploadfile}");
return "/kkyoo/rooms/icoImg/{$subdir}/".$name;
}
}catch (Exception $e){
echo $e->getMessage();
}
}
return 0;
}//END func upFile


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
[git] warning: LF will be replaced by CRLF | fatal: CRLF would be replaced by LF[ git 处理和修改行结束符(CRLF和LF)]
  我自己的设置是: [core] autocrlf = false[core] safecrlf = true 取消自动转换CRLF(上图中选的是commit as is),但是有提交前混用检查 本人用的是WINDOWS下的PHPSTORM开发的PHP       遇到这两个错误,是因为Git的换行符检查功能。
1106 0
处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
server2008  iis7,出错上面的错误 . 提示的原因可能是net未完整安装导致的. 解决方法:  1、开始->运行cmd命令窗->以管理员身份运行: %windir%\Microsoft.
903 0
Apache Flink 零基础入门(五):流处理核心组件 Time&Window 深度解析
为什么要有 Window; Window 中的三个核心组件:WindowAssigner、Trigger 和 Evictor;Window 中怎么处理乱序数据,乱序数据是否允许延迟,以及怎么处理迟到的数据;最后我们梳理了整个 Window 的数据流程,以及 Window 中怎么保证 Exactly .
867 0
Apache Flink 零基础入门(五):流处理核心组件 Time&Window 深度解析
为什么要有 Window; Window 中的三个核心组件:WindowAssigner、Trigger 和 Evictor;Window 中怎么处理乱序数据,乱序数据是否允许延迟,以及怎么处理迟到的数据;最后我们梳理了整个 Window 的数据流程,以及 Window 中怎么保证 Exactly
3315 0
ArcGIS API for Silverlight 鼠标移入移出地图要素弹出窗口(优化处理)
     在之前博客里的ArcGIS API for Silverlight 弹出框实例中,是通过点击地图要素,弹出框,但是由于没有控制元素个数,只是通过显示隐藏来进行的话,在鼠标移入和移出操作中,会出现鼠标移入的时候,总不能立刻弹出框,而是需要多次才行,用户体验较差,现在通过控制加入一个弹出框,移出时去除刚加入的弹出框,严格控制弹出框个数来实现。
791 0
PHP:ImageMagick完美代替GB类库处理图像
在使用php开发之中大家都习惯使用gb类库来处理图像信息,但是函数很多的gb类库也是很头疼,使用起来要一个个的查询函数和看官方手册,下面将介绍一个很强大的图像处理工具----ImageMagick,这个在liunx下面处理图像信息将会更简洁。
1345 0
+关注
y0umer
高级网络安全技术员
906
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载