兩個 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";
程式原始碼如下:
谢谢,共享.收藏了.
很实用的程序.
很高興您喜歡 🙂
PS: 您的網站在 Firefox 會都疊在一起耶. XD
最近也自己寫了一個
辛苦了. Orz...
這是把尺寸縮小而已還是連檔案也縮小了?
因我想別人上傳的圖檔其檔案縮小一份作為預覽用,以加速網頁傳輸
這個並不會影響到你的檔案, $save_filename 決定縮圖後要存檔的檔名, 大概就只有這樣子而已 🙂
請問有長寬的限制嗎?
我測試時,如果圖檔ㄉ長寬超過一定尺寸就沒反應了.....
沒有, 可能是長度和寬度的值寫反了?
這個超好用的 ^^
請問這可以縮GIF或PNG檔嗎?
我縮GIF或PNG檔都會怪怪的, 整張圖都會變黑色的
可以, 但是程式的 $image = imagecreatefromjpeg($from_filename); 要改成
$function_name = 'imagecreatefrom'.$sub_name;
$image = $function_name($filename);
這樣子~ 🙂
您好,把 $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);
你要縮的圖片是哪種格式? png / gif 應該都是可以吃才對.
不好意思,是我沒看仔細
$image = $function_name($filename);
改成
$image = $function_name($from_filename);
就可以~感謝
嗯嗯~ 🙂
請問設定了縮圖的長400與寬400後,若一邊的長度不及設定的尺寸時,能否用指定的顏色將該邊長補齊至400?
這就不是這種作法囉~ 這變成你要弄張底色, 然後把這圖片縮完的疊上去, 再合成一張圖.
如果是 Web, 建議用 CSS 來做這件事. 🙂
這個縮圖函數非常實用
希望能繼續發表 新的文章
期待你新的文章
請問大大,
這個參數:$from_filename
我用'http://www.kimo.com.tw/banner.gif'這種本機圖的連結,
在我的本機上能夠正常產生縮圖,
但是,
我上傳的其它PHP空間上用時,
像這種外部連結就掛了(內部像/img/xx.jpg則可以)
不知道是不是GD lib需要做什麼特別設定才能抓外部連結?
msn: [email protected]
外部的你需要把圖拉回來, 才能夠縮圖. XD
拉回來是指存到自己空間嗎,
可是程式在我本機的話,
不管是不是外部連結都OK說,
只有放上空間才....
有網友是說和這設定有關
allow_url_fopen = On
嗯, 這跟你的寫法有關, 拉本機的當然沒問題, 拉外面的有使用 fopen 之類的, 就會跟 allow_url_fopen 有關.
你先把外站的那張圖拉回本機再轉吧. 🙂
上方程式碼還是有打錯,正確應該如下
把$image = imagecreatefromjpeg($from_filename);
取代成
$function_name = 'imagecreatefrom'.$sub_name;
$image = $function_name($from_filename);
但是如png檔或者gif背景是透明的,轉過之後背景會變成黑的= =
gif 和 png 需要另外 imagecolorallocatealpha, imagecolortransparent 等處理, 才可以解決背景圖透明的問題.
我現在是沒做這種處理, 都鎖定只允許 JPG 上傳而已. Orz.
感謝你~
請問有範例可已下載嗎??因為我是PHP新手!不知道如何開始進行縮圖~~想請大大教學一下~~謝謝
這篇文章不是就有函式 + 範例了嗎?
Usage 就是使用方式阿.
請問是寫在uplaod那一頁嗎?
是寫在插入記錄後面嗎?
寫在你要上傳檔案接收那頁.
再請問...資料庫要多一欄位放縮圖檔嗎?
謝謝
看你自己決定, 可以固定一個命名規則也可以.
不错,我修改了下,把小于尺寸的原样输出
嗯嗯, cool~ 🙂
在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/)
嗯嗯, 感謝指點, 已經修正. 🙂
轉完之後可以不要只呈現圖片,我希望可以跳頁到其他網頁,
我試了網路上許多縮圖程式都是如此Orz
這只是 function, 您只要呼叫 function 後, 不要在頁面上顯示圖片, 直接轉去其他頁面就好了阿~
請問 上傳並縮圖時 遇到中文檔名會出現錯誤有辦法解決嘛?
不縮圖上傳中文檔名的圖片是正常的
但用英文的話則全都正常.....
P.S 縮圖部份的程式碼我是另外用的...
$_FILES 可以抓到你上傳上來的檔名, 建議您先換個檔名, 然後再來進行其他動作即可. 🙂
不好意思 我發現問題點了...是縮圖的檔案太大的關係
錯誤訊息是Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 1417 bytes)
我ini的設定是
memory_limit =128M
upload_max_filesize = 3M
要縮圖的圖檔則是有1M多
這部份有辦法解決嘛?
你的記憶體不夠用, 應該不是這兩個設定.
先查查看是哪邊用掉這麼多記憶體, 改善這個會比較好.
感謝解答 雖然我不知道要怎麼查被佔用的記憶體
不過我增加了檢查圖檔大小 大於1M就不給上傳...
大大程式碼不見了囧!!
感謝回報,
程式碼還在: http://blogs.longwin.com.tw/lifetype/image_resize.phps
只是 Rewrite 遇到 Bug, 看來不太好處理. 🙁
很受用,感謝您
您好:
想請問一下
我測試了縮gif檔的那段程式
怎麼原本會動的gif檔,縮圖過後不會動了?
Gif 檔的動畫, 事實上是很多的小圖組成的, 所以縮圖都只會取到最前面的那張, 動畫不會動是正常的. XD
要會動要特別處理.
知道了!謝謝你:)
你好
關於轉檔後背景圖變成黑色這個問題有沒有辦法解決?
那個應該是透明底圖?
是的,那張的圖是透明底圖
參考這篇看看: http://www.blueshop.com.tw/board/show.asp?subcde=BRD20100512104331C9N&fumcde=FUM20041006152627A9N
感謝
你好
我試著修改出現底下這個錯誤
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG library reports unrecoverable error: in /home/yuenmyng/public_html/admin/thumb.php on line 78
請問怎麼解決?
這種問題應該要自己想辦法囉~
http://stackoverflow.com/questions/10611883/warning-imagejpeg-functionimagejpeg-gd-jpeg-jpeg-library-reports-unrecov 參考一下.
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版本有啟用並支持 謝謝
ㄏㄏ我弄好了 只是無法上傳 背景是透明的png檔跟 gif 很好的一篇謝謝囉
程式碼又掛掉了 囧
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
感謝提醒, 升級到 Apache 2.4 後, 很多設定檔要改~ 漏改了~
你好:請教一下。圖片檔如果太大,會發生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);出錯了,如何修正。謝謝你。
記憶體不夠用.
增加一行:ini_set("memory_limit","2048M"); 試試看~ 🙂
Tsung大 您好,
可以只輸入其中一邊的尺寸,再等比例縮小嗎?
可以啊,妳修改一下計算比例那個 function,把不要得那邊拿掉,就可以了
喔喔喔 感謝
謝謝 Tsung 大大您的文章!
讓我解決了,縮圖的問題,感謝您的分享。