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

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 News_Security, Programming。將永久鏈結加入書籤。

PHP 等比例縮圖程式 有 65 則回應

  1. life10000 說道:

    谢谢,共享.收藏了.
    很实用的程序.

  2. Tsung 說道:

    很高興您喜歡 🙂
    PS: 您的網站在 Firefox 會都疊在一起耶. XD

  3. jiing 說道:

    最近也自己寫了一個

  4. Tsung 說道:

    辛苦了. Orz...

  5. QQ 說道:

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

  6. Tsung 說道:

    這個並不會影響到你的檔案, $save_filename 決定縮圖後要存檔的檔名, 大概就只有這樣子而已 🙂

  7. kink 說道:

    請問有長寬的限制嗎?
    我測試時,如果圖檔ㄉ長寬超過一定尺寸就沒反應了.....

  8. Tsung 說道:

    沒有, 可能是長度和寬度的值寫反了?

  9. tenlans 說道:

    這個超好用的 ^^
    請問這可以縮GIF或PNG檔嗎?
    我縮GIF或PNG檔都會怪怪的, 整張圖都會變黑色的

  10. Tsung 說道:

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

  11. azure 說道:

    您好,把 $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);

  12. Tsung 說道:

    你要縮的圖片是哪種格式? png / gif 應該都是可以吃才對.

  13. azure 說道:

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

  14. Denise 說道:

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

  15. Tsung 說道:

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

  16. @@ 說道:

    這個縮圖函數非常實用
    希望能繼續發表 新的文章
    期待你新的文章

  17. 2012 說道:

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

  18. Tsung 說道:

    外部的你需要把圖拉回來, 才能夠縮圖. XD

  19. 2012 說道:

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

  20. 2012 說道:

    有網友是說和這設定有關
    allow_url_fopen = On

  21. Tsung 說道:

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

  22. 阿德Sky 說道:

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

  23. Tsung 說道:

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

  24. aoobtds 說道:

    感謝你~

  25. K 說道:

    請問有範例可已下載嗎??因為我是PHP新手!不知道如何開始進行縮圖~~想請大大教學一下~~謝謝

  26. Cherry 說道:

    請問是寫在uplaod那一頁嗎?
    是寫在插入記錄後面嗎?

  27. Cherry 說道:

    再請問...資料庫要多一欄位放縮圖檔嗎?
    謝謝

  28. 不错 說道:

    不错,我修改了下,把小于尺寸的原样输出

  29. Chi 說道:

    在output png 時 quality 很像要改成0~9才不會出錯
    if($sub_name=='png')
    return $function_name($image_new, $save_filename, (int)$quality/10-1);
    else
    return $function_name($image_new, $save_filename, $quality);
    (http://www.electrictoolbox.com/php-fatal-libpng-error-zlib-error/)

  30. 偽。學姊 說道:

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

  31. Flamings 說道:

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

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

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

    • Tsung 說道:

      $_FILES 可以抓到你上傳上來的檔名, 建議您先換個檔名, 然後再來進行其他動作即可. 🙂

    • Flamings 說道:

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

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

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

      這部份有辦法解決嘛?

    • Tsung 說道:

      你的記憶體不夠用, 應該不是這兩個設定.
      先查查看是哪邊用掉這麼多記憶體, 改善這個會比較好.

    • Flamings 說道:

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

  32. 路人 說道:

    大大程式碼不見了囧!!

  33. angela 說道:

    很受用,感謝您

  34. r2 說道:

    您好:
    想請問一下
    我測試了縮gif檔的那段程式
    怎麼原本會動的gif檔,縮圖過後不會動了?

    • Tsung 說道:

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

  35. r2 說道:

    知道了!謝謝你:)

  36. 漢堡 說道:

    你好
    關於轉檔後背景圖變成黑色這個問題有沒有辦法解決?

  37. 小諭 說道:

    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版本有啟用並支持 謝謝

  38. rex 說道:

    程式碼又掛掉了 囧
    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

  39. cultra1974 說道:

    你好:請教一下。圖片檔如果太大,會發生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);出錯了,如何修正。謝謝你。

  40. tallPaul 說道:

    Tsung大 您好,
    可以只輸入其中一邊的尺寸,再等比例縮小嗎?

  41. 小乖 說道:

    謝謝 Tsung 大大您的文章!
    讓我解決了,縮圖的問題,感謝您的分享。

發表迴響