php產生略縮圖程式碼與詳細介紹

來源:互聯網
上載者:User

12.3  自動微縮圖的產生
    由於圖片的資料量比較大,傳遞過程相對較長,所以在使用者瀏覽圖片時,常常希望先
顯示一個圖片的縮圖。
    雖然在HTML中可以通過指定圖片的寬度和高度來隨意縮放圖片,但是這種方法不會
減少圖片的像素數目。圖形檔案的尺寸沒有改變,當然也不會加快圖片下載的速度了。當
然也可以手動通過圖形軟體產生圖片的縮圖,但對於大量的圖片展示來說,這個工作量
將十分巨大。為此微縮圖的自動產生程式就被設計出來了。
    PHP中提供的imagecopyresized函數就可以用來產生真正的縮賂圖片。該函數的標推
文法如下:
    文法:int imagecopyresized(int dst_im,int src_im,int dstX,int dstY,
int srcX,int srcY,int dstW,int dstH,int srcW,int srcH);

  傳回值:整數
  函數種類:圖形處理
  內容說明:本函數可複製新圖,並重新調整圖片的大小尺寸。參數都是目的在前,來
源在後。參數dst im及src_im為圖片的handle。參數dstX、dstY、srcX、srcY分別為目的
及來源的座標。參數dstW、dstH、srcW、srcH分別為來源及目的的寬及高,欲調整的新圖
的尺寸就在這兒配置。
    下面舉個例子來說明這個函數的用法,對應的程式thumb.php如程式清單12—5所示。

  程式清單12—5  thumb.php

 代碼如下 複製代碼
<?
// 本函數從源檔案取出映像,設定成指定大小,並輸出到目的檔案
// 源檔案格式:gif,jpg,png
// 目的檔案格式:gif
// $srcFile:源檔案
// $dstFile: 目標檔案
// $dstW:靶心圖表片寬度
// $dstH:目標檔案高度
function makethumb($srcFile,$dstFile,$dstW,$dstH)
{
 $data = GetImageSize($srcFile,&$info);
 switch ($data[2])
 {
  case 1:
   $imgsrc = @ImageCreateFromGIF($srcFile);
   break;
  case 2:
   $imgsrc = @ImageCreateFromJPEG($srcFile);
   break;
  case 3:
   $imgsrc = @ImageCreateFromPNG($srcFile);
   break;
 }
 $srcW = ImageSX($imgsrc);
 $srcH = ImageSY($imgsrc);
 $ni = ImageCreate($dstW,$dstH);
 ImageCopyResized($ni,$imgsrc,0,0,0,0,$dstW,$dstH,$srcW,$srcH);
 Imagegif($ni,$dstFile);
 // 如果需要輸出到瀏覽器,那麼將上一句改為 ImageJpeg($ni);
 // 如果需要其他格式的圖片,改動最後一句就可以了
}
?>

在這個例子中,首先通過getimagesize()函數獲得源圖片的情況,再用 imagecreatefromgif()、
imagecreatefromjpeg()或imagecreatefrompng()建立一個源位元影像$imgsrc,然後用
imagecreate()函數建立一個目標位元影像,其長、寬各是源位元影像的一半。然後調用imagecopyresized()
函數,將源位元影像縮小後拷貝到目標位元影像中,最後再用imagegif()函數產生縮圖。
    這裡所用到的圖形處理函數就是由安裝的GD庫提供的,現對其分別進行說明。首先
介紹getimagesize()函數,其標準文法如下。
    文法:array getimagesize(string filename,array [imageinfo]);
    傳回值:數組
    函數種類:圖形處理
    內容說明:本函數可用來取得GIF、JPEG及PNG  3種WWW上圖片的高與寬,不
需要安裝GD library就可以便用本函數。返回的數組有4個元素,返回數組的第一個元素(索
引值0)是圖片的高度,單位是像素(pixel);第二個元素(索引值1)是圖片的寬度;第三個元
素(索引值2)是圖片的檔案格式,其值1為GIF格式、2為JPEG/JPG格式、3為PNG格式;
第四個元素(索引值3)為圖片的高與寬字元串,height=xxx width=yyy。
    通過getimagesize()函數的應用,能輕易擷取圖片的各種資訊。下面給大家舉一個擷取
圖片寬度、高度、格式、檔案大小的資訊的例子,來進一步領會getimagesize()函數的使用
技巧。程式imginfo如程式清單12—6所示。

  程式清單12-6  imginfo.php

 代碼如下 複製代碼

<?php
function getImageInfo($img) //$img為影像檔絕對路徑
{
 $img_info = getimagesize($img);
 switch ($img_info[2])
 {
  case 1:
   $imgtype = "GIF";
   break;
  case 2:
   $imgtype = "JPG";
   break;
  case 3:
   $imgtype = "PNG";
   break;
 }
 $img_type = $imgtype."映像";
 $img_size = ceil(filesize($img)/1000)."k"; //擷取檔案大小

 $new_img_info = array (
  "width"=>$img_info[0],
  "height"=>$img_info[1],
  "type"=>$img_type,
  "size"=>$img_size
  );
 print " width";
 print $img_info[0];
 print " height";
 print $img_info[1];
 print " format";
 print $img_type;
 print " size";
 print $img_size;
 print $new_img_info;
 }
 
 $img = "/www/htdocs/images/jf.gif";
 getImageInfo($img);
?>

   

在程式12-5中要建立一個縮圖,需要先建立一個用來繪圖的空白的畫布。
ImageCreate函數可以做到這一點。它將返回一個映像的標識符,並且需要告訴函數用像素
計算的畫布有多大(x(寬度)與y(高度))。在程式12-5中用到的圖形建立函數imagecreate()
的標準文法如下:
    文法:int imagecreate(int x_size,int y_size);
    傳回值:整數
    函數種類:圖形處理
    內容說明:本函數用來建立一張全空的圖形。參數x_size、y_size為圖形的尺寸,單位
為像素(pixel)。
 
    如果要從已經存在的圖片中取出圖片檔案代碼,可以用imagecreatefromgif()、
imagecreatefromjpeg()或imagecreatefrompng(),例如函數imagecreatefromgif()就是從一個GIF
格式的圖片檔案中取出對應的圖片原始碼,其標準文法如下:
  文法:int imagecreatefromgif(string filename);
  傳回值:整數
  函數種類:圖形處理
  內容說明:本函數用來取出一張GIF格式圖形,通常作為背景或者基本的畫布樣本使
用。參數filename可以是本地端的檔案,也可以是網路的URL地址。傳回值為GIF的檔案
代碼,可供其他函數使用。
    在將源位元影像縮小後拷貝到目標位元影像中時,用到了imagecopyresized()函數,此函數可以
複製新圖並調整大小,其標準文法如下:
    文法:int imagecopyresized(int dst_im,int src_im,int dstX,int dstY,int srcX,int srcY,
int dstW,int dstH,int srcW,int srcH);
    傳回值:整數
    函數種類:圖形處理


    內容說明:本函數可複製新圖,並重新調整圖片的大小尺寸。參數那是目的在前,來
源在後。參數ddst_im及src_im為圖片的handle。參數dstX、dstY、srcX、srcY分別為目的
及來源的座標。參數dstW、dstH、srcW、srcH分別為來源及目的的寬及高,若欲調整新圖
的尺寸就在這裡配置。
    最後在輸出映像時用到的imagegif()函數的標準文法如下:
    文法:int imagegif(int im,string [filename]);
    返問值:整數
    函數種類:圖形處理
    內容說明:本函數用來建立一張GIF格式圖形。參數im為使用ImageCreate()所建立
的圖片代碼,參數filename可省略,若無本參數filename,則會將圖片直接送到瀏覽器端,
記得在送出圖片之前要先送出使用Content-type:image/gif的標題字串(header)到瀏覽器
端,以順利傳輸圖片。若要使用透明背景的GIF圖,也就是GIF89a的格式,需要先使用
ImageColorTransparent()配置透明背景。本函數產生的GIF圖,由於有著作權的問題,因此
在商業上的使用還要多加考慮。

 代碼如下 複製代碼

<?php

 $pic_name=date("dMYHis");

 // 產生圖片的寬度
 $pic_width=$_POST['width'];

 // 產生圖片的高度
 $pic_height=$_POST['length'];

 function ResizeImage($im,$maxwidth,$maxheight,$name){
  //取得當前圖片大小
  $width = imagesx($im);
  $height = imagesy($im);
  //產生縮圖的大小
  if(($width > $maxwidth) || ($height > $maxheight)){
   $widthratio = $maxwidth/$width;  
   $heightratio = $maxheight/$height; 
   if($widthratio < $heightratio){
    $ratio = $widthratio;
   }else{
    $ratio = $heightratio;
   }
   $newwidth = $width * $ratio;
   $newheight = $height * $ratio;
  
   if(function_exists("imagecopyresampled")){
    $newim = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresampled($newim, $im, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
   }else{
    $newim = imagecreate($newwidth, $newheight);
    imagecopyresized($newim, $im, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
   }
   ImageJpeg ($newim,$name . ".jpg");
   ImageDestroy ($newim);
  }else{
   ImageJpeg ($im,$name . ".jpg");
  }
 }

 if($_FILES['image']['size']){
  //echo $_FILES['image']['type'];
  if($_FILES['image']['type'] == "image/pjpeg"||$_FILES['image']['type'] == "image/jpg"||$_FILES['image']['type'] == "image/jpeg"){
   $im = imagecreatefromjpeg($_FILES['image']['tmp_name']);
  }elseif($_FILES['image']['type'] == "image/x-png"){
   $im = imagecreatefrompng($_FILES['image']['tmp_name']);
  }elseif($_FILES['image']['type'] == "image/gif"){
   $im = imagecreatefromgif($_FILES['image']['tmp_name']);
  }
  if($im){
   if(file_exists($pic_name.'.jpg')){
    unlink($pic_name.'.jpg');
   }
   ResizeImage($im,$pic_width,$pic_height,$pic_name);
   ImageDestroy ($im);
  }
 }
?>

<img src="<? echo $pic_name.'.jpg'; ?>"><br><br>
<form enctype="multipart/form-data" method="post" action="small_picture.php">
<br>
<input type="file" name="image" size="50" value="瀏覽"><p>
產生縮圖寬度:<input type="text" name="width" size="5"><p>
產生縮圖長度:<input type="text" name="length" size="5"><p>
<input type="submit" value="上傳圖片">
</form>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.