PHP 等比例縮圖程式

兩個 function, 一個算比例要多少(getResizePercent), 另一個 function 依照比例將圖片縮小, 縮到剛好符合預計縮小的其中一邊的尺寸(ImageResize).

使用上只要將這兩個 function  一起放進程式裡面, 直接呼叫 ImageResize(), 把參數傳進去即可.

ImageResize function

  • Usage: ImageResize('ram/xxx.jpg', 'ram/ooo.jpg');
  • 抓取要縮圖的比例, 下述只處理 jpeg
  • $from_filename : 來源路徑, 檔名, ex: /tmp/xxx.jpg
  • $save_filename : 縮圖完要存的路徑, 檔名, ex: /tmp/ooo.jpg
  • $in_width : 縮圖預定寬度
  • $in_height: 縮圖預定高度
  • $quality  : 縮圖品質(1~100)

getResizePercent function

  • 抓取要縮圖的比例
  • $source_w : 來源圖片寬度
  • $source_h : 來源圖片高度
  • $inside_w : 縮圖預定寬度
  • $inside_h : 縮圖預定高度
  • Test:
  • $v = (getResizePercent(1024, 768, 400, 300));
  • echo 1024 * $v . "\n";
  • echo  768 * $v . "\n";

程式原始碼如下:

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈PHP 等比例縮圖程式〉中有 65 則留言

  1. 這是把尺寸縮小而已還是連檔案也縮小了?
    因我想別人上傳的圖檔其檔案縮小一份作為預覽用,以加速網頁傳輸

  2. 可以, 但是程式的 $image = imagecreatefromjpeg($from_filename); 要改成
    $function_name = 'imagecreatefrom'.$sub_name;
    $image = $function_name($filename);
    這樣子~ 🙂

  3. 您好,把 $image = imagecreatefromjpeg($from_filename);改成
    $function_name = 'imagecreatefrom'.$sub_name;
    $image = $function_name($filename);
    會產生錯誤耶? 就下面這行出錯..
    imagecopyresampled($image_new, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

  4. 不好意思,是我沒看仔細
    $image = $function_name($filename);
    改成
    $image = $function_name($from_filename);
    就可以~感謝

  5. 請問設定了縮圖的長400與寬400後,若一邊的長度不及設定的尺寸時,能否用指定的顏色將該邊長補齊至400?

  6. 這就不是這種作法囉~ 這變成你要弄張底色, 然後把這圖片縮完的疊上去, 再合成一張圖.
    如果是 Web, 建議用 CSS 來做這件事. 🙂

  7. 請問大大,
    這個參數:$from_filename
    我用'http://www.kimo.com.tw/banner.gif'這種本機圖的連結,
    在我的本機上能夠正常產生縮圖,
    但是,
    我上傳的其它PHP空間上用時,
    像這種外部連結就掛了(內部像/img/xx.jpg則可以)
    不知道是不是GD lib需要做什麼特別設定才能抓外部連結?
    msn: thor777@seed.net.tw

  8. 拉回來是指存到自己空間嗎,
    可是程式在我本機的話,
    不管是不是外部連結都OK說,
    只有放上空間才....

  9. 嗯, 這跟你的寫法有關, 拉本機的當然沒問題, 拉外面的有使用 fopen 之類的, 就會跟 allow_url_fopen 有關.
    你先把外站的那張圖拉回本機再轉吧. 🙂

  10. 上方程式碼還是有打錯,正確應該如下
    把$image = imagecreatefromjpeg($from_filename);
    取代成
    $function_name = 'imagecreatefrom'.$sub_name;
    $image = $function_name($from_filename);
    但是如png檔或者gif背景是透明的,轉過之後背景會變成黑的= =

  11. gif 和 png 需要另外 imagecolorallocatealpha, imagecolortransparent 等處理, 才可以解決背景圖透明的問題.
    我現在是沒做這種處理, 都鎖定只允許 JPG 上傳而已. Orz.

  12. 轉完之後可以不要只呈現圖片,我希望可以跳頁到其他網頁,
    我試了網路上許多縮圖程式都是如此Orz

  13. 請問 上傳並縮圖時 遇到中文檔名會出現錯誤有辦法解決嘛?
    不縮圖上傳中文檔名的圖片是正常的

    但用英文的話則全都正常.....

    P.S 縮圖部份的程式碼我是另外用的...

    1. 不好意思 我發現問題點了...是縮圖的檔案太大的關係

      錯誤訊息是Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 1417 bytes)

      我ini的設定是
      memory_limit =128M
      upload_max_filesize = 3M
      要縮圖的圖檔則是有1M多

      這部份有辦法解決嘛?

    2. 感謝解答 雖然我不知道要怎麼查被佔用的記憶體
      不過我增加了檢查圖檔大小 大於1M就不給上傳...

    1. Gif 檔的動畫, 事實上是很多的小圖組成的, 所以縮圖都只會取到最前面的那張, 動畫不會動是正常的. XD
      要會動要特別處理.

    1. 你好

      我試著修改出現底下這個錯誤
      Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG library reports unrecoverable error: in /home/yuenmyng/public_html/admin/thumb.php on line 78
      請問怎麼解決?

  14. Tsung您好:
    如果我要支持gif跟png跟jpg的話
    /*
    // $sub_name = jpeg, png, gif
    $function_name = 'imagecreatefrom' . $sub_name;

    if ($sub_name=='png')
    return $function_name($image_new, $save_filename, intval($quality / 10 - 1));

    $image = $function_name($filename); //$image = imagecreatefromjpeg($filename);
    */
    以上這段是否要拿掉註解?

    $image = imagecreatefromjpeg($from_filename);

    這段改成
    $function_name = 'imagecreatefrom'.$sub_name;
    $image = $function_name($filename);
    不知是否正確呢?
    因為怎麼測試都沒反應XD有確定GD版本有啟用並支持 謝謝

  15. 程式碼又掛掉了 囧
    Forbidden

    You don't have permission to access /lifetype/image_resize.phps on this server.

    Apache/2.4.6 (Debian) Server at blogs.longwin.com.tw Port 80

  16. 你好:請教一下。圖片檔如果太大,會發生Fatal error: Allowed memory size of 25165824 bytes exhausted (tried to allocate 15840 bytes) in picture_fix.php on line 78

    在這一行$image = imagecreatefromjpeg($from_filename);出錯了,如何修正。謝謝你。

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料