剛才我在做一個織夢站的時候出現了一個問題就是不管怎樣弄自動生成的縮略圖文件在列表里都是失真的,變形很嚴重特別影響美觀尤其是那種圖片特別長的或者是特別寬的主要元素不集中的圖片來說簡直就是災難。
好了,下面的方法我們都用這張圖片來演示一下吧我們暫且叫它原圖:
第一種方法:原生縮略圖不用動不用改生成的縮略圖
第二種方法:大眾方法縮略圖
操作流程:打開網站根目錄下的include/helpers/文件夾中的“image.helper.php”文件。
查找如下代碼:
$srcW=ImageSX($im); $srcH=ImageSY($im); if($srcW<=$toW && $srcH<=$toH ) return TRUE; $toWH=$toW/$toH; $srcWH=$srcW/$srcH; if($toWH<=$srcWH){ $ftoW=$toW; $ftoH=$ftoW*($srcH/$srcW); } else { $ftoH=$toH; $ftoW=$ftoH*($srcW/$srcH); } 把上面的這些代碼全部替換成下面的代碼: $srcW=ImageSX($im); $srcH=ImageSY($im); if($srcW<=$toW && $srcH<=$toH ) return TRUE; $toWH=$toW/$toH; $srcWH=$srcW/$srcH; $ftoH=$toH;$ftoW=$toW; if ($toWH<=$srcWH) { $src_Y = 0; $src_X = ($srcW-$srcH*$toWH)/2; $srcW = $srcH*$toWH; } else { $src_X = 0; $src_Y = ($srcH-$srcW/$toWH)/2; $srcH = $srcW/$toWH; } |
把上面的這些代碼全部替換成下面的代碼:
$srcW=ImageSX($im); $srcH=ImageSY($im); if($srcW<=$toW && $srcH<=$toH ) return TRUE; $toWH=$toW/$toH; $srcWH=$srcW/$srcH; $ftoH=$toH;$ftoW=$toW; if ($toWH<=$srcWH) { $src_Y = 0; $src_X = ($srcW-$srcH*$toWH)/2; $srcW = $srcH*$toWH; } else { $src_X = 0; $src_Y = ($srcH-$srcW/$toWH)/2; $srcH = $srcW/$toWH; } |
上面的方法是超過縮略圖大小的部分就進行裁剪如果說一張圖片高是1000像素但只有中間有點20像素的圖片則裁剪出來的縮略圖就是空白,它剪的是左上角的部分,原理是把一張原圖從左上角裁剪出織夢系統設置的高寬后其它的內容全部扔掉??梢詫Ρ缺疚拈_頭的“原圖”和“第二種方法”縮略圖這兩張圖片。
第三種方法(強烈推薦):終極長寬高等比例自適應裁剪縮略圖
操作流程:同方法二打開網站根目錄下的include/helpers/文件夾中的“image.helper.php”文件。查找“縮圖片自動生成函數,來源支持bmp、gif、jpg、png”
看到了吧,在這些注釋的下面從以下代碼開始:
if ( ! function_exists('ImageResize')) |
到“獲得GD的版本”這些注釋結束的所有內容替換成下面的代碼(注意是除注釋外全部替換哦):
if ( ! function_exists('ImageResize')) { function ImageResize($srcFile,$toW,$toH,$toFile="") { global $cfg_photo_type; if($toFile=="") { $toFile = $srcFile; } $info = ""; $srcInfo = GetImageSize($srcFile,$info); switch ($srcInfo[2]) { case 1: if(!$cfg_photo_type['gif']) { return false; } $im = imagecreatefromgif($srcFile); break; case 2: if(!$cfg_photo_type['jpeg']) { return false; } $im = imagecreatefromjpeg($srcFile); break; case 3: if(!$cfg_photo_type['png']) { return false; } $im = imagecreatefrompng($srcFile); break; case 6: if(!$cfg_photo_type['bmp']) { return false; } $im = imagecreatefromwbmp($srcFile); break; } $srcW=ImageSX($im); $srcH=ImageSY($im); if($srcW<=$toW && $srcH<=$toH ) { return true; } //縮略生成并裁剪 $newW = $toH * $srcW / $srcH; $newH = $toW * $srcH / $srcW; if($newH >= $toH) { $ftoW = $toW; $ftoH = $newH; } else { $ftoW = $newW; $ftoH = $toH; } if($srcW>$toW||$srcH>$toH) { if(function_exists("imagecreatetruecolor")) { @$ni = imagecreatetruecolor($ftoW,$ftoH); if($ni) { imagecopyresampled($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH); } else { $ni=imagecreate($ftoW,$ftoH); imagecopyresized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH); } } else { $ni=imagecreate($ftoW,$ftoH); imagecopyresized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH); } //裁剪圖片成標準縮略圖 $new_imgx = imagecreatetruecolor($toW,$toH); if($newH >= $toH) { imagecopyresampled($new_imgx,$ni,0,0,0,($newH - $toH)/2,$toW,$toH,$toW,$toH); } else { imagecopyresampled($new_imgx,$ni,0,0,($newW - $toW)/2,0,$toW,$toH,$toW,$toH); } switch ($srcInfo[2]) { case 1: imagegif($new_imgx,$toFile); break; case 2: imagejpeg($new_imgx,$toFile,90); break; case 3: imagepng($new_imgx,$toFile); break; case 6: imagebmp($new_imgx,$toFile); break; default: return false; } imagedestroy($new_imgx); imagedestroy($ni); } imagedestroy($im); return true; } } |
為了避免出錯下面給一個示例:
/** * 縮圖片自動生成函數,來源支持bmp、gif、jpg、png * 但生成的小圖只用jpg或png格式 * * @access public * @param string $srcFile 圖片路徑 * @param string $toW 轉換到的寬度 * @param string $toH 轉換到的高度 * @param string $toFile 輸出文件到 * @return string */ (注意哦替換的是這里全部的內容哦很長的一幾段內容) /** * 獲得GD的版本 * * @access public * @return int */ |
好了到此保存上傳然后試著生成一個縮略圖看看吧。到目前為止第三種方法是我見過最好的了它最大的特點就是居中裁剪這樣無論如何也不會變形了,而且一般圖片的主要像素都是從中間開始的,裁剪出來的縮略圖和原圖的中間部分都是一模一樣的只是把原圖中間變小了。