Imagick和GD圖片處理旋轉等問題
最近有幸接觸Discuz二次開發,所有也在看它的相關原始碼。這幾天遇到圖片上傳倒轉的問題,花了不少時間解決。吐槽一下,這個問題對剛接觸Discuz的新手來說有點噁心。也有部分原因,自己對圖片處理這塊業務幾乎沒什麼接觸。在這裡記錄一下自己這幾天的收穫
問題: IOS照片顛倒,自己在本地電腦翻轉,上傳圖片並沒有什麼效果
1. 原始碼追蹤
填坑歷程: 專案中Discuz我們用的是自己的一套模板,所以前臺跟真正的discuz不一樣。這邊用的是wfupload,一套基於flash的上傳外掛,以前用過基於h5的bootstrap file_input
,不過這不影響後臺的處理。自己找到對應模板下的js中的upload_url
class_image
類中,程式碼邏輯流程是先呼叫init方法 在呼叫Thumb方法,如下圖
上圖中的$this->params
即$_G['setting']
的值,稍後介紹怎麼讓$this->libmethod
為真的
從上圖可以出來,$this->libmethod
決定走的是哪個方法處理處理。處理圖片有兩種方式,一個是GD以及IM,這是從程式碼辛苦看出來的,當時本地一直走GD沒走IM,線上走的IM,線上除錯半天,才知道。最終程式碼通過日誌找到了,這個決定走的GD還是IM的路徑是從哪設定的。其實是在管理後臺設定的,如下圖
兩種處理方式說明
GD方式:Discuz採用的是`imagecreatetruecolor` 、`imagecopyresampled`、`imagecreatefromjpeg`、`imagejpeg`等php函式處理,具體搜尋引擎走一遍就知道
IM方式:我自己專案中Discuz採用的是imagick的convert命令列,組合好命令字串,呼叫exec,實際上我看了一下,原始碼是呼叫php的imagick擴充套件,可能被前人改造了吧!
處理圖片旋轉的方式不難,但是網上比較少,不過有幸被我找到了,程式碼理解還比較容易。程式碼如下
$source_file = "d:/test.jpg";
$dest_file = "d:/haha.jpg";
$data = imagecreatefromstring(file_get_contents($source_file));
$exif = exif_read_data($source_file);
// exif資訊頭, 包含了照片的基本資訊, 包括拍攝時間, 顏色, 寬高, 方向
if(!empty($exif['Orientation'])) {
switch($exif['Orientation']) {
case 8:
$data = imagerotate($data, 90, 0);
break;
case 3:
$data = imagerotate($data, 180, 0);
break;
case 6:
$data = imagerotate($data, -90, 0);
break;
}
imagejpeg($data, $dest_file);
}
這裡我們只需知道圖片有沒有倒轉,所以採用部分程式碼就行。
GD處理,我截圖說明下
IM處理,因為我們這邊改成命令了,所以在這不截圖了。我們版本用的是6.9.5,採用的是convert命令,這塊坑死我好久了,自己下載了7.0版本,發現根本沒convert
命令,因為新版本用來magick convert
。記得裝好執行convert -version
測試imagick是否裝好,這裡指的是6.9.5版本的。下面列出旋轉命令,具體旋轉可以根據上面程式碼判斷倒轉角度,對應旋轉多少度
convert -rotate 90 d:/test.jpg d:/aa.jpg
convert -rotate 180 d:/test.jpg d:/aa.jpg
convert -rotate -90 d:/test.jpg d:/aa.jpg
2.Imagick的軟體和php擴充套件安裝的問題
找了好多資料,很多卵用都沒有。最終還是php官方這個給力啊!參考時間最近的回答,在這裡隨便記錄下,下載擴充套件一定要對應自己的php環境,phpinfo()中的要看的引數如下圖中的紅框
安裝成功以後的phpinfo。
擴充套件安裝教程:http://php.net/manual/en/imagick.setup.php
擴充套件下載:http://pecl.php.net/package/imagick/3.4.1/windows
imagick軟體安裝我下的是windows:https://www.imagemagick.org/download/binaries/
linux下的 http://www.imagemagick.org/script/binary-releases.php
注:1.軟體版本選擇,看官方說明吧。這裡不說了。這裡還提一下7.0的沒用convert命令,坑死我了!
2.在cmd下執行php-m如果報找不到php_imgick.dll,把下載的擴充套件壓縮包中*.dll 全扔到C:\Sysyem\System32\下
3.web擴充套件不好使的話,把下載的擴充套件壓縮包中*.dll 全扔到/Path/to/Apache/bin/下,這個在擴充套件安裝連結裡面說了