初识gd库

    • 必备基础

      • 开启GD拓展
      • 列表使用
        • 获取图片信息代码
        • 图片详细信息
      • 特效函数
        • 示例
        • 运行结果
        • 分析
    • 获取图片基本信息
      • 获取图片宽度
      • 获取图片高度
      • 获取图片后缀名
      • 获取图片mime类型
    • 操作图片
      • 添加文字水印
      • 添加图片水印
      • 压缩图片
    • 输出图片
      • 输出到浏览器
      • 输出到文件
    • 封装成工具类
      • 封装代码
      • 测试实例
      • 测试结果
    • 总结
      • 最后来总结一下本文的主要内容
      • 本文的应用方向

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]);//去掉后缀名前面的点imagetypetoextension(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函数
  • 输出图片的两种不同的方式
  • 封装成工具类的思想

本文的应用方向:

  • 服务器端对于用户上传图片的压缩处理;
  • 帮助用户添加水印效果的版权保护。
时间: 2024-10-05 12:25:38

初识gd库的相关文章

PHP之初识GD库

d=====( ̄▽ ̄*)b 引语 php不仅仅局限于html的输出,还可以创建和操作各种各样的图像文件,如GIF.PNG.JPEG.WBMP.XBM等. php还可以将图像流直接显示在浏览器中. 要处理图像,就要用到php的GD库. ps:确保php.ini文件中可以加载GD库.可以在php.ini文件中找到“;extension=php_gd2.dll”,将选项前的分号删除,保存,再重启Apache服务器即可. 步骤 在php中创建一个图像一般需要四个步骤: 1.创建一个背景图像,以后的所有操

PHP利用GD库画图和生成验证码图片

首先得确定php.ini设置有没有打开GD扩展功能,测试如下 print_r(gd_info()); 如果有打印出内容如下,则说明GD功能有打开: Array ( [GD Version] => bundled (2.0.34 compatible) [FreeType Support] => 1 [FreeType Linkage] => with freetype [T1Lib Support] => 1 [GIF Read Support] => 1 [GIF Crea

PHP学习笔记-GD库与Jpgraph的使用

转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/52281196 本文出自:[顾林海的博客] 前言 学习PHP从第一篇笔记到现在这篇,已经十多篇了,每天花时间去学习是需要毅力的,好在自己对IT这行也是比较感兴趣,算是每天自娱自乐吧,下周一就去考科目三了,想想也是醉了,拖这么长时间. GD库 GD库是一个开放的动态创建图像.源代码公开的函数库,可以从官方网站http://www.boutell.com/gd处下载.目前,

安装GD库解决ThinkPHP 验证码Call to undefined function Think\imagecreate()出错

在php中imagecreate函数是一个图形处理函数,主要用于新建一个基于调色板的图像了,然后在这个基础上我们可以创建一些图形数字字符之类的,但这个函数需要GD库支持,如果没有开启GD库使用时会提示Call to undefined function imagecreate()错误. 例,我在测试一个简单生成图形时实例 Example #1 新建一个新的 GD 图像流并输出图像  代码如下 复制代码 <?php header("Content-type: image/png")

php GD库

php 中之前比较常使用的是GD库来画图像,这个使用得比较多的是验证码的使用.首先GD库画图必须要有的一些步骤: 首先,创建画布,其次,绘制图片轮廓和画本,再次是输出图型,最后是释放资源. 创建方法如下: imagecreatetruecolor(int width,int height); 填充颜色: $color=imagecolorallocate($resouces,int a,int g,int b); 颜色填充: imagefill($resouces,int start,int s

php GD库常用画图型函数

php GD库画各种的图像函数: 如下: 1.画一个像素:imagesetpixed(int x,int y); 2.画矩形:imagerectange($res,$x,$y,$x1,$x2,$color);两个点实现画矩形 3.imagefilledrectange();参数和上面一样 4.画椭圆: imageellipse($res,int x,int y,int cr,int cy,int color);资源,中心,宽度和高度 5.画一个字符串 imagestring($res,int f

PHP学习笔记-----GD库

PHP中GD库的使用 最新的GD库版本支持GIF.JPEG.PNG.WBMP.XBM等格式的图像文件. 创建图像应该完成如下所示的4个步骤. (1)      创建画布 (2)      绘制图像 (3)      输出图像 (4)      释放资源 画布管理 imagecreate()//新建一个基于调色板的图像 imagecreatetruecolor()//新建一个真彩***像 设置颜色 imagecolorallocate()//为一副图像分配颜色 生成图像 imagegif() im

CentOS 开启GD库

在php.ini 中没有找到"extension=php_gd2.dll"这行代码,这是因为CentOS一般没有预装GD库. 解决办法: 1.在线安装GD库 yum -y install php-gd 2.#重启apache,使其生效 service httpd restart

php如何开启GD库

GD库是干什么用的呢!它是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片.GD库在php中默认是没有开启的,如果想让它支持图片处理功能,那么就要手动开启GD库 步骤: 1.打开php.ini文件 2.用查找工具找到extension=php_gd2.dll,把extension=php_gd2.dll 前面的[;] 3.测试能否用GD库,代码如下: