src/thinkextend/image/driver/Gd.php
public function text($text, $font, $size, $color = '#00000000',
        $locate = THINKIMAGE_WATER_SOUTHEAST, $offset = 0, $angle = 0) {
        //资源检测
        if (empty($this->im)) {
            throw new Exception('没有可以被写入文字的图像资源');
        }

        if (!is_file($font)) {
            throw new Exception("不存在的字体文件：{$font}");
        }

        //获取文字信息
        $info = imagettfbbox($size, $angle, $font, $text);
        $minx = min($info[0], $info[2], $info[4], $info[6]);
        $maxx = max($info[0], $info[2], $info[4], $info[6]);
        $miny = min($info[1], $info[3], $info[5], $info[7]);
        $maxy = max($info[1], $info[3], $info[5], $info[7]);

        /* 计算文字初始坐标和尺寸 */
        $x = $minx;
        $y = abs($miny);
        $w = $maxx - $minx;
        $h = $maxy - $miny;

        /* 设定文字位置 */
        switch ($locate) {
            /* 右下角文字 */
            case THINKIMAGE_WATER_SOUTHEAST:
                $x += $this->info['width'] - $w;
                $y += $this->info['height'] - $h;
                break;

            /* 左下角文字 */
            case THINKIMAGE_WATER_SOUTHWEST:
                $y += $this->info['height'] - $h;
                break;

            /* 左上角文字 */
            case THINKIMAGE_WATER_NORTHWEST:
                // 起始坐标即为左上角坐标，无需调整
                break;

            /* 右上角文字 */
            case THINKIMAGE_WATER_NORTHEAST:
                $x += $this->info['width'] - $w;
                break;

            /* 居中文字 */
            case THINKIMAGE_WATER_CENTER:
                $x += ($this->info['width'] - $w) / 2;
                $y += ($this->info['height'] - $h) / 2;
                break;

            /* 下居中文字 */
            case THINKIMAGE_WATER_SOUTH:
                $x += ($this->info['width'] - $w) / 2;
                $y += $this->info['height'] - $h;
                break;

            /* 右居中文字 */
            case THINKIMAGE_WATER_EAST:
                $x += $this->info['width'] - $w;
                $y += ($this->info['height'] - $h) / 2;
                break;

            /* 上居中文字 */
            case THINKIMAGE_WATER_NORTH:
                $x += ($this->info['width'] - $w) / 2;
                break;

            /* 左居中文字 */
            case THINKIMAGE_WATER_WEST:
                $y += ($this->info['height'] - $h) / 2;
                break;

            default:
                /* 自定义文字坐标 */
                if (is_array($locate)) {
                    list($posx, $posy) = $locate;
                    $x += $posx;
                    $y += $posy;
                } else {
                    throw new Exception('不支持的文字位置类型');
                }
        }

        /* 设置偏移量 */
        if (is_array($offset)) {
            $offset        = array_map('intval', $offset);
            list($ox, $oy) = $offset;
        } else {
            $offset = intval($offset);
            $ox     = $oy     = $offset;
        }

        /* 设置颜色 */
        if (is_string($color) && 0 === strpos($color, '#')) {
            $color = str_split(substr($color, 1), 2);
            $color = array_map('hexdec', $color);
            if (empty($color[3]) || $color[3] > 127) {
                $color[3] = 0;
            }
        } elseif (!is_array($color)) {
            throw new Exception('错误的颜色值');
        }

        do {
            /* 写入文字 */
            $col = imagecolorallocatealpha($this->im, $color[0], $color[1], $color[2], $color[3]);
            imagettftext($this->im, $size, $angle, $x + $ox, $y + $oy, $col, $font, $text);
        } while (!empty($this->gif) && $this->gifNext());
        return $this;
    }
public function text($text, $font, $size, $color = '#00000000',
        $locate = THINKIMAGE_WATER_SOUTHEAST, $offset = 0, $angle = 0) {
        //资源检测
        if (empty($this->im)) {
            throw new Exception('没有可以被写入文字的图像资源');
        }

        if (!is_file($font)) {
            throw new Exception("不存在的字体文件：{$font}");
        }

        //获取文字信息
        $info = imagettfbbox($size, $angle, $font, $text);
        $minx = min($info[0], $info[2], $info[4], $info[6]);
        $maxx = max($info[0], $info[2], $info[4], $info[6]);
        $miny = min($info[1], $info[3], $info[5], $info[7]);
        $maxy = max($info[1], $info[3], $info[5], $info[7]);

        /* 计算文字初始坐标和尺寸 */
        $x = $minx;
        $y = abs($miny);
        $w = $maxx - $minx;
        $h = $maxy - $miny;

        /* 设定文字位置 */
        switch ($locate) {
            /* 右下角文字 */
            case THINKIMAGE_WATER_SOUTHEAST:
                $x += $this->info['width'] - $w;
                $y += $this->info['height'] - $h;
                break;

            /* 左下角文字 */
            case THINKIMAGE_WATER_SOUTHWEST:
                $y += $this->info['height'] - $h;
                break;

            /* 左上角文字 */
            case THINKIMAGE_WATER_NORTHWEST:
                // 起始坐标即为左上角坐标，无需调整
                break;

            /* 右上角文字 */
            case THINKIMAGE_WATER_NORTHEAST:
                $x += $this->info['width'] - $w;
                break;

            /* 居中文字 */
            case THINKIMAGE_WATER_CENTER:
                $x += ($this->info['width'] - $w) / 2;
                $y += ($this->info['height'] - $h) / 2;
                break;

            /* 下居中文字 */
            case THINKIMAGE_WATER_SOUTH:
                $x += ($this->info['width'] - $w) / 2;
                $y += $this->info['height'] - $h;
                break;

            /* 右居中文字 */
            case THINKIMAGE_WATER_EAST:
                $x += $this->info['width'] - $w;
                $y += ($this->info['height'] - $h) / 2;
                break;

            /* 上居中文字 */
            case THINKIMAGE_WATER_NORTH:
                $x += ($this->info['width'] - $w) / 2;
                break;

            /* 左居中文字 */
            case THINKIMAGE_WATER_WEST:
                $y += ($this->info['height'] - $h) / 2;
                break;

            default:
                /* 自定义文字坐标 */
                if (is_array($locate)) {
                    list($posx, $posy) = $locate;
                    $x += $posx;
                    $y += $posy;
                } else {
                    throw new Exception('不支持的文字位置类型');
                }
        }

        /* 设置偏移量 */
        if (is_array($offset)) {
            $offset        = array_map('intval', $offset);
            list($ox, $oy) = $offset;
        } else {
            $offset = intval($offset);
            $ox     = $oy     = $offset;
        }

        /* 设置颜色 */
        if (is_string($color) && 0 === strpos($color, '#')) {
            $color = str_split(substr($color, 1), 2);
            $color = array_map('hexdec', $color);
            if (empty($color[3]) || $color[3] > 127) {
                $color[3] = 0;
            }
        } elseif (!is_array($color)) {
            throw new Exception('错误的颜色值');
        }

        do {
            /* 写入文字 */
            $col = imagecolorallocatealpha($this->im, $color[0], $color[1], $color[2], $color[3]);
            imagettftext($this->im, $size, $angle, $x + $ox, $y + $oy, $col, $font, $text);
        } while (!empty($this->gif) && $this->gifNext());
        return $this;
    }
public function text ( $ text , $ font , $ size , $ color = '#00000000' , $ locate = THINKIMAGE_WATER_SOUTHEAST , $ offset = 0 , $ angle = 0 ) { //资源检测 if ( empty ( $ this -> im ) ) { throw new Exception ( '没有可以被写入文字的图像资源'); } if ( ! is_file ( $ font ) ) { throw new Exception ( "不存在的字体文件：{$font}"); } //获取文字信息 $ info = imagettfbbox ( $ size , $ angle , $ font , $ text ) ; $ minx = min ( $ info [ 0 ] , $ info [ 2 ] , $ info [ 4 ] , $ info [ 6 ] ) ; $ maxx = max ( $ info [ 0 ] , $ info [ 2 ] , $ info [ 4 ] , $ info [ 6 ] ) ; $ miny = min ( $ info [ 1 ] , $ info [ 3 ] , $ info [ 5 ] , $ info [ 7 ] ) ; $ maxy = max ( $ info [ 1 ] , $ info [ 3 ] , $ info [ 5 ] , $ info [ 7 ] ) ; /* 计算文字初始坐标和尺寸 */ $ x = $ minx ; $ y = abs ( $ miny ) ; $ w = $ maxx - $ minx ; $ h = $ maxy - $ miny ; /* 设定文字位置 */ switch ( $ locate ) { /* 右下角文字 */ case THINKIMAGE_WATER_SOUTHEAST : $ x += $ this -> info [ 'width' ] - $ w ; $ y += $ this -> info [ 'height' ] - $ h ; break ; /* 左下角文字 */ case THINKIMAGE_WATER_SOUTHWEST : $ y += $ this -> info [ 'height' ] - $ h ; break ; /* 左上角文字 */ case THINKIMAGE_WATER_NORTHWEST : // 起始坐标即为左上角坐标，无需调整 break ; /* 右上角文字 */ case THINKIMAGE_WATER_NORTHEAST : $ x += $ this -> info [ 'width' ] - $ w ; break ; /* 居中文字 */ case THINKIMAGE_WATER_CENTER : $ x += ( $ this -> info [ 'width' ] - $ w ) / 2 ; $ y += ( $ this -> info [ 'height' ] - $ h ) / 2 ; break ; /* 下居中文字 */ case THINKIMAGE_WATER_SOUTH : $ x += ( $ this -> info [ 'width' ] - $ w ) / 2 ; $ y += $ this -> info [ 'height' ] - $ h ; break ; /* 右居中文字 */ case THINKIMAGE_WATER_EAST : $ x += $ this -> info [ 'width' ] - $ w ; $ y += ( $ this -> info [ 'height' ] - $ h ) / 2 ; break ; /* 上居中文字 */ case THINKIMAGE_WATER_NORTH : $ x += ( $ this -> info [ 'width' ] - $ w ) / 2 ; break ; /* 左居中文字 */ case THINKIMAGE_WATER_WEST : $ y += ( $ this -> info [ 'height' ] - $ h ) / 2 ; break ; default : /* 自定义文字坐标 */ if ( is_array ( $ locate ) ) { list ( $ posx , $ posy ) = $ locate ; $ x += $ posx ; $ y += $ posy ; } else { throw new Exception ( '不支持的文字位置类型'); } } /* 设置偏移量 */ if ( is_array ( $ offset ) ) { $ offset = array_map ( 'intval' , $ offset ) ; list ( $ ox , $ oy ) = $ offset ; } else { $ offset = intval ( $ offset ) ; $ ox = $ oy = $ offset ; } /* 设置颜色 */ if ( is_string ( $ color ) && 0 === strpos ( $ color , '#' ) ) { $ color = str_split ( substr ( $ color , 1 ) , 2 ) ; $ color = array_map ( 'hexdec' , $ color ) ; if ( empty ( $ color [ 3 ] ) || $ color [ 3 ] > 127 ) { $ color [ 3 ] = 0 ; } } elseif ( ! is_array ( $ color ) ) { throw new Exception ( '错误的颜色值'); } do { /* 写入文字 */ $ col = imagecolorallocatealpha ( $ this -> im , $ color [ 0 ] , $ color [ 1 ] , $ color [ 2 ] , $ color [ 3 ] ) ; imagettftext ( $ this -> im , $ size , $ angle , $ x + $ ox , $ y + $ oy , $ col , $ font , $ text ) ; } while ( ! empty ( $ this -> gif ) && $ this -> gifNext ( ) ) ; return $ this ; }
图像添加文字

@param  string  $text   添加的文字
@param  string  $font   字体路径
@param  integer $size   字号
@param  string  $color  文字颜色
@param int      $locate 文字写入位置
@param  integer $offset 文字相对当前位置的偏移量
@param  integer $angle  文字倾斜角度

@return $this
@throws Exception
图像添加文字