初识gd库
gd2在php处理图片相关操作上是非常的方便而且快速的。而且有些时候也很有必要,诸如对用户上传的图片进行压缩处理来提高响应速度,添加文字水印,或者添加图片水印等等。都是非常的实用。
必备基础
开启GD拓展
默认集成环境下的gd拓展应该是打开的,但是为了以防万一,我们也可以到php.ini文件中去把extension=php_gd2.dll前面的分号给去掉。来打开我们的gd拓展,然后重启apache服务器即可。
列表使用
在php中使用列表有一定的艺术,而且对于索引列表和关联列表的处理也是稍有不同的。
这次的列表使用就用到了这两类的使用。
获取图片信息代码
<?php
$src = "./image/src.png";
$info = getimagesize($src);
print_r($info);
?>
图片详细信息
Array
(
[0] => 500
[1] => 733
[2] => 2
[3] => width="500" height="733"
[bits] => 8
[channels] => 3
[mime] => image/jpeg
)
待会我们就会用到这张图片包含的信息数组。
特效函数
下面先来看这样一段代码。
示例
<?php
function show1($msg){
echo "from function show1:".$msg;
}
function show2($msg){
echo "from function show2:".$msg;
}
function show3($msg){
echo "from function show3:".$msg;
}
//////////////////// Begin to test
$msg = "Message";
for($i=1;$i<=3;$i++){
$fun = "show{$i}";
$fun($msg.$i);
echo "<br />";
}
运行结果
代码运行的结果为:
from function show1:Message1
from function show2:Message2
from function show3:Message3
分析
由上面的例子我们不难看出,由使用双引号以及php变量形成的字符串会被解释器解释为一个“常量”,这也恰好符合了php的底层解释工作的原理。也因此我们可以实现动态的方法构造,来更加灵活的执行我们预期的函数。
获取图片基本信息
在php中获取一张图片的基本信息,仅仅是需要一个函数就可以搞定。
$info = getimagesize($src);
而$info 本身就是一个数组,包含了图片宽高,类型,大小等常见属性的数组。
获取图片宽度
$info[0]
获取图片高度
$info[1]
获取图片后缀名
// 获取类似.jpeg;.png等类型前带点型数据
image_type_to_extension(info[2],false);
获取图片mime类型
$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这种支持了面向对象的语言来说,也是比较的方便的。
封装代码
<?php
class ImageTool{
// 图片基本信息
private $info;
// 图片位于内存中的副本
private $image;
/**
* 打开一个文件,得到基本信息
**/
public function __construct($src){
$info = getimagesize($src);
$this->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);
}
}
测试实例
<?php
require './enclose.class.php';
$src = "./image/src.png";
$source = "./image/pressed.png";
$content = "封装的水印!";
$font_uri = "./fonts/msyh.ttf";
$font_size = 28;
$color = array(
0=>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');
测试结果
源图
处理后的结果
总结
最后来总结一下,本文的主要内容。
- 数组的访问,包括索引数组和关联数组的访问形式
- 特效函数的组装与灵活调用
- 加载图片到内存副本的步骤
- 操作图片对应的三个api函数
- 输出图片的两种不同的方式
- 封装成工具类的思想
本文的应用方向:
- 服务器端对于用户上传图片的压缩处理;
- 帮助用户添加水印效果的版权保护。
初识gd库的更多相关文章
- PHP图形图像处理之初识GD库
d=====( ̄▽ ̄*)b 引语 php不仅仅局限于html的输出,还可以创建和操作各种各样的图像文件,如GIF.PNG.JPEG.WBMP.XBM等. php还可以将图像流直接显示在浏览器中. 要处 ...
- PHP的GD库
GD库 PHP通过GD库,可以对JPG.PNG.GIF.SWF等图片进行处理.GD库常用在图片加水印,验证码生成等方面. 绘制线条 要对图形进行操作,首先要新建一个画布,通过imagecreatetr ...
- gd库
1.开启GD库扩展 去掉注释: extension=php_gd2.dll extension_dir='ext目录所在位置' 2.检测GD库是否开启 phpinfo(); //检测扩展是够开启 ex ...
- 已安装php 编译安装 gd库拓展模块
参考资料:http://wenku.baidu.com/link?url=EgXFShYxeJOZSYNQ_7RCBC-6X8OcRRCqVm4qCv49uBk57d6vLBoUpfYdQ-KqJRs ...
- Mac php使用gd库出错 Call to undefined function imagettftext()
第一次在Mac下使用ThinkPHP,用到验证码功能时报如题的错误: Call to undefined function Think\imagettftext() 然后检查自己的GD库,发现安装上了 ...
- GD库处理图像
在PHP5中,动态图象的处理要比以前容易得多.PHP5在php.ini文件中包含了GD扩展包,只需去掉GD扩展包的相应注释就可以正常使用了.PHP5包含的GD库正是升级的GD2库,其中包含支持真彩图像 ...
- 烂泥:centos单独编译安装gd库
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 这几天一直在弄一个商城系统,该系统的源码及数据库都已经上传并创建完毕.但是在安装该系统时,却提示缺少gd库.如下: 使用php探针查看,发现php确实没 ...
- phpize 扩展GD库 安装 ! 环境--centos 7 +nginx 1.7.11+php 5.6.7
使用phpize编译GD库安装,先安装前置库libjpeg libpng zlib freetype等 都是下面php编译的几个选项 先看php编译的选项: --with-gd=DIR ...
- PHP->利用GD库新建图像
1.确认php中GD库是否开启 在PHP配置文件php.ini中查找extension=php_gd2.dll,去掉前边的(分号) ';' 即可,一般php是默认开启的 2.绘画步骤 创建一个画布(画 ...
随机推荐
- 前端面试送命题-JS三座大山
前言 本篇文章比较适合3年以上的前端工作者,JS三座大山分别指:原型与原型链,作用域及闭包,异步和单线程. 原型与原型链 说到原型,就不得不提一下构造函数,首先我们看下面一个简单的例子: functi ...
- My Answer in Regex Golf
Warm Up Answer: foo Point(3) Anchors Answer: k$ Point(2) It never ends $ not allowed Answer: fu\b Po ...
- [NOI 2007]货币兑换Cash
Description 题库链接 (按我的语文水平完全无 fa♂ 概括题意,找了 hahalidaxin 的题意简述... 有 \(AB\) 两种货币,每天可以可以付 \(IP_i\) 元,买到 \( ...
- [SDOI2017]新生舞会
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间 ...
- [HNOI2012]排队
题目描述 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) 输入输 ...
- 贼有意思[最长上升公共子序列](SAC大佬测试题)
题目描述Awson 最近越来越蠢了,一天就只知道 zyys.他定义了一个 zyys 数列:这个数列满足:1.是另外两个数列 A,B 的公共子序列;2.数列单调递增.现在他有一个问题,我们假设知道两个长 ...
- ●UOJ 131 [NOI2015] 品酒大会
题链: http://uoj.ac/problem/131 题解: 网上大多数的方法都是用并查集维护.这里呢,给出另一种自己YY的解法(但实际上本质差不多吧): 后缀数组,RMQ,单调栈 1).预处理 ...
- 例10-9 uva1636简单概率问题
题意:一个01串,0代表没子弹,1代表有子弹.在开一次空枪后,开下一枪没子弹概率大的方案 ①接着开枪 ②随机转一下再开枪 思路: 在情况一就是求00在0中占的比例,情况二则是0在整个串中的比例 ...
- [bzoj1187][HNOI2007]神奇游乐园
来自FallDream的博客,未经允许,请勿转载,谢谢, 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细一看,才发现这是一 ...
- python+eclipse+pydev开发环境搭建
1.安装配置python2.7(右击我的电脑->属性->高级系统设置->环境变量->系统变量列表中找到Path并双击->变量值中添加";C:\Python27; ...