PHP实现文字写入图片功能


Posted in PHP onFebruary 18, 2019

本文实例为大家分享了PHP实现文字写入图片的具体代码,供大家参考,具体内容如下

/**
 * PHP实现文字写入图片
 */
class wordsOnImg {
 
  public $config = null;
 
  /**
   * @param $config 传入参数
   * @param $config['file'] 图片文件
   * @param $config['size'] 文字大小
   * @param $config['angle'] 文字的水平角度
   * @param $config['fontfile'] 字体文件路径
   * @param $config['width'] 预先设置的宽度
   * @param $config['x'] 开始写入时的横坐标
   * @param $config['y'] 开始写入时的纵坐标
   */
  public function __construct($config=null){
    if(empty($config)){
      return 'must be config';
    }
    $fileArr = explode(".",$config['file']);
    $config['file_name'] = $fileArr[0];
    $config['file_ext'] = $fileArr[1];
    $this->config = $config;
  }
  /**
   * PHP实现图片上写入实现文字自动换行
   * @param $fontsize 字体大小
   * @param $angle 角度
   * @param $font 字体路径
   * @param $string 要写在图片上的文字
   * @param $width 预先设置图片上文字的宽度
   * @param $flag  换行时单词不折行
   */
  public function wordWrap($fontsize,$angle,$font,$string,$width,$flag=true) {
    $content = "";
    if($flag){
      $words = explode(" ",$string);
      foreach ($words as $key=>$value) {
        $teststr = $content." ".$value;
        $testbox = imagettfbbox($fontsize, $angle, $font, $teststr);
        //判断拼接后的字符串是否超过预设的宽度
        if(($testbox[2] > $width)) {
          $content .= "\n";
        }
        $content .= $value." ";
      }
    }else{
      //将字符串拆分成一个个单字 保存到数组 letter 中
      for ($i=0;$i<mb_strlen($string);$i++) {
        $letter[] = mb_substr($string, $i, 1);
      }
      foreach ($letter as $l) {
        $teststr = $content." ".$l;
        $testbox = imagettfbbox($fontsize, $angle, $font, $teststr);
        // 判断拼接后的字符串是否超过预设的宽度
        if (($testbox[2] > $width) && ($content !== "")) {
          $content .= "\n";
        }
        $content .= $l;
      }
    }
    return $content;
  }
 
  /**
   * 实现写入图片
   * @param $text 要写入的文字
   * @param $flag 是否直接输出到浏览器,默认是
   */
  public function writeWordsToImg($text,$flag=true){
    if(empty($this->config)){
      return 'must be config';
    }
    //获取图片大小
    $img_pathWH = getimagesize($this->config['file']);
    //打开指定的图片文件
    $im = imagecreatefrompng($this->config['file']);
    #设置水印字体颜色
    $color = imagecolorallocatealpha($im,0, 0, 255, 75);//蓝色
    $have = false;
    if(stripos($text,"<br/>")!== false){
      $have = true;
    }
    if($have){
      $words_text = explode("<br/>",$text);
      $words_text[0] = $this->wordWrap($this->config['size'], $this->config['angle'], $this->config['fontfile'], $words_text[0], $this->config['width']); //自动换行处理
      $words_text[1] = $this->wordWrap($this->config['size'], $this->config['angle'], $this->config['fontfile'], $words_text[1], $this->config['width']); //自动换行处理
      $words_text[2] = $this->wordWrap($this->config['size'], $this->config['angle'], $this->config['fontfile'], $words_text[2], $this->config['width']); //自动换行处理
      imagettftext($im, $this->config['size'], $this->config['angle'], $this->config['x'], $this->config['y'], $color, $this->config['fontfile'], $words_text[0]);
      imagettftext($im, $this->config['size'], $this->config['angle'], $this->config['x'], $this->config['y']+30, $color, $this->config['fontfile'], "  ".$words_text[1]);
      imagettftext($im, $this->config['size'], $this->config['angle'], $img_pathWH[0]/2+70, $img_pathWH[1]-80, $color, $this->config['fontfile'], $words_text[2]);
      if($flag){
        header("content-type:image/png");
        imagepng($im);
        imagedestroy($im);
      }
      imagepng($im,$this->config['file_name'].'_1.'.$this->config['file_ext']);
      imagedestroy($im);
    }
    $words_text = $this->wordWrap($this->config['size'], $this->config['angle'], $this->config['fontfile'], $text, $this->config['width']); //自动换行处理
    imagettftext($im, $this->config['size'], $this->config['angle'], $this->config['x'], $this->config['y'], $color, $this->config['fontfile'], $words_text);
    if($flag){
      header("content-type:image/png");
      imagepng($im);
      imagedestroy($im);
    }
    imagepng($im,$this->config['file_name'].'_1.'.$this->config['file_ext']);
    imagedestroy($im);
  }
}
 
$text = "Dear Kang<br/>If you can hold something up and put it down, it is called weight lifting;if you can hold something up but can never put it down, it's called bueden bearing. Pitifully, most of people are bearing heavy burdens when they are in love.\n\nBeing nice to someone you dislike doesn't mean you're a hypocritical people. It means you're mature enough to tolerate your dislike towards them.<br/>Mr. Kang";
 
$data = array(
  'file'=>'20171226152410.png',
  'size'=>12,
  'angle'=>0,
  'fontfile'=>'./Font/ChalkboardSE.ttc',
  'width'=>270,
  'x'=>20,
  'y'=>70
);
//使用
$wordsOnImgObj = new wordsOnImg($data);
$wordsOnImgObj->writeWordsToImg($text);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP数据库操作面向对象的优点
Oct 09 PHP
967 个函式
Oct 09 PHP
表单复选框向PHP传输数据的代码
Nov 13 PHP
PHP5+UTF8多文件上传类
Oct 17 PHP
php cookie的操作实现代码(登录)
Dec 29 PHP
PHP限制页面只能在微信自带浏览器访问的代码
Jan 15 PHP
php实现的美国50个州选择列表实例
Apr 20 PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 PHP
CI框架整合widget(页面格局)的方法
May 17 PHP
Thinkphp批量更新数据的方法汇总
Jun 29 PHP
php操作redis数据库常见方法实例总结
Feb 20 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
Dec 15 PHP
php分享朋友圈的实现代码
Feb 18 #PHP
php微信分享到朋友圈、QQ、朋友、微博
Feb 18 #PHP
php实现微信分享朋友链接功能
Feb 18 #PHP
PHP实现唤起微信支付功能
Feb 18 #PHP
thinkphp5使用无限极分类
Feb 18 #PHP
thinkphp5实现无限级分类
Feb 18 #PHP
php实现文章评论系统
Feb 18 #PHP
You might like
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
日常整理PHP中简单的图形处理(经典)
2015/10/26 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
根据表格中的某一列进行排序的javascript代码
2013/11/29 Javascript
jQuery 1.9移除了$.browser可以使用$.support来替代
2014/09/03 Javascript
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
Nodejs实现多人同时在线移动鼠标的小游戏分享
2014/12/06 NodeJs
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
vuejs如何配置less
2017/04/25 Javascript
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
对vue生命周期的深入理解
2020/12/03 Vue.js
python发布模块的步骤分享
2014/02/21 Python
跟老齐学Python之做一个小游戏
2014/09/28 Python
python 将print输出的内容保存到txt文件中
2018/07/17 Python
python画一个玫瑰和一个爱心
2020/08/18 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
2019/01/29 Python
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
实现向右循环移位
2014/07/31 面试题
实习生单位鉴定意见
2013/12/04 职场文书
给海归自荐信的建议
2013/12/13 职场文书
租房协议书怎么写
2014/04/10 职场文书
关于安全的广播稿
2014/10/23 职场文书
民主生活会主持词
2015/07/01 职场文书
Django 实现jwt认证的示例
2021/04/30 Python
Python实现随机生成迷宫并自动寻路
2021/06/13 Python
Sql Server之数据类型详解
2022/02/28 SQL Server