版权属于: Postbird - There I am , in the world more exciting!
原文地址: http://www.ptbird.cn/thinkphp-image-water-sql/
转载时必须以链接形式注明原始出处及本声明。
TPImageWater 是ThinkPHP扩展的用来自动化为已经上传部分图片加水印的应用
这是第二部分,也就是从数据库中读取图片存储地址的字段内容,来实现图片添加水印。
如果想看之前的部分请参照:
在1的基础上,根据客户的需求,进行一个完善,具体的使用方法和原理介绍主要在第二篇文章以及代码中的注释(这估计是我写的最多的注释了)
1、ThinkPHP为已经上传的图片添加水印的插件【原始版本】
2、ThinkPHP自动化为已经上传的图片添加「 响应式」水印(文件遍历部分)
应用思想来源:
本来之前写了遍历文件夹方法来为所有的图片添加【响应式水印】,所谓响应式就是根据标准图片的大小,标准水印的大小和位置,自动化处理文件夹内的所有图片,以达到水印位置和大小符合实际不同图片大小的要求。
基于遍历文件夹的方法存在的问题,也就是客户的最新要求:只处理上传的产片图片,一些文章中的杂七杂八的图片不需要添加水印。
因为系统设计过程中,图片上传基本是以时间点为文件夹,并不区分图片的分类。
所以从数据库中读取字段值是一个很不错的方法。
关键解决:
1、需要处理的图片不一定只在一张表中的一个字段,因此需要准备多个字段的处理。
2、文件遍历方法中,我们需要遍历文件夹的所有内容,并进行相关的图片文件的筛选,但是从数据库读取字段,主要面临的问题是数据库字段中独处的数据能否直接用于图片地址的读取,而且可能存在空值
例如:我在应用的过程中,数据库中存的形式如下【/Uploads/image/20150911/55f2424d5a54d.jpg】
因此需要对字段进行处理,而在代码中,循环的时候预留了处理的代码空间,可以根据实际上自己的需求进行处理。
关键算法:
1、为了实现多个数据库字段内容的读取,我设计的第一个参数是数组,主要的实现也在代码的注释中(代码注释是一切)。
2、(重复一下之前文章提到的水印算法)
因为需要根据标准图片的大小和水印图片的大小以及位置计算出实际上水印图片的大小和位置,因此需要每次计算和生成新的水印并添加到图片中。
由于thinkphp本身的性质,我们每次对水印图片也就是【water.jpg】进行处理生成新的【tmpWater.jpg】,每次都采用覆盖形式的处理,所以到最后处理完成结束了,只会多一张【tmpwater.jpg】,而没有其他的变化。
提提之前文章的内容:
之前文章也就是【文件遍历部分】主要介绍了实现响应式水印的关键算法。
其中也提到了,ThinkPHP3.2实际上已经支持locate(x,y)的参数,也就是根据横纵坐标实现水印图片的位置,不是像官方手册介绍的只有那几种方法。我也不知道为什么手册不更新。
TPImageWater实现的效果:
代码查看(文件遍历和sql数据库字段整合在一起):
下面代码可能输出过程中html标签替代问题,建议直接下载gitosc或者是github的源码查看
码云: