使用PHP產生圖片的縮圖的方法_php執行個體

來源:互聯網
上載者:User
功能:支援jpg,jpeg,gif,png,bmp圖片格式,支援按原圖片的比例進行縮放,可以選擇在圖片縮放的過程中是否需要對圖片進行裁切,加入了圖片品質控制,可以實現縮圖片品質最高化。完整類的代碼如下:

<?php/** * 功能:php產生縮圖片的類 */ class ResizeImage{  public $type;//圖片類型  public $width;//實際寬度  public $height;//實際高度  public $resize_width;//改變後的寬度  public $resize_height;//改變後的高度  public $cut;//是否裁圖  public $srcimg;//源圖象   public $dstimg;//靶心圖表象地址  public $im;//臨時建立的圖象  public $quality;//圖片品質  function resizeimage($img,$wid,$hei,$c,$dstpath,$quality=100){   $this->srcimg=$img;   $this->resize_width=$wid;   $this->resize_height=$hei;   $this->cut=$c;   $this->quality=$quality;   $this->type=strtolower(substr(strrchr($this->srcimg,'.'),1));//圖片的類型   $this->initi_img();//初始化圖象   $this -> dst_img($dstpath);//靶心圖表象地址   @$this->width=imagesx($this->im);   @$this->height=imagesy($this->im);   $this->newimg();//產生圖象   @ImageDestroy($this->im);  }  function newimg(){   $resize_ratio=($this->resize_width)/($this->resize_height);//改變後的圖象的比例   @$ratio=($this->width)/($this->height);//實際圖象的比例   if(($this->cut)=='1'){//裁圖    if($img_func==='imagepng'&&(str_replace('.','',PHP_VERSION)>=512)){ //針對php版本大於5.12參數變化後的處理情況     $quality=9;    }    if($ratio>=$resize_ratio){//高度優先     $newimg=imagecreatetruecolor($this->resize_width,$this->resize_height);     imagecopyresampled($newimg,$this->im,0,0,0,0,$this->resize_width,$this->resize_height,(($this->height)*$resize_ratio),$this->height);     imagejpeg($newimg,$this->dstimg,$this->quality);    }    if($ratio<$resize_ratio){//寬度優先     $newimg=imagecreatetruecolor($this->resize_width,$this->resize_height);     imagecopyresampled($newimg,$this->im,0,0,0,0,$this->resize_width,$this->resize_height,$this->width,(($this->width)/$resize_ratio));     imagejpeg($newimg,$this->dstimg,$this->quality);    }   }else{//不裁圖    if($ratio>=$resize_ratio){     $newimg=imagecreatetruecolor($this->resize_width,($this->resize_width)/$ratio);     imagecopyresampled($newimg,$this->im,0,0,0,0,$this->resize_width,($this->resize_width)/$ratio,$this->width,$this->height);     imagejpeg($newimg,$this->dstimg,$this->quality);    }    if($ratio<$resize_ratio){     @$newimg=imagecreatetruecolor(($this->resize_height)*$ratio,$this->resize_height);     @imagecopyresampled($newimg,$this->im,0,0,0,0,($this->resize_height)*$ratio,$this->resize_height,$this->width,$this->height);     @imagejpeg($newimg,$this->dstimg,$this->quality);    }   }  }  function initi_img(){//初始化圖象   if($this->type=='jpg' || $this->type=='jpeg'){    $this->im=imagecreatefromjpeg($this->srcimg);   }   if($this->type=='gif'){    $this->im=imagecreatefromgif($this->srcimg);   }   if($this->type=='png'){    $this->im=imagecreatefrompng($this->srcimg);   }   if($this->type=='wbm'){    @$this->im=imagecreatefromwbmp($this->srcimg);   }   if($this->type=='bmp'){    $this->im=$this->ImageCreateFromBMP($this->srcimg);   }  }  function dst_img($dstpath){//圖象目標地址   $full_length=strlen($this->srcimg);   $type_length=strlen($this->type);   $name_length=$full_length-$type_length;   $name=substr($this->srcimg,0,$name_length-1);   $this->dstimg=$dstpath;   //echo $this->dstimg;  }     function ImageCreateFromBMP($filename){ //自訂函數處理bmp圖片   if(!$f1=fopen($filename,"rb"))returnFALSE;   $FILE=unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset",fread($f1,14));   if($FILE['file_type']!=19778)returnFALSE;   $BMP=unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.     '/Vcompression/Vsize_bitmap/Vhoriz_resolution'.     '/Vvert_resolution/Vcolors_used/Vcolors_important',fread($f1,40));   $BMP['colors']=pow(2,$BMP['bits_per_pixel']);   if($BMP['size_bitmap']==0)$BMP['size_bitmap']=$FILE['file_size']-$FILE['bitmap_offset'];   $BMP['bytes_per_pixel']=$BMP['bits_per_pixel']/8;   $BMP['bytes_per_pixel2']=ceil($BMP['bytes_per_pixel']);   $BMP['decal']=($BMP['width']*$BMP['bytes_per_pixel']/4);   $BMP['decal']-=floor($BMP['width']*$BMP['bytes_per_pixel']/4);   $BMP['decal']=4-(4*$BMP['decal']);   if($BMP['decal']==4)$BMP['decal']=0;   $PALETTE=array();   if($BMP['colors']<16777216)   {    $PALETTE=unpack('V'.$BMP['colors'],fread($f1,$BMP['colors']*4));   }   $IMG=fread($f1,$BMP['size_bitmap']);   $VIDE=chr(0);   $res=imagecreatetruecolor($BMP['width'],$BMP['height']);   $P=0;   $Y=$BMP['height']-1;   while($Y>=0)   {    $X=0;    while($X<$BMP['width'])    {     if($BMP['bits_per_pixel']==24)      $COLOR=unpack("V",substr($IMG,$P,3).$VIDE);     elseif($BMP['bits_per_pixel']==16)     {      $COLOR=unpack("n",substr($IMG,$P,2));      $COLOR[1]=$PALETTE[$COLOR[1]+1];     }     elseif($BMP['bits_per_pixel']==8)     {      $COLOR=unpack("n",$VIDE.substr($IMG,$P,1));      $COLOR[1]=$PALETTE[$COLOR[1]+1];     }     elseif($BMP['bits_per_pixel']==4)     {      $COLOR=unpack("n",$VIDE.substr($IMG,floor($P),1));      if(($P*2)%2==0)$COLOR[1]=($COLOR[1]>>4);else$COLOR[1]=($COLOR[1]&0x0F);      $COLOR[1]=$PALETTE[$COLOR[1]+1];     }     elseif($BMP['bits_per_pixel']==1)     {      $COLOR=unpack("n",$VIDE.substr($IMG,floor($P),1));      if(($P*8)%8==0)$COLOR[1]=$COLOR[1]>>7;      elseif(($P*8)%8==1)$COLOR[1]=($COLOR[1]&0x40)>>6;      elseif(($P*8)%8==2)$COLOR[1]=($COLOR[1]&0x20)>>5;      elseif(($P*8)%8==3)$COLOR[1]=($COLOR[1]&0x10)>>4;      elseif(($P*8)%8==4)$COLOR[1]=($COLOR[1]&0x8)>>3;      elseif(($P*8)%8==5)$COLOR[1]=($COLOR[1]&0x4)>>2;      elseif(($P*8)%8==6)$COLOR[1]=($COLOR[1]&0x2)>>1;      elseif(($P*8)%8==7)$COLOR[1]=($COLOR[1]&0x1);      $COLOR[1]=$PALETTE[$COLOR[1]+1];     }     else      returnFALSE;     imagesetpixel($res,$X,$Y,$COLOR[1]);     $X++;     $P+=$BMP['bytes_per_pixel'];    }    $Y--;    $P+=$BMP['decal'];   }   fclose($f1);   return$res;  }    }?>

使用方法很簡單代碼如下:


$resizeimage=new ResizeImage('upload/abc.bmp', '120', '90', '0', 'upload/xabc.bmp');


另外一個強大的PHP圖片縮圖類:phpThumb

該類除了縮放圖片外,還能將圖片轉換成不同的格式輸出(比如將GIF格式的圖片輸出為PNG格式),其特色功能還包括色彩、特效等

官方網址:http://phpthumb.sourceforge.net/

We'll be using phpThumb , the open source PHP script to generate thumbnails on the fly.

Download and extract phpThumb to somewhere in your website folder. Now to use a rounded corner thumbnail of an image, simply use the img tag of HTML with src as

   Adjust the path to phpThumb according to where you place the phpThumb files.             

一般只需要下面的檔案就可以了

其實phpThumb的功能比我原先想象的要強大一些,下面把他的其他一些有用的參數列一下:

src:靶心圖表片的地址

w:輸出圖片的寬度

h:輸出圖片的高度(如果不指定他將按w參數等比縮放)

q:輸出如果是JPG格式的,可以規定它的輸出品質

bg:輸出時的背景(如果需要)

sw、sh、sx、sy:局部輸出,寬高、起始位置

f:輸出格式,可以為jpeg、png、gif、ico

sfn:輸出gif動畫中的某一幀

fltr[]:濾鏡,可以有很多效果,包括銳利化、模糊、旋翻轉、浮水印、邊框、遮照、色彩調整等

使用示範:

//載入類庫檔案 require_once 'path/to/ThumbLib.inc.php'; //執行個體化類庫,傳入你要處理的圖片的地址可以是網路地址,也可以是本地地址 $thumb = PhpThumbFactory::create('http://www.shlongyingjixie.com/'); //把圖片等比縮小到最大寬度 100px或者最高100px,當只輸入一個參數的時候,是限制最寬的尺寸。 $thumb->resize(100, 100); //把圖片等比縮小到原來的百分數,比如50就是原來的50%。 $thumb->resizePercent(50); //截取一個175px * 175px的圖片,注意這個是截取,超出的部分直接裁切掉,不是強制改變尺寸。 $thumb->adaptiveResize(175, 175); //從圖片的中心計算,截取200px * 100px的圖片。 $thumb->cropFromCenter(200, 100); //,前兩個參數分別是需要解出的圖片的右上方的座標X,Y。 後面兩個參數是需要解出的圖片寬,高。 $thumb->crop(100, 100, 300, 200);  //把圖片順時針反轉180度 $thumb->rotateImageNDegrees(180); //儲存(產生)圖片,你可以儲存其他格式,詳細參考文檔 $thumb->save( 'NewPath/Of/image.jpg ' );
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.