最近有幸接觸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 :
$data = imagerotate($data, , );
break;
case :
$data = imagerotate($data, , );
break;
case :
$data = imagerotate($data, -, );
break;
}
imagejpeg($data, $dest_file);
}
這裡我們隻需知道圖檔有沒有倒轉,是以采用部分代碼就行。
GD處理,我截圖說明下
IM處理,因為我們這邊改成指令了,是以在這不截圖了。我們版本用的是6.9.5,采用的是convert指令,這塊坑死我好久了,自己下載下傳了7.0版本,發現根本沒
convert
指令,因為新版本用來
magick convert
。記得裝好運作
convert -version
測試imagick是否裝好,這裡指的是6.9.5版本的。下面列出旋轉指令,具體旋轉可以根據上面代碼判斷倒轉角度,對應旋轉多少度
convert -rotate d:/test.jpg d:/aa.jpg
convert -rotate d:/test.jpg d:/aa.jpg
convert -rotate - 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/下,這個在擴充安裝連結裡面說了