讓 WordPress 改用 ImageMagick 引擎縮圖

前一陣子忽然覺得所謂的「廣色域」影像比較好,所以改用 AdobeRGB 取代原本的 sRGB 來儲存圖片,後來甚至用更廣域的 ProPhoto RGB,圖片上傳到 Flickr,所產生的縮圖並沒有 Color space 的問題,但如果上傳到 WordPress,內建的 php-GD 並沒辦法正確的處理 ICC profile,所以照片縮圖後全部變成「去飽和」的模樣。

最簡單的解決方式當然是把要上傳的照片全部轉成 sRGB 輸出,還可以順便兼顧 IE8 之前的版本不支援 ICC 色彩管理的問題,但總覺得應該可以有更理想的處理方式吧!

就目前的版本,GD 沒辦法處理 ICC profile,所以把目標轉到另一套影像處理引擎 — ImageMagick。所幸 Clinton Agency 已經寫好一套 WordPress Plugin: ImageMagick Engine,它可以讓 WP 改用 ImageMagick 來取代 GD。

環境說明

目前的主機架在 Synology NAS (DS213+) 上,內建的 php 是 5.3.21 版,ImageMagick 是 6.7.6 版,Wordpress 是 3.5.1 版。ImageMagick Engine 為 1.5.0 版。

設定

安裝的方式與其他 plugin 相同,從 Plugins -> Add New 搜尋 ImageMagick Engine 即可。

Synology 本身有提供 Command-line interface (CLI) 版的 ImageMagick,但沒有 php module,目前也查不到什麼比較好的安裝方式,所以只好使用 CLI 的模式。其路徑在 /usr/syno/bin,必須把它加到 open_basedir 這個 php 設定裡。DSM 系統中把這個設定從 php.ini 獨立出來,放在 /usr/syno/etc/php/user-setting.ini 裡。

進入 plugin 的設定,先將 Image engine 指定為 command line,再將 /usr/syno/bin 填入 ImageMagick path 裡。

如果之前 open_basedir 設定沒有錯誤,此時點選 “Test path” 按鈕應該可以顯示成功才對,但發生了神秘的錯誤,看 log 居然是 path: no found. 再 trace code,發現是程式碼裡的路徑被加入了 ” (quot) 符號,而在預設的 safe_mode 模式下運行時,所有 exec() 的 command 都會自動被 escapeshellcmd()1,所以這時候我們要稍微修改一下程式碼:

@@ -472,7 +472,7 @@ function ime_im_cli_check_executable($fullpath) {
        if (!is_executable($fullpath))
                return false;
 
-       @exec('"' . $fullpath . '" --version', $output);
+       @exec($fullpath . ' --version', $output);
 
        return count($output) > 0;
 }
@@ -547,7 +547,7 @@ function ime_im_cli_resize( $old_file, $new_file, $width, $height, $crop, $resiz
        $geometry = $width . 'x' . $height;
 
        // limits are 150mb and 128mb
-       $cmd = "\"$cmd\" \"$old_file\" -limit memory 157286400 -limit map 134217728 -resize $geometr
+       $cmd = "$cmd $old_file -limit memory 157286400 -limit map 134217728 -resize $geometry";
        if ($crop) {
                // '^' is an escape character on Windows
                $cmd .= (ime_is_windows() ? '^^' : '^') . " -gravity center -extent $geometry";
@@ -561,7 +561,7 @@ function ime_im_cli_resize( $old_file, $new_file, $width, $height, $crop, $resiz
        if ( $resize_mode == 'size' )
                $cmd .= ' -strip';
 
-       $cmd .= ' "' .  $new_file . '"';
+       $cmd .= ' ' .  $new_file ;
        exec($cmd);
 
        return file_exists($new_file);
@@ -1075,4 +1075,4 @@ function ime_option_page() {
 </div>
 
\ No newline at end of file
+?>

改好之後應該可以 Test path 成功。下面 Optimize for 欄位有三種設定:Quality, Size, None (use WP instead). Quality 和 Size 的差別主要是加上 -strip 參數,會把 profile, comment 等等資訊從圖片檔移除,原先的目標就是要解決圖片 ICC 的問題,所以所有縮圖模式都要選 Quality 才行。

最後將 Enable enhanced image engine 勾選即可。