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

为了提高页面的加载速度,以及减少流量,要针对网站的图片进行瘦身,研究了很多的解决方案,最后确定了使用ImageMagick,了解了这个软件之后,真是如获至宝,简直太好用,效果太明显了。

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) 写的脚本。

安装:

sudo apt-get install imagemagick

常见用例:

影响图片大小(占用空间)主要取决于图片的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限制大小,因为这样每次加载图片时候还是会加载整幅大图。占用多余的宽带,并且影响页面加载速度。应该根据实际显示需要进行缩放。比如我想要用户相册里的图片大小不能超过500x300:

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

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

安装:

1.安装imgick扩展

1) sudo apt-get install libmagick-dev

2) sudo apt-get install php-pear php5-dev

3) sudo pecl install imagick

2.编辑php.ini文件,使其加载

打开php.ini文件,在其中加入extension=imagick.so

/etc/php5/apache2/php.ini

重启apache服务使其失效

/etc/init.d/apache2 restart

附上一个简单的例子,用来转换图片格式的:

$thumb = new Imagick();
$thumb->readImage('test.gif');
$thumb->writeImage('test.jpg');
$thumb->clear();
$thumb->destroy();

用法太多了,我就不一一列举了,提供一下资料供大家学习:

Imgick Class API:http://php.net/manual/en/class.imagick.php

图片压缩心得:http://blog.lizhigang.net/archives/228

ImageMagick官网:http://www.imagemagick.org/script/index.php

http://elf8848.iteye.com/blog/382528

使用实例:http://hi.baidu.com/7soon/item/d394c2b55bd3bb70254b09ed

最后,附上我自己编写的PHP用Imgick处理图片的类:

/*
 * 图片压缩类  重新封装了Imagick
 *
 * @version 2014-07-30
 * @author [email protected]
 */
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();
		}
	}

}

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

时间: 2024-11-07 22:48:04

图片处理神器ImageMagick以及PHP的imagick扩展的相关文章

通过php安装Imagick扩展给动态gif图片打水印

通过php安装Imagick扩展给动态gif图片打水印 一直以来php处理图片都是以gd为主流,直到近些年Imagick的使用才渐渐变多.gd通常用来缩放图片,给图片打水印等基本功能,对于复杂效果如制作图标按钮.图倒影等滤镜功能就会力不从心.尤其对于有多帧图片的动态gif图打水印,如果使用gd像处理普通jpg那样去打水印,打完水印后的图片只剩下第一帧,没有动态效果.Imagick就能很好的胜任这一点,使得php给动态gif图片打水印成为可能,而且它还具有内存占用小,画质高的特点.下面是分别使用g

PHP图片压缩(TinyPNG在线API)和(使用Imagick扩展)

1.调用TinyPng网站提供的API 1.1.须知 (1)tinypng的官网:https://tinypng.com/ 不知道国内访问会不会很慢,在Singapore打开这个网站很流畅: (2)API key申请地址:https://tinypng.com/developers 调用这个网站提供的API需要申请一个API key,输入邮箱,它会把包含API key的网址发到你邮箱,打开其中的链接就可以看到属于你的API key了: (3)调用这个网站的API进行图片压缩的话,每个月前500张

Window10安装Imagick扩展及配置

1.安装ImageMagick 下载地址:http://www.imagemagick.org/download/binaries/,可下载最新版本,如 ,.exe格式安装软件. 默认会安装Path路径,若没有,可自行配置. 然后,CMD命令窗口 -> 输入 convert -version -> 若出现版本信息则安装成功. 2.安装PHP扩展 PHP扩展Imagick下载:http://pecl.php.net/package/imagick,推荐下载3.4.3稳定版本, 注:3.4仅支持6

Window安装Imagick扩展及配置

Window安装Imagick扩展及配置 1.安装ImageMagick 下载地址:http://www.imagemagick.org/download/binaries/,可下载最新版本,如 ,.exe格式安装软件. 默认会安装Path路径,若没有,可自行配置. 然后,CMD命令窗口 -> 输入 convert -version -> 若出现版本信息则安装成功. 2.安装PHP扩展 PHP扩展Imagick下载:http://pecl.php.net/package/imagick,推荐下

linux centos8.1下PHP安装 Imagick扩展

php版本7.3.1 ImageMagick版本:ImageMagick-7.0.10-3 PHP版本imagick版本:imagick-3.4.3RC3 imageMagick安装 下载安装包 wget http://www.imagemagick.org/download/ImageMagick.tar.gz 解压 tar xvfz ImageMagick.tar.gz 进入文件 cd ImageMagick-6.8.6-7/ 设置安装路径 ./configure --prefix=/usr

php imagick 扩展合成图片的两张方法

方法一:compositeimages /** * function: 合成图片 * @param string $output_url 图片保存路径 * @param string $img_type 图片保存类型 * @param integral $line_num 每行显示图片数量 * @param array $logo_info 每张待合成图片的信息(要求所有尺寸统一) * @param array $img_list 待合成的图片绝对路径 * * @return void */ p

图片处理GraphicsMagick & ImageMagick

用Java的ImageIO处理一个大于15M的JPG文件,内存溢出. 于是寻求新的解决方案,用ImageMagicK,发现处理图片速度不令人满意,于是切换至GraphicsMagicK,如下是总结. “GraphicsMagick is a fork of ImageMagick. GraphicsMagick has a number of advantages compared to ImageMagick, the most prominent is it's superior perfo

图片处理工具ImageMagick

ImageMagick是一个免费的创建.编辑.合成图片的软件.它可以读取.转换.写入多种格式的图片.图片切割.颜色替换.各种效果的应用,图片的旋转.组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转 官网描述 http://www.imagemagick.org/script/index.php ImageMagick® is a software suite to create, edit, compose, or convert bitmap images. It can read a

linux 安装 ImageMagick 和 imagick 扩展

使用命令安装 依次运行以下命令 yum install ImageMagick yum install ImageMagick-devel yum install php-pear 安装php-pear是为了使用pecl 中的 phpize yum -y install php-devel 2. 安装C编译器 yum install gcc 如果装不了gcc就用这个命令: yum install gcc gcc-c++ autoconf automake 3. 安装imagick pecl in