Centos 安裝php Imagick 擴展


從 centos 倉庫安裝

首先安裝 php-pear php-devel,gcc三個軟件包

yum install php-pear php-devel gcc 

通過 yum 安裝Centos 官方源的 imageMagick 軟件

yum install ImageMagick ImageMagick-devel ImageMagick-perl

下一步,驗證ImageMagick已經安裝在你的系統上並驗證它的版本

# convert --version

Version: ImageMagick 6.7.2-7 2017-03-22 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features: OpenMP   

通過ImageMagick源碼安裝

未嘗試

安裝 ImageMagick php擴展

下面通過簡單的pecl命令來安裝 PHP的 ImageMagick 擴展,它將會安裝 ImageMagick 和 一個在/usr/lib/php/modules目錄下的一個文件名是imagick.so的ImageMagick php擴展。如果你是使用64位系統,這個擴展放的路徑是在/usr/lib64/php/modules

# pecl install imagick 
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading imagick-3.4.4.tgz ...
Starting to download imagick-3.4.4.tgz (253,434 bytes)
.....................................................done: 253,434 bytes
19 source files, building
running: phpize
Configuring for:
PHP Api Version:         20170718
Zend Module Api No:      20170718
Zend Extension Api No:   320170718
Please provide the prefix of ImageMagick installation [autodetect] : 

注意:它將會詢問你給ImageMagick設置安裝的前綴,最簡單是按回車鍵(Enter)讓其自動選擇

在安裝成功之后,會輸出類似下面的信息,告訴你imagick.so文件所在的路徑

Build process completed successfully
Installing '/usr/lib64/php/modules/imagick.so'
Installing '/usr/include/php/ext/imagick/php_imagick_shared.h'
install ok: channel://pecl.php.net/imagick-3.4.4
configuration option "php_ini" is not set to php.ini location
You should add "extension=imagick.so" to php.ini

現在,添加imagick.so 擴展到 /etc/php.ini 文件中

echo extension=imagick.so >> /etc/php.ini

下一步重啟 apache 服務器

service httpd restart

你可以運行下面的命令來驗證 imagick php擴展.你將會看到一行小的 imagick文字 在下面輸出

# php -m | grep imagick

imagick

當然,你可以創建一個 php 文件,使用phpinfo()函數輸出 php信息。

Laravel項目使用第三方類庫來優化圖片

圖片優化類庫是: image-optimizer

安裝該類庫里面的依賴工具

  1. svgo
npm install -g svgo
  1. jpegoptim
# yum install libjpeg 
# git clone https://github.com/tjko/jpegoptim.git
# cd jpegoptim/
# ./configure
# make
# make install

/usr/bin/install -c -d -m 755 /usr/local/share/man/man1
/usr/bin/install -c -d -m 755 /usr/local/bin
/usr/bin/install -c -m 644 jpegoptim.1 /usr/local/share/man/man1/jpegoptim.1
/usr/bin/install -c -m 755 jpegoptim /usr/local/bin/jpegoptim
  1. optipng

點擊頁面的下載源碼包,然后跳到 sourceforge頁面下載,等chrome出現下載,進入 chrome的下載管理,復制下載鏈接

cd /tmp
wget wget https://jaist.dl.sourceforge.net/project/optipng/OptiPNG/optipng-0.7.7/optipng-0.7.7.zip
unzip optipng-0.7.7.zip
cd optipng-0.7.7
./configure
make
make install
optipng #驗證是否運行安裝成功
  1. pngquant

首先需要安裝 libpng 軟件,如果沒有安裝的話

進入libpng,下載 .tar.gz 格式的文件

和上面一樣,當文件在 chrome開始下載的時候,打開chrome的下載內容,復制下載地址

cd /tmp
wget https://nchc.dl.sourceforge.net/project/libpng/libpng16/1.6.37/libpng-1.6.37.tar.gz
tar -zxvf libpng-1.6.37.tar.gz
cd libpng-1.6.37
./configure
make
make install
ldconfig 
pngfix # 驗證libpng是否安裝成功

然后安裝 pngquant

cd /tmp
git clone git://github.com/kornelski/pngquant.git
cd pngquant
./configure
make
make install
pngquant -h  #驗證是否安裝成功

因為gif擴展不需要使用,所以沒有安裝

問題

如果運行,出現error while loading shared libraries: libpng16.so.16

pngquant -h

pngquant: error while loading shared libraries: libpng16.so.16: cannot open shared object file: No such file or directory

可以先找以下 libpng16所在的位置

whereis libpng16.so.16

libpng16.so: /usr/local/lib/libpng16.so /usr/local/lib/libpng16.so.16

發現編輯的文件不在 /usr/lib,/usr/lib64 2個文件夾下

ls /usr/local/lib #列出該文件夾的文件

libpng16.a   libpng16.so     libpng16.so.16.37.0  libpng.la  pkgconfig
libpng16.la  libpng16.so.16  libpng.a             libpng.so

使用ln軟鏈接的方式,將文件放入到放到 /usr/lib,/usr/lib64

ln -s /usr/local/lib/libpng16.so /usr/lib/
ln -s /usr/local/lib/libpng16.so.16 /usr/lib64/

然后在運行pngquant -h 就顯示該命令的幫助信息了

error while loading shared libraries libpng16 這里提到的在 make install之后,再運行ldconfig命令,感覺沒有效果

圖片優化的代碼記錄

先上傳文件,上傳完之后,判斷文件是否是圖片文件,如果是,進行圖片優化,控制器ToolsController.php的代碼如下

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class ToolsController extends Controller{

	private function isImg($fileName)
    { 
         $file  = fopen($fileName, "rb"); 
         $bin  = fread($file, 2); // 只讀2字節 
         
         fclose($file); 
         $strInfo = @unpack("C2chars", $bin); 
         $typeCode = intval($strInfo['chars1'].$strInfo['chars2']); 
         $fileType = ''; 
         
         if($typeCode == 255216 /*jpg*/ || $typeCode == 7173 /*gif*/ || $typeCode == 13780 /*png*/) 
         { 
          return $typeCode; 
         }
         else
         { 
          return false; 
         } 
    } 

    public function upload(Request $request)
    {
        //判斷請求中是否包含name=file的上傳文件
        if (!$request->hasFile('file')) {
            return response()->json(array(
            	'error_msg' => '請上傳文件',
            	'success' => false,
            	'data' => array()
            ));
        }
        // 判斷圖片上傳中是否出錯
        $file = $request->file('file');
        if (!$file->isValid()) {
        	return response()->json(array(
            	'error_msg' => '上傳文件出錯,請重試',
            	'success' => false,
            	'data' => array()
            ));
        }
        $credentials = $request->all();
        $entension = $file -> getClientOriginalExtension(); //  上傳文件后綴
        $filename = uniqid().mt_rand(1,9);  // 重命名圖片
        if(!empty($entension)){
            $filename .= '.'.$entension;
        }
        if(!isset($credentials['dir'])){
            $credentials['dir'] = 'temp';
        }
        $host = url('/');
        $saveFilename =public_path().'/uploads/'.$credentials['dir'].'/'.$filename ;
        $file->move(public_path().'/uploads/'.$credentials['dir'].'/',$filename);  // 重命名保存
        $img_path = $host.'/uploads/'.$credentials['dir'].'/'.$filename;

        try{
        	 //$check = exif_imagetype($saveFilename);
        	//$allowedExts = array(IMAGETYPE_JPEG, IMAGETYPE_PNG,IMAGETYPE_WEBP,IMAGETYPE_BMP);

            $isImage = $this->isImg($saveFilename);
            //1. 判斷文件是否是圖片
            if($isImage !== false){
                $factory = new \ImageOptimizer\OptimizerFactory(array(
                    'pngquant_options' => ['--force', '--skip-if-larger','--quality 70-80']
                ));
                $optimizer = $factory->get();

                $optimizer->optimize($saveFilename);
            }
        }catch(\Exception $e){
            \Log::error("optimize error".$e->getMessage());
        }
       return response()->json(array(
	       	'success' => true,
	       	'error_msg' => '',
	       	'data' => array(
	       			'url'=>$img_path
	       	)
       ));
    }
}

備記

本想直接使用php原生的exif_imagetype() 方法進行判斷文件是否是圖片,但是出現以下錯誤

exif_imagetype(): Read error!

通過下面命令,都可以當前LAMP環境是有開啟對應的擴展的,但是就是讀取錯誤

# php -m |grep exif

exif

# php -m |grep mbstring

mbstring
References
  1. Install ImageMagick (Image Manipulation) Tool on RHEL/CentOS and Fedora 安裝的步驟都是按這個博文來的
  2. CentOS 6 系における tmux のインストール 解決error while loading shared libraries: libpng16.so.16的錯誤
  3. PHP 判斷文件是否為圖片的方法 判斷文件是否是圖片


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM