PHP缩略图生成和图片水印制作

在网站上传图片过程,经常用到缩略图功能。这里我自己写了一个图片处理的Image类,能生成缩略图,并且可以添加水印图。

2.如何生成缩略图

生成缩略图,关键的是如何计算缩放比率。

这里,我根据图片等比缩放,宽高的几种常见变化,得出一个算缩放比率算法是,使用新图(即缩略图)的宽高,分别除以原图的宽高,看哪个值大,就取它作为缩放比率:

缩放比率  = Max( { 新图高度  / 原图高度 ,  新图宽度  / 原图宽度 } )

也就是:

If ( (新图高度  / 原图高度)  >  (新图宽度  / 原图宽度 ) )  {

              缩放比率 =  新图高度  / 原图高度;

      }ELSE {

             缩放比率 =  新图宽度 / 原图宽度;

     }

这里列出场景的图片缩放场景,及处理方法:

 e.g

场景1,原图比新图大的情况, 缩放比率 =  新图宽度 / 原图宽度 :

PHP缩略图生成和图片水印制作

场景2,原图比新图大的情况,b. 缩放比率 =  新图高度 / 原图高度 :

PHP缩略图生成和图片水印制作

场景3,原图比新图大的情况,而且新图宽高相等,即新图形状是正方形,那么上面的缩放算法也是适用的。

场景4,如果 “新图宽度 >= 原图宽度”  ,同时  “新图高度 >= 原图高度”,那么不缩放图片,也不放大图片,保持原图。

PHP缩略图生成和图片水印制作

场景5,如果 “新图宽度 < 原图宽度”,同时  “新图高度 >= 原图高度”  ,那么先设置  “新图高度= 原图高度”,再剪切。

PHP缩略图生成和图片水印制作

场景6,如果 “新图高度 < 原图高度”,同时  “新图宽度 >= 原图宽度”  ,那么先设置  “新图宽度= 原图宽度”,再剪切。

PHP缩略图生成和图片水印制作

3.如何添加水印图片
   添加水印很容易,我这里没考虑那么复杂,主要是控制水印位置在图片的右下角,和控制水印在图片中的大小。如,当目标图片与水印图大小接近,那么需要先等比缩放水印图片,再添加水印图片。

PHP缩略图生成和图片水印制作

左边两幅图,上面是原图,下面是水印图,右边的缩放后加水印的新图。

 4.类图

PHP缩略图生成和图片水印制作


5.PHP代码

5.1. 构造函数 __construct()

在Image类中,除了构造函数__construct()是public,其它函数都为private.也就是在函数__construct()中,直接完成了生成缩略图和添加水印图的功能。如果,只生成缩略图而不需要添加水印,那么直接在__construct()的参数$markPath,设置为null即可。

其中,“$this->quality = $quality ? $quality : 75;” 控制输出为JPG图片时,控制图片质量(0-100),默认值为75;

/** * Image constructor. * @param string $imagePath 图片路径 * @param string $markPath 水印图片路径 * @param int $new_width 缩略图宽度 * @param int $new_height 缩略图高度 * @param int $quality JPG图片格输出质量 */ 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(); }

Note: 先生成缩略图,再在新图上添加水印 图片。 

5.2. 生成缩略图函数_thumb()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/eac862197017e8ad9682a3542fb09c61.html