本文共 4807 字,大约阅读时间需要 16 分钟。
gd2在php处理图片相关操作上是非常的方便而且快速的。而且有些时候也很有必要,诸如对用户上传的图片进行压缩处理来提高响应速度,添加文字水印,或者添加图片水印等等。都是非常的实用。
默认集成环境下的gd拓展应该是打开的,但是为了以防万一,我们也可以到php.ini文件中去把extension=php_gd2.dll前面的分号给去掉。来打开我们的gd拓展,然后重启apache服务器即可。
在php中使用列表有一定的艺术,而且对于索引列表和关联列表的处理也是稍有不同的。
这次的列表使用就用到了这两类的使用。
Array( [0] => 500 [1] => 733 [2] => 2 [3] => width="500" height="733" [bits] => 8 [channels] => 3 [mime] => image/jpeg)
待会我们就会用到这张图片包含的信息数组。
下面先来看这样一段代码。
";}
代码运行的结果为:
from function show1:Message1from function show2:Message2from function show3:Message3
由上面的例子我们不难看出,由使用双引号以及php变量形成的字符串会被解释器解释为一个“常量”,这也恰好符合了php的底层解释工作的原理。也因此我们可以实现动态的方法构造,来更加灵活的执行我们预期的函数。
在php中获取一张图片的基本信息,仅仅是需要一个函数就可以搞定。
$info = getimagesize($src);而$info 本身就是一个数组,包含了图片宽高,类型,大小等常见属性的数组。
$info[0]
$info[1]
// 获取类似.jpeg;.png等类型前带点型数据
image_type_to_extension(info[2]);//去掉后缀名前面的点imagetypetoextension(info[2],false);
$info[‘mime’];
操作图片,也是本文的核心。我们操作图片的前提就是把图片加载到内存区,也就是说根据图片所在的路径获得一个图片的副本到内存中操作。所以根据这点,我们不难理解,为什么要在操作完图片之后销毁内存区域中该图片的副本了吧。
添加文字水印的前提是我们有支持的TrueType字体,这一点来说系统都会满足的。
array imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )
添加图片水印的思路就是合并两张图片而已,所以思路上来说这也是很简单的。
bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )
其API文档上有这么一行话。
将 src_im 图像中坐标从 src_x,src_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。两图像将根据 pct 来决定合并程度,其值范围从 0 到 100。当 pct = 0 时,实际上什么也没做,当为 100 时对于调色板图像本函数和 imagecopy() 完全一样,它对真彩色图像实现了 alpha 透明。
压缩图片就是把现有的源图,附加到一块画布上面,来实现压缩的目的。
bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
其API上有如下语句:
imagecopyresampled() 将一幅图像中的一块正方形区域拷贝到另一个图像中,平滑地插入像素值,因此,尤其是,减小了图像的大小而仍然保持了极大的清晰度。
操作图片,不是我们的目的,我们的目的就是获取操作后的图片。一下有两种方式,可供我们选择,一种是临时的,一种是持久化的。
图片要想被浏览器正确的解读,我们就需要先告诉浏览器,让它知道自己要显示什么内容的数据。这一点可以通过在php中添加头信息来实现。
header("Content-Type:".$image_info['mime']);$func = "image{$image_type}";$func($image);
不难看出,这里也用到了重组的函数来做了灵活的处理。
输出到持久化的本地文件来说,需要我们指定一个文件的路径。如下:
$func = "image{ $image_type}";// 文件输出$func($image,路径加名称);
为了更好的使用这些代码,封装成工具类是一个更好的选择,对于php这种支持了面向对象的语言来说,也是比较的方便的。
info = array( 'width'=>$info[0], 'height'=>$info[1], 'type'=>image_type_to_extension($info[2],false), 'mime'=>$info['mime'] ); $temp_function = "imagecreatefrom{$this->info['type']}"; $this->image = $temp_function($src); } /** * 操作图片 **/ public function thumb($width,$height){ // 创建画布 $image_thumb = imagecreatetruecolor($width,$height); // 压缩 imagecopyresampled($image_thumb,$this->image,0,0,0,0,$width,$height,$this->info['width'],$this->info['height']); // 销毁内存中的图片 imagedestroy($this->image); $this->image = $image_thumb; } /** * 添加文字水印 **/ public function addFontMark($content,$font_uri,$font_size,$font_color,$local,$angel){ $col = imagecolorallocatealpha($this->image,$color[0],$color[1],$color[2],$color[3]); imagettftext($this->image,$font_size,$col,$angel,$local['x'],$local['y'],$font_uri,$content); } /** * 添加图片水印 **/ public function addImageMark($source,$local,$alpha){ $info2 = getimagesize($source); $type = image_type_to_extension($info2[2],false); $temp_func = "imagecreatefrom{$type}"; $water = $temp_func($source); imagecopymerge($this->image,$water,$local['x'],$local['y'],0,0,$info2[0],$info2[1],$alpha); imagedestroy($water); } /** * 在浏览器中显示图片 **/ public function showInBrowser(){ header("Content-Type:".$this->info['mime']); $fun = "image{$this->info['type']}"; $fun($this->image); } /** * 将图片生成到硬盘中 **/ public function save2Local($output_name){ $fun = "image{$this->info['type']}"; $fun($this->image,$output_name.".".$this->info['type']); } /** * 销毁内存中的图片 **/ public function __destruct(){ imagedestroy($this->image); }}
255, 1=>255, 2=>255, 3=>50);$local = array( 'x'=> 20, 'y'=> 30);$angel = 12;$alpha = 30;$tool = new ImageTool($src);$tool->thumb(1000,1466);$tool->addFontMark($content,$font_uri,$font_size,$color,$local,$angel);$tool->addImageMark($source,$local,$alpha);$tool->showInBrowser();$tool->save2Local('./image/enclose');
源图
处理后的结果