PHP自適應寬高度等比例縮略圖函數 (無裁切)

對於產品類或者圖片類網站來說,縮略圖是一個很重要的應用。其實說來很簡單,也就是把大圖縮放成一個小圖,用於圖片的列表展示,這樣可以達到用戶快速瀏覽的目的,又能節省帶寬。

如果是等比例縮放,比如小圖是大圖的1/2或者1/5之類的,比較容易處理。但有時候我們需要處理大量不同尺寸的大圖,讓其生成固定寬高度的縮略圖。那就需要一種自適應的方式縮放,就是大圖在縮放的過程中,如果寬度先達到縮略圖的寬度,那大圖多餘的高度就被裁剪掉;如果高度先達到縮略圖的高度,那大圖多餘的寬度就被裁剪掉。這樣處理既讓縮略圖不失真變形,又能最大化保留大圖內容。

今天用PHP寫了一個縮略圖函數,可以達到這種自適應的等比例縮放效果。

<?php
/*
縮略圖函數

作者:影子超
博客:www.shadowchao.com
郵箱:[email protected]

參數說明:
$w ---------- 縮略圖寬度
$h ---------- 縮略圖高度
$dst_path --- 縮略圖路徑
$src_path --- 源圖像路徑
*/
function zoom_image($w,$h,$dst_path,$src_path){
  if(!file_exists($src_path)){
    die("源圖像文件未找到!");
  }
  list($src_w,$src_h,$src_type)=getimagesize($src_path);
  switch($src_type){
    case 1:$src_im=@imagecreatefromgif($src_path);break;
    case 2:$src_im=@imagecreatefromjpeg($src_path);break;
    case 3:$src_im=@imagecreatefrompng($src_path);break;
    default:die("不能識別的圖像類型!");
  }
  $dst_im=@imagecreatetruecolor($w,$h);
  $scale_w=$src_w/$w;
  $scale_h=$src_h/$h;
  if($scale_w>$scale_h){
    $src_w=$scale_h*$w;
  }else{
    $src_h=$scale_w*$h;
  }
  imagecopyresampled($dst_im,$src_im,0,0,0,0,$w,$h,$src_w,$src_h);
  switch($src_type){
    case 1:imagegif($dst_im,$dst_path,80);break;
    case 2:imagejpeg($dst_im,$dst_path,80);break;
    case 3:imagepng($dst_im,$dst_path,80);break;
  }
  imagedestroy($dst_im);
  imagedestroy($src_im);
}
?>

函數共有4個參數,分別是你想生成的縮略圖的寬度、高度、存儲的路徑以及大圖的文件地址(可以是URL地址^_^)

調用方式如:zoom_image(100,100,"abc_small.jpg","abc_big.jpg"),調用無返回,直接將處理後的小圖存放在指定路徑下。





//生成縮略圖(帶裁切)

function thum_img($img,$small_img){

 $thumb = imagecreatetruecolor(100, 100);

 $bg = imagecolorallocate($thumb, 255, 255, 255);

 imagefilledrectangle($thumb, 0, 0, 100, 100, $bg);

 $i = 0;

 $j1 = $j2 = 190;

 $imgarr = getimagesize($img);

 if($imgarr['0']>$imgarr['1']){

 $j1 = $imgarr['0']/($imgarr['1']/$j2);

 $i = ceil(($j2-$j1)/2);

 }elseif($imgarr['0']<=$imgarr['1']){

 $j2 = $imgarr['1']/($imgarr['0']/$j2);

 }

 if($imgarr['mime']=='image/gif'){

 $source = imagecreatefromgif($img);

 }elseif($imgarr['mime']=='image/jpeg'){

 $source = imagecreatefromjpeg($img);

 }elseif($imgarr['mime']=='image/png'){

 $source = imagecreatefrompng($img);

 }elseif($imgarr['mime']=='image/bmp'){

 $source = imagecreatefromwbmp($img);

 }

 imagecopyresampled($thumb, $source, $i, 0, 0, 0, $j1, $j2, $imgarr[0], $imgarr[1]);

 return imagejpeg($thumb,$small_img);

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章