php安装imagick扩展

imagick相对于GD库有更好的图像处理函数支持,滤镜、模糊、旋转的处理效率比GD高很多,对于GIF的处理也更得心应手,imagick还支持3D图像效果。

imagick相对于GD库有更好的图像处理函数支持,滤镜、模糊、旋转的处理效率比GD高很多,对于GIF的处理也更得心应手,imagick还支持3D图像效果。

环境要求

  1. php > 5.4.0 & ImageMagick >= 6.5.3-10
  2. 必须先安装ImageMagick,因为php的Imagick扩展支持的图像格式取决于本地ImageMagick所支持的格式。这个扩展的本质也是调用本地ImageMagick处理图像。

安装ImageMagick

// 1. 下载ImageMagick
wget http://www.imagemagick.org/download/ImageMagick.tar.gz

// 2. 解压
tar xvzf ImageMagick.tar.gz

// 3. 配置和编译
cd ImageMagick-7.0.3-2
./configure
make

// 4. 安装
make install

// 5. 配置动态链接库
ldconfig /usr/local/lib

// 6. 测试是否安装成功,如果安装目录有logo.gif图片并显示正常则说明安装成功
convert logo: logo.gif
// convert a.png -resize 50% b.png

安装php的imagick扩展

// 1. 下载最新版本
wget http://pecl.php.net/get/imagick-3.4.3RC1.tgz

// 2. 使用pear安装扩展
pear install imagick-3.4.3RC1.tgz

// 3. 在php.ini中添加extension=imagick.so

// 4. 重启php-fpm后查看phpinfo中已经有了imagick扩展

安装过程中报错:
ERROR: '/tmp/pear/temp/imagick/configure --with-php-config=/usr/bin/php-config --with-imagick' failed

原因是没有安装ImageMagick devel包,安装即可:

apt-get install libmagickwand-dev libmagickcore-dev
// 安装ImageMagick devel包后再执行pear安装imagick扩展
pear install imagick-3.4.3RC1.tgz

使用php的imagick扩展处理jpeg和png格式的图片报错:
no decode delegate for this image format 'JPEG' @ error/constitute.c/ReadImage/508

                 
header('Content-type: image/png');
$im = new imagick('http://noavatar.csdn.net/6/C/4/1_linxinzheng.jpg');
//$im = new imagick('http://images.cnitblog.com/blog2015/598639/201503/222347188449376.png');
$im->setImageFormat('png');
echo $im;              
die;
// 查看一下ImageMagick支持的图像格式,发现没有JPEG
convert -list format | grep JPEG

原因是在build ImageMagick的时候没有加载相应的扩展库,先下载对应的图像库,然后重新编译安装ImageMagick即可。

// 安装libjpeg库
wget http://www.ijg.org/files/jpegsrc.v9b.tar.gz
./configure
make
make install

// 重新安装ImageMagick
cd ImageMagick-7.0.3-2
./configure
make
make install

重启php-fpm后再次调用,报错Wrong JPEG library version: library is 80, caller expects 90,原因是Ubuntu16.04目前支持的libjpeg最高版本是libjpeg8c,而我刚才安装的是9b,重新安装8c版本即可(也可以看看当前系统支持的libjpeg版本然后下载对应的libjpeg扩展)。

//cd /usr/local/lib
//ls -la | grep jpeg
// libjpeg.so -> libjpeg.so.8.3.0
wget wget http://www.ijg.org/files/jpegsrc.v8c.tar.gz

重新编译安装libjpeg、IM后重启fpm,调用成功perfect

Windows下wampserver64安装

  1. 下载ImageMagick(http://windows.php.net/downloads/pecl/deps/),解压后将bin目录路径加入环境变量。
  2. 下载
    imagick(http://windows.php.net/downloads/pecl/releases/imagick/3.4.3rc1/),在php的ext目录下新建文件夹imagick,将下载包解压到imagick目录下。
  3. 将ImageMagick中bin目录下的所有dll文件,复制到php的ext/imagick目录下(不要覆盖)。
  4. 在php.ini中添加一行
    extension=E:\wamp64\bin\php\php5.6.19\ext\imagick\php_imagick.dll
  5. 重启wampserver。

踩到的坑

ImageMagick可以读、写、操作百万级(mega-),亿兆级(gita-),甚至是特拉级(tear-)像素的图片。不过很多图片格式都有上限,比如PS最大支持300000px的宽和高。对于大图片,ImageMagick会在本地磁盘创建一个pixel cache,如果本地磁盘容量不够,可以指定缓存路径:

convert -define registry:temporary-path=/data/tmp input.png -resize 250000x250000 output.jpg

ImageMagick默认是在内存中处理图片,为了不让大图片耗尽内存,可以给ImageMagick分配可使用的内存大小,超过内存则自动开辟磁盘缓存空间:

convert -define registry:temporary-path=/data/tmp -limit memory 16mb input.png -resize 250000x250000 output.jpg

当然也可以只使用硬盘,不用内存:

convert -define registry:temporary-path=/data/tmp -limit area 0 input.png -resize 250000x250000 output.jpg

实际使用中,就遇到convert命令在生成失败或者并发大,以及处理大图片的时候,有些临时文件删除不彻底,导致网站根目录会有临时文件残留,可通过-define registry:temporary-path=/tmp指定临时目录解决。

你可能感兴趣的:(PHP)