in 程式小心得

php 產生縮圖的方法

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

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

 $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);
 }
?>

利用 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 作轉檔的動作:

<?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.&quot;<br />\n";
    shell_exec($exec_str);
 }
?&gt;

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

利用 imagemagick 轉出來的效果

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

Write a Comment

Comment

  1. 您好,我對於您這篇文章很有興趣,請問此方法產生縮圖為一時暫存還是會產生另一個新檔案?