PHP縮略圖,作為PHP處理圖片的最基本應用,而縮略圖也有多種生成方式,其中,網絡最覺的縮略圖是嚴格大小生成的縮略圖。本文使用PHP生成的縮略圖是按原圖的比例縮放,再使用補白擴充至要求的大小...
PHP無損生成縮略圖實例源碼下載

渲染原圖

要生成圖片的縮略圖,首先要獲取圖片的大小信息和類型等,在PHP中,使用getimagesize函數就可以獲取到這些信息。代碼如下:

01. function thumb($image, $thumb, $type = '', $thumb_width = 120, $thumb_height = 120){
02. if(!file_exists($image)){
03. return flase;
04. }
05. $srcinfo = getimagesize($image);
06. if(false === $srcinfo){
07. return false;
08. }
09. if(empty($type)){
10. $type = image_type_to_extension($srcinfo[2],false);
11. }
12. $type = strtolower($type);

其中要注意的是image_type_extension這個函數,用於獲取圖片的后綴名,當然也可以用其它的方法去獲取,最后的一行代碼讓所有的后綴后用小寫的方式表示。

計算縮略圖的比率

如果一張1000x500的圖片,要生成100x100的縮略圖,應該先縮小到100x50,再補白到100x100,這樣才不會失真,否則,圖片直接縮為100x100,會被拉伸了,請看以下的兩張圖,是狼魂博客【http://pjiaxu.com/】首頁的縮略圖,一張是沒有補白的,一張是經過補白的,看看效果如何:

補白縮略圖效果沒有補白的縮略圖效果

相對來說,左面通過補白的縮略看起來比較自然,右邊的縮略,感覺被拉伸得有些難看了。以下是計算比率和補白大小的代碼(緊接之前代碼):

01. $scale = min($thumb_width / $srcinfo[0], $thumb_height / $srcinfo[1]);
02. /*縮略圖的實際大小*/
03. if ($scale >= 1) {
04. $width  = $srcinfo[0];
05. $height = $srcinfo[1];
06. } else {
07. $width  = (int) ($srcinfo[0] * $scale);
08. $height = (int) ($srcinfo[1] * $scale);
09. }
10. /*計算補白的部分大小*/
11. $x = $y = 0;
12. if($width > $height)
13. {
14. $y = ($thumb_height-$height)/2;
15. }
16. else
17. {
18. $x = ($thumb_width-$width)/2;
19. }
其中x和y代表的意思就是補白位置的開始坐標,請看下面的示意圖:

縮略圖補白示意圖

PHP生成縮略圖

按照上面的講述,這時應該生成兩張縮略圖,一張是按比較生成的的縮略力,一張是按要求大小生成的,比較,1000x500的圖片要生成100x100的縮略圖,這時就會有以下的兩步:

  1. 創建一張100x50的縮略圖,將原圖縮小並渲染到這張小圖上
  2. 創建一張100x100的縮略圖,上下各進行25高度的補白,再將第一步創建的小圖移到這張圖的中央位置

這樣,一張比較自然無損的縮略圖就生成了。但有一種情況要考慮,如果一張10x10的圖片,要生成100x100的縮略圖,這時,只要第二步就可以了。具體代碼如下(緊接上面的代碼):

01. /*渲染原圖*/
02. $function = 'ImageCreateFrom' . ($type == 'jpg' ? 'jpeg' : $type);
03. $srcimage = $function($image);
04. /*創建兩張縮略圖
05. $thumbimage是以比較縮放圖,$realimage是補白后$thumb_width、$thumb_height大小的縮略圖*/
06. if ($type != 'gif' && function_exists('imagecreatetruecolor')){
07. $thumbimage = imagecreatetruecolor($width, $height);
08. $realimage = imagecreatetruecolor($thumb_width, $thumb_height);
09. }else{
10. $thumbimage = imagecreate($width, $height);
11. $realimage = imagecreate($thumb_width, $thumb_height);
12. }
13. /*透明背景*/
14. $background = imagecolorallocate($realimage,244,244,244);
15. imagefill($realimage,0,0,$background);
16. imagecolortransparent($realimage,$background);
17. /*縮略圖片*/
18. if (function_exists("ImageCopyResampled"))
19. {
20. imagecopyresampled($thumbimage, $srcimage, 0, 0, 0, 0, $width, $height, $srcinfo[0], $srcinfo[1]);
21. }
22. else
23. {
24. imagecopyresized($thumbimage, $srcimage, 0, 0, 0, 0, $width, $height, $srcinfo[0], $srcinfo[1]);
25. }
26. /*補白圖片*/
27. imagecopymerge($realimage, $thumbimage, $x, $y, 0, 0, $width, $height, 100);
28. $create_func = 'image' . ($type == 'jpg' ? 'jpeg' : $type);
29. $create_func($realimage, $thumb);
30. imagedestroy($thumbimage);
31. imagedestroy($srcimage);
32. imagedestroy($realimage);
33. return true;

完整實例源碼下載