php 產生縮圖的方法

php 比較常用的有二種縮圖的方式,一種是用 gd 函式,一種是利用 imagemagick 。剛試用了二種方法,以前為了所垢病的 GD 畫質不好的情況已經有顯著的改善了,跟 imagemagick 所產生出來的縮圖已經極為接近了,其主要差異為壓縮後畫質和檔案大小方面的問題。

第一個 function 是利用 GD 來作縮圖的動作。

[code lang=”php”] $src_h){ $thumb_w = $size; $thumb_h = intval($src_h / $src_w $size); }else{ $thumb_h = $size; $thumb_w = intval($src_w / $src_h $size); } $thumb = imagecreatetruecolor($thumb_w, $thumb_h); // 舊方法,不過產出來的畫質效果極差 //imagecopyresized($thumb, $src, 0, 0, 0, 0, $thumb_w, $thumb_h, $src_w, $src_h); imagecopyresampled($thumb, $src, 0, 0, 0, 0, $thumb_w, $thumb_h, $src_w, $src_h); $file= array_pop(explode(“/“,$filename)); imagejpeg($thumb, “/tmp/thumb/i-$size-“.$file); } ?> [/code]

利用 imagecopyresampled 轉出來的效果: 利用 imagecopyresampled 轉出來的效果

利用 imagecopyresized 轉出來的效果: 利用imagecopyresized 轉出來的效果

在 php 手冊上寫 imagecopyresampled 和 imagecopyresized 主要的不同點如下,就是讓他畫質更好,更接近原色:

imagecopyresampled() copies a rectangular portion of one image to another image, smoothly interpolating pixel values so that, in particular, reducing the size of an image still retains a great deal of clarity

這個 function 是利用 imagemagick 作轉檔的動作: [code lang=”php”] <?php function create_thumb_by_convert($filename , $type , $size) { $file = “/tmp/thumb/c-“.$size . “-“.array_pop(explode(“/“,$filename)); $exec_str=”/usr/bin/convert -quality 80 -geometry “.$size.”x”.$size.” “.$filename.” “.$file; echo $exec_str.”
\n”; shell_exec($exec_str); } ?> [/code]

下面為利用 imagemagick 產出縮圖的效果。

利用 imagemagick 轉出來的效果

整體來說 imagemagick 轉出來的畫質是比較好的,檔案也比 gd 轉出來的小一點,而且我 gd 必需使用到壓縮比到 90 才會和 imagemagick 轉出來的效果一樣。 imagecopyresampled() 和 imagecopyresized() 的差異更明顯了,跟本不需要考慮使用 imagecopyresized() ,除非是使用 gif ,否則只有 imagecopyresampled 可以看而已。