天天看點

Imagick和GD圖檔處理旋轉等問題問題: IOS照片颠倒,自己在本地電腦翻轉,上傳圖檔并沒有什麼效果

最近有幸接觸Discuz二次開發,所有也在看它的相關源碼。這幾天遇到圖檔上傳倒轉的問題,花了不少時間解決。吐槽一下,這個問題對剛接觸Discuz的新手來說有點惡心。也有部分原因,自己對圖檔處理這塊業務幾乎沒什麼接觸。在這裡記錄一下自己這幾天的收獲

問題: IOS照片颠倒,自己在本地電腦翻轉,上傳圖檔并沒有什麼效果

1. 源碼追蹤

填坑曆程: 項目中Discuz我們用的是自己的一套模闆,是以前台跟真正的discuz不一樣。這邊用的是wfupload,一套基于flash的上傳插件,以前用過基于h5的

bootstrap file_input

,不過這不影響背景的處理。自己找到對應模闆下的js中的

upload_url

,自動跟蹤到

class_image

類中,代碼邏輯流程是先調用init方法 在調用Thumb方法,如下圖

Imagick和GD圖檔處理旋轉等問題問題: IOS照片颠倒,自己在本地電腦翻轉,上傳圖檔并沒有什麼效果

上圖中的

$this->params

$_G['setting']

的值,稍後介紹怎麼讓

$this->libmethod

為真的

Imagick和GD圖檔處理旋轉等問題問題: IOS照片颠倒,自己在本地電腦翻轉,上傳圖檔并沒有什麼效果

從上圖可以出來,

$this->libmethod

決定走的是哪個方法處理處理。處理圖檔有兩種方式,一個是GD以及IM,這是從代碼辛苦看出來的,當時本地一直走GD沒走IM,線上走的IM,線上調試半天,才知道。最終代碼通過日志找到了,這個決定走的GD還是IM的路徑是從哪設定的。其實是在管理背景設定的,如下圖

Imagick和GD圖檔處理旋轉等問題問題: IOS照片颠倒,自己在本地電腦翻轉,上傳圖檔并沒有什麼效果

兩種處理方式說明

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處理,我截圖說明下

Imagick和GD圖檔處理旋轉等問題問題: IOS照片颠倒,自己在本地電腦翻轉,上傳圖檔并沒有什麼效果

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()中的要看的參數如下圖中的紅框

Imagick和GD圖檔處理旋轉等問題問題: IOS照片颠倒,自己在本地電腦翻轉,上傳圖檔并沒有什麼效果

安裝成功以後的phpinfo。

Imagick和GD圖檔處理旋轉等問題問題: IOS照片颠倒,自己在本地電腦翻轉,上傳圖檔并沒有什麼效果

擴充安裝教程: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/下,這個在擴充安裝連結裡面說了