Ubuntu 安装 ImageMagic(6.9.1-6)及 PHP 的 imagick (3.0.1)扩展

   2023-02-10 学习力0
核心提示:关于 ImageMagic 和 imagick 的介绍,见《图片处理神器ImageMagick以及PHP的imagick扩展》 和 《Ubuntu下安装ImageMagick和MagicWand For PHP》,安装和代码也都参考自这几篇文章,同时记录下了自己的安装过程以及自己在安装过程中遇到的问题。说明:ImageM

关于 ImageMagic 和 imagick 的介绍,见《图片处理神器ImageMagick以及PHP的imagick扩展》 和 《Ubuntu下安装ImageMagick和MagicWand For PHP》,安装和代码也都参考自这几篇文章,同时记录下了自己的安装过程以及自己在安装过程中遇到的问题。

说明:ImageMagic 的 PHP 扩展可以用 imagick  和 MagicWand for PHP,这里安装使用 imagick。

安装环境:Ubuntu 13.10 (GNU/Linux 3.11.0-12-generic i686)

Nginx 版本:1.2.7

Nginx 安装路径:/usr/local/nginx

Nginx 网站根目录:/home/wwwroot

PHP 版本:5.3.27

PHP 框架:ThinkPHP 3.2.2

PHP 安装路径:/usr/local/php

PHP 配置文件 php.ini 路径:/usr/local/php/etc/php.ini

 

(一)安装 ImageMagic (6.9.1-6)

下载地址:http://www.imagemagick.org/download/ImageMagick-6.9.1-6.tar.gz

① 下载安装包 ImageMagick-6.9.1-6.tar.gz 并通过 ftp 上传到服务器环境,可以通过命令:

find / -name *.tar.gz

找到之前安装包的存放路径,cd 进入该目录:

cd /home/***/lnmp/lnmp1.0-full/

解压压缩包:

tar -zxvf ImageMagick-6.9.1-6.tar.gz

cd 进入解压之后的目录:

cd ImageMagick-6.9.1-6/

 

② 配置:

./configure --enable-shared --enable-lzw --without-perl --with-modules 

 

③ 编译和安装:

make && make install

 

④ 测试 ImageMagic 是否安装成功:

convert -version

如果执行该命令后报错:

/usr/local/bin/convert: error while loading shared libraries: libMagickCore-6.Q16.so.2: cannot open shared object file: No such file or directory

则需要执行 ldconfig(ldconfig命令的用途, 主要是在默认搜寻目录( /lib和/usr/lib ) 以及动态库配置文件 /etc/ld.so.conf 内所列的目录下, 搜索出可共享的动态链接库( 格式如lib*.so* ), 进而创建出动态装入程序( ld.so )所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表. ):

root@***:/home/***/lnmp/lnmp1.0-full/ImageMagick-6.9.1-6# ldconfig

此时再使用 convert -version,就可以显示版本信息了,也就说明安装成功了:

root@***:/home/***/lnmp/lnmp1.0-full/ImageMagick-6.9.1-6# /usr/local/bin/convert -version

Version: ImageMagick 6.9.1-6 Q16 i686 2016-06-15 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC Modules OpenMP 
Delegates (built-in): bzlib freetype jng jpeg ltdl png xml zlib

 (参考:《undefined reference to `inflateReset2'》)

 

(二). 安装 imagick

主要参考《Linux下php安装imagick

① 下载、拷贝、安装 imagick

下载地址:http://pecl.php.net/get/imagick-3.0.1.tgz

root@***:/home/***/lnmp/lnmp1.0-full# tar -zxvf imagick-3.0.1.tgz 

解压之后,进入解压后的目录:

root@***:/home/***/lnmp/lnmp1.0-full# cd imagick-3.0.1/

②  用 phpize 生成 configure 配置文件

root@***:/home/***/lnmp/lnmp1.0-full/imagick-3.0.1# /usr/local/php/bin/phpize 

如果报错:checking for MagickWand.h header file... configure: error: Cannot locate header file MagickWand.h,则:

ln -s /usr/local/include/ImageMagick-6 /usr/local/include/ImageMagick

(参考: 《安装imagick时Cannot locate header file MagickWand.h错误的解决》)

 

③ 配置:

root@***:/home/***/lnmp/lnmp1.0-full/imagick-3.0.1# ./configure  --with-php-config=/usr/local/php/bin/php-config --with-imagick=/usr/local/imagemagick 

 

④ 编译与安装

make && make install

make install 成功后显示:

root@***:/home/***/lnmp/lnmp1.0-full/imagick-3.0.1# make install
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
Installing header files:          /usr/local/php/include/php/

 

⑤ 配置 php,让 php 支持 imagick

vi /usr/local/php/etc/php.ini  #编辑配置文件,在最后一行添加以下内容
extension="imagick.so"

 

⑥ 重启 php-fpm:

ps aux | grep php-fpm
kill -QUIT 1219 
/usr/local/php/sbin/php-fpm 

(参考:《php修改php.ini重启nginx php.ini设置不生效》)

 

⑦ 重启 Nginx:

nginx -s reload

 

⑧ 测试 imagick 是否添加成功:

在 php 文件中输入:

<?php 
phpinfo();

如果在 info 页有如下内容,则说明添加成功:

Ubuntu 安装 ImageMagic(6.9.1-6)及 PHP 的 imagick (3.0.1)扩展

 

 (三)使用 imagick 减小上传图片的品质(80%)

工具类:

 Ubuntu 安装 ImageMagic(6.9.1-6)及 PHP 的 imagick (3.0.1)扩展

Imgicktool.class.php:

<?php
/*
 * 图片压缩类  重新封装了Imagick
 */

namespace Home\Common;

class Imgicktool{
    
    //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))
        {       echo 'error1';
            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;
            }
                        echo 'error2';
            return false;
        }
        catch (ImagickException $e)
        {
                        echo 'error3';
            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();
        }
    }    
}

测试文件 ImgController.class.php:

Ubuntu 安装 ImageMagic(6.9.1-6)及 PHP 的 imagick (3.0.1)扩展

<?php
namespace Home\Controller;
use Home\Common\Imgicktool;
use Think\Controller;

class ImgController extends Controller{

    function info(){
        phpinfo();
    }
    
    function quality(){
        $srcFile = APP_PATH.'/test/test.jpg';
        $destFile = APP_PATH.'/test/test.jpg';
        $qua = new Imgicktool(); 
        $qua->slimming($srcFile, 80, $destFile);
    }        
    
}

 

 

参考:

1.《Ubuntu下安装ImageMagick和MagicWand For PHP

2.《undefined reference to `inflateReset2'

3.《php修改php.ini重启nginx php.ini设置不生效

4.《Linux下php安装imagick

5.《安装imagick时Cannot locate header file MagickWand.h错误的解决

6.《TP3.2下面 new 不出来redis

7. Centos 安装 ImageMagic 时,make 报错,参考《红帽安装ImageMagick出错

8. PHP 5.4的不能安装 imagick-3.0.1《linux下安装ImageMagick-6.5.1-2 老是编译有错误,哪位高手知道怎么解决吗》,这是在正式环境下 (CentOS6)下遇到的问题,imagick 各个版本下载地址:http://pecl.php.net/package/imagick/

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Ubuntu使用——15(thinkphp路由报错Non-static method think\Route::get() should not be called statically)
    Ubuntu使用——15(thinkphp路由报错Non-static
    在route.php中添加代码:use think\Route;Route::get('/',function (){return 'hello world';});在浏览器中输入http://localhost/tp5-git/public/index.php,报错:[8192] ErrorException in route.php line 13Non-static method think\Route::get() should n
    03-08
  • Ubuntu与Window双系统安装的注意事项
    Ubuntu与Window双系统安装的注意事项
      UBUNTU与WINDOW双系统安装的注意事项 由 匿名 (未验证) 提交于 2019-05-18 10:07:41登录 发表评论29 次浏览假定电脑里面已经存在了Window系统,安装另外一个Linux系统:第一:首先确定电脑里面的window系统引导方式电脑系统的引导方式分为:(1)传统
    03-08
  • Ubuntu 图形界面损坏修复方法!!!亲测有用!!!
    Ubuntu 图形界面损坏修复方法!!!亲测有用!
    1.现象今天做实验的时候打开Ubuntu虚拟机,输入密码之后发现变成这样:然后重新开机,到了输入密码界面不输入,而是输入快捷键CTRL+alt+F1,输入用户名+密码进入之后输入ls,发现我的文件还在,心想这不是系统炸了啊上网搜说是图形界面损坏于是重新来:(参考
    03-08
  • Ubuntu终端输入异常、无法退格(删除文本)、使用方向键命令
    Ubuntu终端输入异常、无法退格(删除文本)、使
    1 起因为了学习嵌入式开发安装去安装的ncurses库,使用命令:sudo apt-get install libncurses5-dev导致系统自带的ncurses-base被自动删除。2 出现的问题误删ncurses-base后导致终端输入窗口出现了一系列的问题:Ubuntu终端输入无法退格(删除文本)、使用↑
    03-08
  • Raspberry Pi (Ubuntu) 上的 VNC 无监视器
    Raspberry Pi (Ubuntu) 上的 VNC 无监视器
    超级方便的无监视器VNC方便的树莓派远程桌面操作,无需显示器\(^^)/通过在页面末尾设置“无显示器设置”,可以在启动树莓派之前和之后连接和断开 HDMI 显示器电缆(这很重要)。来自主 PC 的远程桌面环境树莓派 4Ubuntu 20.04(64位)服务器+桌面设置VNC 设
    03-08
  • 免费供个人使用最多3个! !我尝试注册 ESM 将 Ubuntu LTS 版本的支持期延长 5 年
    免费供个人使用最多3个! !我尝试注册 ESM 将
    我个人使用 Ubuntu 作为我的 Linux 机器的操作系统。 Ubuntu 有正常版本和 LTS(长期支持)版本的操作系统。至此,版本号奇数为普通版,偶数为LTS版,LTS版长期支持5年,而普通版有支持期半年左右。。由于Linux机器用作GPU服务器,由于驱动程序和库的兼容性等
    03-08
  • [WSL2 Ubuntu22.04] 尝试使用 WSLg 运行 Elixir Desktop(未完成)
    [WSL2 Ubuntu22.04] 尝试使用 WSLg 运行 Elixir
    现状启用 WSLg 后,Elixir Desktop 会不会像在 Ubuntu 上一样工作?Elixir 桌面示例我试着跑步窗口显示并似乎在移动,但 Todo 应用程序未显示在窗口中。这是一个空白的显示。显示窗口和菜单。Extra 的内容也可以单独使用。如果您使用 Extra 的 Open Browser
    03-08
  • ubuntu中vi下删除键和上下左右键输入字符异常(
     刚安装的Ubuntu系统,使用vi编辑文本的时候,出现以下现象:点删除键输入了 D回车无效上下左右为字母光标乱跳 原因:自带的vi功能问题 解决:卸载原有vi,重新安装完整版本vim执行以下命令即可: sudo apt-get remove vim-common sudo apt-get install v
    02-10
  • ubuntu禁止ping操作(禁用ICMP协议访问) icmp
    ping命令是计算机之间进行相互检测线路完好的一个应用程序,计算机间交流数据的传输没有经过任何的加密处理,因此我们在用ping命令来检测某一个服务器时,可能在因特网上存在某个非法分子,为了安全我们把ping给禁止掉。通过专门的黑客程序把在网络线路上传输
    02-10
  • Ubuntu16配置静态IP ubuntu16.04配置静态ip
    一、静态IP地址配置sudo vi/etc/network/interfaces然后按照如下格式修改:注意这里的网卡名字是ens33auto loiface lo inet loopbackauto ens33iface ens33 inet staticaddress 192.168.1.106netmask 255.255.255.0gateway 192.168.1.1二、配置DNS#临时修改su
    02-10
点击排行