php 實現圖片等比例縮放 原理(初級)

來源:互聯網
上載者:User

主要說明下幾個用到的函數:

imagecreatefromjpeg() 返回一映像標識符,代表了從給定的檔案名稱取得的映像。

int imagesx ( resource image) 返回 image 所代表的映像的寬度。

int imagesy ( resource image) 返回 image 所代表的映像的高度。

bool function_exists ( string function_name)   定義指定的函數則返回 true 值,其它情形均返回 false 值。

imagecreatetruecolor() 返回一個映像標識符,代表了一幅大小為 x_size 和 y_size 的黑色映像。

imagecreate() 返回一個映像標識符,代表了一幅大小為 x_size 和 y_size 的空白映像。

int imagecopyresampled ( resource dst_im, resource src_im, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH)

imagecopyresized 與上面方法相同,區別見下面說明:
與上面的參數相同

 

int srcW, int srcH)   重採樣拷貝部分映像並調整大小

$dst_image:建立的圖片

$src_image:需要載入的圖片

$dst_x:設定需要載入的圖片在新圖中的x座標

$dst_y:設定需要載入的圖片在新圖中的y座標

$src_x:設定載入圖片要載入的地區x座標

$src_y:設定載入圖片要載入的地區y座標

$dst_w:設定載入的原圖的寬度(在此設定縮放)

$dst_h:設定載入的原圖的高度(在此設定縮放)

$src_w:原圖要載入的寬度

$src_h:原圖要載入的高度

 

ImageCopyResized()函數在所有GD版本中有效,但其縮放映像的演算法比較粗糙。ImageCopyResamples(),其像素插值演算法得到的映像邊緣比較平滑,但該函數的速度比ImageCopyResized()慢。

 

imagejpeg() 從 image 映像以 filename 為檔案名稱建立一個 JPEG 映像。

imagedestroy() 釋放與 image 關聯的記憶體。

 

執行個體:

<?php      header("Content-Type:text/html;charset=utf-8");      $im = imagecreatefromjpeg('oldsrc.jpg');      $maxwidth = 75;      $maxheight = 75;      $name = 'newpic';      $filetype = '.jpg';      $pic_width = imagesx($im);      $pic_height = imagesy($im);        if(($maxwidth && $pic_width > $maxwidth) || ($maxheight && $pic_height > $maxheight))      {          if($maxwidth && $pic_width>$maxwidth)   //原圖寬度大於最大寬度          {              $widthratio = $maxwidth/$pic_width;              $resizewidth_tag = true;          }            if($maxheight && $pic_height>$maxheight) //原圖高度度大於最大高度          {              $heightratio = $maxheight/$pic_height;              $resizeheight_tag = true;          }            if($resizewidth_tag && $resizeheight_tag)   //如果新圖片的寬度和高度都比原圖小          {              if($widthratio<$heightratio)        //那個比較小就說明它的長度要長,就取哪條,以長邊為準縮放保證圖片不被壓縮                  $ratio = $widthratio;              else                  $ratio = $heightratio;          }            if($resizewidth_tag && !$resizeheight_tag)              $ratio = $widthratio;          if($resizeheight_tag && !$resizewidth_tag)              $ratio = $heightratio;            $newwidth = $pic_width * $ratio;            //原圖的寬度*要縮放的比例          $newheight = $pic_height * $ratio;          //原圖高度*要縮放的比例                    if(function_exists("imagecopyresampled"))          {              $newim = imagecreatetruecolor($newwidth,$newheight);    //產生一張要產生的黑色背景圖 ,比例為計算出來的新圖片比例              imagecopyresampled($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);  //複製按比例縮放的原圖到 ,新的黑色背景中。          }          else          {              $newim = imagecreate($newwidth,$newheight);              imagecopyresized($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);          }            $name = $name.$filetype;          imagejpeg($newim,$name);          imagedestroy($newim);      }      else      {          $name = $name.$filetype;          imagejpeg($im,$name);      }          ?>  

特別說明:

  GD庫1.6.2版以前支援GIF格式,但因GIF格式使用LZW演算法牽涉專利權,因此在GD1.6.2版之後不支援GIF的格式。如果你是WINDOWS的環境,你只要進入PHP.INI檔案找到extension=php_gd2.dll,將#去除,重啟APACHE即可,如果你是Linux環境,又想支援GIF,PNG,JPEG,你需要去下載libpng,zlib,以及freetype字型並安裝。

  OK,PHP圖片壓縮函數完成,最後我們概述一下整個處理的思路:

  通過計算實際圖片的長寬與規定產生圖片的長寬之間的縮放比例,根據實際的需求(按照寬度還是按照高度進行圖片縮放)計算出最終產生圖片的大小,然後應用PHP圖片處理函數對圖片進行處理,最後輸出圖片。

聯繫我們

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