zoukankan      html  css  js  c++  java
  • 粗略写了使用GD2制作文字图像demo

    项目要求宽,高为传入参数;文字大小,文字间隔需要自动调节;

    由于imagettftext()函数写入文字坐标点不以画布左上角为原点,而是根据文字的字体类型,字体大小,中英文,标点等因素变换(测试多组数据,Y轴0坐标点位于一个字体宽度左右位置),所以文字居中问题还未得到解决;

    由于文字坐标

    <?php
    class Index
    {
    private $config = array(
    'width' => '160',
    'height' => '90',
    'frame' => '0.05',

    // 默认背景色红色,字体白色
    'imageColor' => array(220,20,60,0),
    'fontColor' => array(255,255,255,0),

    'extend' => array(
    'fontType' => 'c:/windows/fonts/simhei.ttf', // 字体类型
    ),
    );

    public function newimage($text = '测试',$options = array())
    {
    header("Content-type: text/html; charset=utf-8");

    $options = $_GET;

    $text = $_GET['text'];


    $this->config = array_merge($this->config,$options);

    $location = array(0,0,0);

    $imageColor = $this->config['imageColor'];
    $fontColor = $this->config['fontColor'];

    $width = $this->config['width'];
    $height = $this->config['height'];

    //处理中英,标点计算字符长度
    $strlength = $this->utf8_strlen($text);

    // 计算边框长度
    $padding = $this->config['frame'];

    if( $padding < 0.5 )
    {
    // 百分比 以短边为标准计算padding
    $padding = $height*$padding*2;
    }
    else
    {
    $padding = $padding*2;
    }

    // 去掉边框的有效长度
    $width_1 = $width-$padding;
    $height_1 = $height-$padding;

    // 判断单个字体长度和高的大小
    if( $strlength >=1 )
    {
    $oneBox = $width_1/$strlength;
    }
    else
    {
    exit('字符不能为空');
    }

    if( $oneBox > $height_1 )
    {
    $oneBox = $height_1;

    if( $strlength <=1 )
    {
    // 一个字符
    $gap = 0;

    $location[1] = ($width - $oneBox)/2;
    }
    else
    {
    // 计算横向间距
    $gap = ($width_1 - ($oneBox*$strlength))/($strlength-1);

    $location[1] = $padding/2;
    }

    $location[2] = ($padding/2)+$oneBox;
    // $location[2] = ($height-($padding/2)+$oneBox)*0.5;
    }
    else
    {
    $gap = 0;

    $location[1] = $padding/2;

    // 计算纵向坐标Y
    $location[2] = (($height-$oneBox)/2)+$oneBox;
    // $location[2] = ($height-($padding/2)+$oneBox)*0.5;
    }

    // 字体磅数计算
    $size = 72*$oneBox/96;

    // 分割中文字体为数组
    $fontArr = preg_split('/(?<!^)(?!$)/u', $text );

    // 调试
    if($_GET['debug'] === 'true')
    {
    print_r('字符长度:'.$strlength . '<br/>');
    print_r('字符磅数:'.$size . '<br/>');

    print_r('单个字符:' . $oneBox . '<br/>');
    print_r('边距:' . $padding/2 . '<br/>');
    print_r('去掉边框的高度:' . $height_1 . '<br/>');

    var_dump($fontArr);
    exit();
    }

    $font = $this->config['extend']['fontType'];

    //创建空白图片的长 、高
    $img = imagecreate($width, $height);

    //给图片分配颜色
    imagecolorallocatealpha($img, $imageColor[0], $imageColor[1], $imageColor[2] ,$imageColor[3]);

    //设置字体颜色
    $color = imagecolorallocatealpha($img, $fontColor[0], $fontColor[1], $fontColor[2] ,$fontColor[3]);

    //将ttf文字写到图片中
    foreach ($fontArr as $key => $value)
    {
    imagettftext($img, $size, $location[0], $location[1]+($oneBox+$gap)*($key), $location[2], $color, $font, $value);

    // imagestring($img, 5, $location[1]+($oneBox+$gap)*($key), $location[2], $value,$color);
    }

    //发送头信息
    header('Content-Type: image/png');

    imagepng($img);

    imagedestroy($img);

    }

    // 计算中文字符串长度
    public function utf8_strlen($string = null)
    {
    // 将字符串分解为单元
    preg_match_all("/./us", $string, $match);
    // 返回单元个数
    return count($match[0]);
    }
    }

    $obj = new Index();

    $obj->newimage();

  • 相关阅读:
    UML/ROSE学习笔记系列二:UML的概念模型
    UML/ROSE学习笔记系列五:用况对过程的描述
    UML/ROSE学习笔记系列四:图
    SQLSERVER2005 的作业调度(非原创)
    ORACLE 和SQLSERVER 两表之间批量更新数据对比
    彻底领悟javascript中的exec与match方法(非原创)
    对象,对象集合的简单Xml序列化与反序列化(非原创)
    JIT是库存管理的发展趋势
    UML/ROSE学习笔记系列一:建模原理、概念
    C# 多线程与异步操作实现的探讨(非原创)
  • 原文地址:https://www.cnblogs.com/yokooo/p/7867268.html
Copyright © 2011-2022 走看看