just do it

linux图片处理ImageMagick以及PHP的imagick扩展

ImageMagick介绍:

 

ImageMagick是一套功能强大、稳定而且开源的工具集和开发包,可以用来读、写和处理超过89种基本格式的图片文件,包括流行的TIFF、JPEG、GIF、 PNG、PDF以及PhotoCD等格式。利用ImageMagick,你可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小、旋转、锐化、减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存,对图片的操作,即可以通过命令行进行,也可以用C/C++、Perl、Java、PHP、Python或Ruby编程来完成。同时ImageMagick提供了一个高质量的2D工具包,部分支持SVG。ImageMagic的主要精力集中在性能,减少bug以及提供稳定的API和ABI上。
ImageMagick 是一个用来创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线, 多边形,椭圆,曲线,附加到图片伸展旋转。ImageMagick是免费软件:全部源码开放,可以自由使用,复制,修改,发布。支持大多数的操作系统。

ImageMagick的命令概览

[ convert | identify | mogrify | composite | montage | compare | display | animate | import | conjure ]

 

convert:转换图像格式和大小,模糊,裁剪,驱除污点,抖动,临近,图片上画图片,加入新图片,生成缩略图等。

identify:描述一个或较多图像文件的格式和特性。

mogrify:按规定尺寸***一个图像,模糊,裁剪,抖动等。Mogrify改写最初的图像文件然后写到一个不同的图像文件。

composite:根据一个图片或多个图片组合生成图片。

montage:创建一些分开的要素图像。在含有要素图像任意的装饰图片,如边框、结构、图片名称等。

compare:在算术上和视觉上评估不同的图片***其它的改造图片。

display:如果你拥有一个X server的系统,它可以按次序的显示图片

animate:利用X server显示动画图片

import:在X server或任何可见的窗口上输出图片文件。 你可以捕获单一窗口,整个的荧屏或任何荧屏的矩形部分。

conjure:解释执行 MSL (Magick Scripting Language) 写的脚本。

常见用例:

影响图片大小(占用空间)主要取决于图片的profile和quality。
  • quality:图片的品质,品质越高,占用的空间越大。适当降低品质能很大程度的减少图片的尺寸。一般来说,从品质100降到85,基本上肉眼很难区别其差别,但尺寸上减少很大。imagemagick通过通过-quality 来设置。
  • profile:记录图片一些描述信息。例如相机信息(光圈,相机型号)、photoshop元数据,颜色表等信息。它占用的空间可以从几KB到几百KB,甚至可能更大。ImageMagicK可以通过两种方式来去掉这些信息。+profile “*”  或 -strip

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

convert +profile “*” -strip src.jpg src-profile.jpg

降低图片的quality品质来压缩图片

convert -quality 85 src.jpg src-quality85.jpg

上面两个命令结合到一起使用:

find /tmp/images -iname “*.jpg” -exec convert -strip +profile “*” -quality 80 {} {} \;

 

经过这两个命令的处理,你的图片绝对可以缩小很多。PS:根据我的经验,把png图片转换为jps图片会减小很多,然后再用以上两个命令处理一下,那就完美了。

 

PNG也可以通过减少PNG图片color数量的办法达到压缩的目的。但是这种办法压缩出来的图像可以明显看出来失真,而且呈锯齿状。
对于真实世界的PNG图片(通常指照片),一般先转换成JPG,再通过上面的办法来压缩。

convert -format jpg input.png  input.jpg

 

对用户上传图片进行缩放

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

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

 

下面说一下安装php的imgick扩展,来处理图片:

安装:

1. 下载安装ImageMagick

    wget http://www.imagemagick.org/download/legacy/ImageMagick-6.6.8-10.tar.gz 
    tar -xzvf ImageMagick-6.6.8-10.tar.gz  
    ./configure –prefix=/usr/local/imagemagick  
    make  
    make install

2. 下载安装Imagick

注:安装该扩展不要求安装ImageMagick

从http://pecl.php.net/package/imagick找到imagick的最新的版本

    wget http://pecl.php.net/get/imagick-3.1.0RC1.tgz     
    tar -xzvf imagick-3.1.0RC1  
    phpize  
    ./configure –with-php-config=/usr/local/php/bin/php-config –with-imagick=/usr/local/imagemagick  
    make  
    make install

make install执行结果显示:

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
Installing header files:          /usr/local/php/include/php/

生成imagick.so到/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/,然后手动配置php.ini使其生效

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
/*
 * 图片压缩类  重新封装了Imagick
 * 
 * @version 2014-07-30
 * @author andy1219111@163.com
 */
class Imgick_tool{
 
	//Imagick对象实例
	public $obj = null;
 
	public function __construct()
	{
		//判断是否加载了该扩展
		if(!extension_loaded('Imagick'))
		{
			return false;
		}
		$this->obj = new Imagick();
	}
	/*
	 * png2jpg转换图片格式
	 * 
	 * @param string src_img 源图片路径
	 * @param string dest_img 要生成的图片的路径
	 * @return boolean 转换成共返回true  否则false
	 */
	public function png2jpg($src_img,$dest_img)
	{
		if(!is_object($this->obj))
		{
			return false;
		}
		try
		{
			$this->obj->readImage($src_img);
			if($this->obj->writeImage($dest_img))
			{
				$this->destory();
				return $dest_img;
			}
			return false;
		}
		catch (ImagickException $e)
		{
			return false;
		}
	}
 
	/*
	 * 去掉图片的profile信息
	 * 
	 * @param string src_img 源图片路径
	 * @return string src_img 图片名称 否则返回false
	 */
	public function strip_profile($src_img,$dest_img = '')
	{
		if(!is_object($this->obj))
		{
			return false;
		}
		try
		{
			$dest_img = empty($dest_img) ? $src_img : $dest_img;
			$this->obj->readImage($src_img);
			$this->obj->stripImage ();
			if($this->obj->writeImage ($dest_img))
			{
				$this->destory();
				return $src_img;
			}
			return false;
		}
		catch (ImagickException $e)
		{
			return false;
		}
	}
 
	/*
	 * 设置jpg图片质量
	 * 
	 * @param string src_img 源图片路径
	 * @param string dest_img 要生成的图片的路径
	 * @return boolean 转换成共返回true  否则false
	 */
	public function set_quality($src_img,$quality = 70,$dest_img = '')
	{
		if(!is_object($this->obj))
		{
			return false;
		}
		try
		{
			$dest_img = empty($dest_img) ? $src_img : $dest_img;
			$this->obj->readImage($src_img);
			$this->obj->setImageCompression(Imagick::COMPRESSION_JPEG);
			$this->obj->setImageCompressionQuality($quality);
			if($this->obj->writeImage($dest_img))
			{
				$this->destory();
				return $dest_img;
			}
			return false;
		}
		catch (ImagickException $e)
		{
			return false;
		}
	}
 
	/*
	 * 图片瘦身
	 * 
	 * @param string src_img 源图片路径
	 * @param int quality 设置图片压缩质量
	 * @param string dest_img 要生成的图片的路径
	 * @return boolean 转换成共返回true  否则false
	 */
	public function slimming($src_img,$quality = 60,$dest_img = '',)
	{
		if(!is_object($this->obj))
		{
			return false;
		}
		try
		{
			$dest_img = empty($dest_img) ? $src_img : $dest_img;
			$this->obj->readImage($src_img);
			$this->obj->setImageFormat('jpeg');
			$this->obj->setImageCompression(Imagick::COMPRESSION_JPEG);
			//将图片的质量降低到原来的60%
			$quality = $this->obj->getImageCompressionQuality() * $quality / 100;
			$this->obj->setImageCompressionQuality($quality);
			$this->obj->stripImage();
 
			if($this->obj->writeImage($dest_img))
			{
				$this->destory();
				return $dest_img;
			}
			return false;
		}
		catch (ImagickException $e)
		{
			return false;
		}
	}
 
	/*
	 * 生成缩略图
	 * 
	 * @param string src_img 源图片路径
	 * @param int quality 设置图片压缩质量
	 * @param string dest_img 要生成的图片的路径
	 * @return boolean 转换成共返回true  否则false
	 */
	public function thump($src_img,$width = 250,$height = '')
	{
		if(!is_object($this->obj))
		{
			return false;
		}
		try
		{
 
			$file_info = pathinfo($src_img);
			//生成缩略图名称
			$file_name = substr($file_info['basename'],0,strrpos($file_info['basename'],'.'));
			$dest_img = $file_info['dirname'] . '/' . $file_name . '_thump.' . $file_info['extension'];
			$this->obj->readImage($src_img);
			//计算要获得缩略图的高度
			$img_width = $this->obj->>getImageWidth();
			$img_height = $this->obj->>getImageHeight();
			$dest_height = $img_height * ($width / $img_width);
			$this->obj->resizeImage($width, $dest_height, Imagick::FILTER_CATROM, 1, false);
			//生成图片
			if($this->obj->writeImage($dest_img))
			{
				$this->destory();
				return $dest_img;
			}
			return false;
		}
		catch (ImagickException $e)
		{
			return false;
		}
	}
 
	/*
	 * 释放资源
	 * 
	 */
	function destory()
	{
		if(is_object($this->obj))
		{
			$this->obj->clear();
 
			$this->obj->destroy();
		}
	}
 
}
点赞