織夢DedeCMS實現縮圖不拉伸變形的方法
阿新 • • 發佈:2019-01-08
織夢cms目前幾個最新版本的縮圖生成方式都是採用縮小或拉伸的方式進行完整顯示,如果使用的圖片和縮圖所顯示的比例不一致的話,會使得縮圖拉伸變形。如果不改變織夢目前的縮圖顯示方式的話,又想縮圖不拉伸變形顯示,就得製作一個和顯示縮圖位置大小一致或者圖片比例一致且大於縮圖的解析度就會不拉伸變形了。
我們可以通過下面方法修改實現,對圖片進行按寬或高進行放縮,超過縮圖大小的部分再進行裁剪,這樣生成的縮圖的顯示效果要比原來的要好得多了。同時也可以採取之際製作好解析度一致的縮圖進行顯示。
於是重新修改了一下DEDECMS v5.6縮圖生成方法。
預設dedecms5.6預設生成的縮圖,縮圖大小設定為:100*100(直接把圖片縮小了)
看起來很不美觀,影響了圖片的觀賞性
DEDECMS v5.6縮圖裁剪優化方法
修改如下:
開啟/includes/image.func.php檔案,
//縮圖片自動生成函式,來源支援bmp、gif、jpg、png
//但生成的小圖只用jpg或png格式
找到程式碼第44行function ImageResize
至
//獲得GD的版本之間的程式碼,用如下的程式碼覆蓋(大家請注意備份)。
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,85);
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;
}