人人人妻人人人妻人人人,99精品国产综合久久久久五月天 ,欧美白人最猛性XXXXX,日韩AV无码免费播放

News新聞

業(yè)界新聞動態(tài)、技術(shù)前沿
Who are we?

您的位置:首頁      樂道系統(tǒng)FAQ      PHP縮略圖生成和圖片水印制作

PHP縮略圖生成和圖片水印制作

標(biāo)簽: 發(fā)布日期:2017-01-07 00:00:00 240
【CLI】利用Curl下載文件實(shí)時進(jìn)度條顯示的實(shí)現(xiàn)

1.開始

在網(wǎng)站上傳圖片過程,經(jīng)常用到縮略圖功能。這里我自己寫了一個圖片處理的Image類,能生成縮略圖,并且可以添加水印圖。

2.如何生成縮略圖

     生成縮略圖,關(guān)鍵的是如何計(jì)算縮放比率。

     這里,我根據(jù)圖片等比縮放,寬高的幾種常見變化,得出一個算縮放比率算法是,使用新圖(即縮略圖)的寬高,分別除以原圖的寬高,看哪個值大,就取它作為縮放比率:

     縮放比率  = Max( { 新圖高度  / 原圖高度 ,  新圖寬度  / 原圖寬度 } )

     也就是:

      If ( (新圖高度  / 原圖高度)  >  (新圖寬度  / 原圖寬度 ) )  {

              縮放比率 =  新圖高度  / 原圖高度;

      }ELSE {

             縮放比率 =  新圖寬度 / 原圖寬度;

     }

 這里列出場景的圖片縮放場景,及處理方法:

 e.g

場景1,原圖比新圖大的情況, 縮放比率 =  新圖寬度 / 原圖寬度 :

場景2,原圖比新圖大的情況,b. 縮放比率 =  新圖高度 / 原圖高度 :

場景3,原圖比新圖大的情況,而且新圖寬高相等,即新圖形狀是正方形,那么上面的縮放算法也是適用的。

場景4,如果 “新圖寬度 >= 原圖寬度”  ,同時  “新圖高度 >= 原圖高度”,那么不縮放圖片,也不放大圖片,保持原圖。

場景5,如果 “新圖寬度 < 原圖寬度”,同時  “新圖高度 >= 原圖高度”  ,那么先設(shè)置  “新圖高度= 原圖高度”,再剪切。

場景6,如果 “新圖高度 < 原圖高度”,同時  “新圖寬度 >= 原圖寬度”  ,那么先設(shè)置  “新圖寬度= 原圖寬度”,再剪切。

3.如何添加水印圖片
   添加水印很容易,我這里沒考慮那么復(fù)雜,主要是控制水印位置在圖片的右下角,和控制水印在圖片中的大小。如,當(dāng)目標(biāo)圖片與水印圖大小接近,那么需要先等比縮放水印圖片,再添加水印圖片。

左邊兩幅圖,上面是原圖,下面是水印圖,右邊的縮放后加水印的新圖。

 4.類圖


5.PHP代碼

5.1. 構(gòu)造函數(shù) __construct()

     在Image類中,除了構(gòu)造函數(shù)__construct()是public,其它函數(shù)都為private.也就是在函數(shù)__construct()中,直接完成了生成縮略圖和添加水印圖的功能。如果,只生成縮略圖而不需要添加水印,那么直接在__construct()的參數(shù)$markPath,設(shè)置為null即可。

     其中,“$this->quality = $quality ? $quality : 75;” 控制輸出為JPG圖片時,控制圖片質(zhì)量(0-100),默認(rèn)值為75;

  /**
   * Image constructor.
   * @param string $imagePath 圖片路徑
   * @param string $markPath 水印圖片路徑
   * @param int $new_width 縮略圖寬度
   * @param int $new_height 縮略圖高度
   * @param int $quality JPG圖片格輸出質(zhì)量
   */
  public function __construct(string $imagePath,
                string $markPath = null,
                int $new_width = null,
                int $new_height = null,
                int $quality = 75)
  {
    $this->imgPath = $_SERVER['DOCUMENT_ROOT'] . $imagePath;
    $this->waterMarkPath = $markPath;
    $this->newWidth = $new_width ? $new_width : $this->width;
    $this->newHeight = $new_height ? $new_height : $this->height;
    $this->quality = $quality ? $quality : 75;

    list($this->width, $this->height, $this->type) = getimagesize($this->imgPath);
    $this->img = $this->_loadImg($this->imgPath, $this->type);


    //生成縮略圖
    $this->_thumb();
    //添加水印圖片
    if (!empty($this->waterMarkPath)) $this->_addWaterMark();
    //輸出圖片
    $this->_outputImg();
  }