zoukankan      html  css  js  c++  java
  • php 生成文字图片

    <?php
    class textPNG {
    	private $font = './MSYH.TTF'; // 默认字体. 相对于脚本存放目录的相对路径.
    	private $msg = "undefined"; // 默认文字.
    	private $width = ""; // 默认宽度.
    	private $size = 18;
    	private $rot = 0; // 旋转角度.
    	private $pad = 4.5; // 填充.
    	private $transparent = 1; // 文字透明度.
    	private $red = 0; // 在黑色背景中...
    	private $grn = 0;
    	private $blu = 0;
    	private $bg_red = 255; // 将文字设置为白色.
    	private $bg_grn = 255;
    	private $bg_blu = 255;
    	public function __construct($paras = array()) {
    		empty($paras) && $paras = $_GET;
    		isset($paras['text']) && $this->msg = $paras['text'];
    		isset($paras['font']) && $this->font = $paras['font'];
    		isset($paras['size']) && $this->size = $paras['size'];
    		isset($paras['rot']) && $this->rot = $paras['rot'];
    		isset($paras['pad']) && $this->pad = $paras['pad'];
    		isset($paras['tr']) && $this->transparent = $paras['tr'];
    		if (isset($paras['color']) && !empty($paras['color'])) {
    			$this_color_hex = HexToRGB($paras['color']);
    			$this->red = $this_color_hex['red']; // 文字颜色
    			$this->grn = $this_color_hex['green'];
    			$this->blu = $this_color_hex['blue'];
    		} else {
    			isset($paras['red']) && $this->red = $paras['red'];
    			isset($paras['grn']) && $this->grn = $paras['grn'];
    			isset($paras['blu']) && $this->blu = $paras['blu'];
    		}
    		if (isset($paras['bg_color']) && !empty($paras['bg_color'])) {
    			$bg_color_hex = HexToRGB($paras['bg_color']);
    			$this->bg_red = $bg_color_hex['red']; // 背景颜色.
    			$this->bg_grn = $bg_color_hex['green'];
    			$this->bg_blu = $bg_color_hex['blue'];
    		} else {
    			isset($paras['bg_red']) && $this->bg_red = $paras['bg_red'];
    			isset($paras['bg_grn']) && $this->bg_grn = $paras['bg_grn'];
    			isset($paras['bg_blu']) && $this->bg_blu = $paras['bg_blu'];
    		}
    		if (isset($paras['width']) && !empty($paras['width'])) {
    			$this->width = $paras['width'];
    			$this->msg = $this->autowrap($this->size, $this->font, $this->msg, $paras['width']);
    		} else {
    			$this->msg = $this->autowrap($this->size, $this->font, $this->msg);
    		}
    	}
    	public function draw() {
    		$width = 0;
    		$height = 0;
    		$offset_x = 0;
    		$offset_y = 0;
    		$bounds = array();
    		$image = "";
    		// 确定文字高度.
    		$bounds = ImageTTFBBox($this->size, $this->rot, $this->font, "W");
    		if ($this->rot < 0) {
    			$font_height = abs($bounds[7] - $bounds[1]);
    		} else if ($this->rot > 0) {
    			$font_height = abs($bounds[1] - $bounds[7]);
    		} else {
    			$font_height = abs($bounds[7] - $bounds[1]);
    		}
    		// 确定边框高度.
    		$bounds = ImageTTFBBox($this->size, $this->rot, $this->font, $this->msg);
    		if ($this->rot < 0) {
    			$width = abs($bounds[4] - $bounds[0]);
    			$height = abs($bounds[3] - $bounds[7]);
    			$offset_y = $font_height;
    			$offset_x = 0;
    		} else if ($this->rot > 0) {
    			$width = abs($bounds[2] - $bounds[6]);
    			$height = abs($bounds[1] - $bounds[5]);
    			$offset_y = abs($bounds[7] - $bounds[5]) + $font_height;
    			$offset_x = abs($bounds[0] - $bounds[6]);
    		} else {
    			$width = abs($bounds[4] - $bounds[6]);
    			$height = abs($bounds[7] - $bounds[1]);
    			$offset_y = $font_height;
    
    			$offset_x = 0;
    		}
    		if ($this->width) {
    			$image = imagecreate($this->width, $height + ($this->pad * 2) + 1);
    		} else {
    			$image = imagecreate($width + ($this->pad * 2) + 1, $height + ($this->pad * 2) + 1);
    		}
    
    		$background = ImageColorAllocate($image, $this->bg_red, $this->bg_grn, $this->bg_blu);
    		$foreground = ImageColorAllocate($image, $this->red, $this->grn, $this->blu);
    		if ($this->transparent) {
    			ImageColorTransparent($image, $background);
    		}
    
    		ImageInterlace($image, false);
    		// 画图.
    		ImageTTFText($image, $this->size, $this->rot, $offset_x + $this->pad, $offset_y + $this->pad, $foreground, $this->font, $this->msg);
    		// 输出为png格式.
    		Header("Content-type: image/png");
    		imagePNG($image);
    	}
    	// 自动调整宽度(字体大小, 字体名称, 字符串, 预设宽度, 角度)
    	public function autowrap($fontsize, $fontface, $string, $width = "", $angle = 0) {
    		// 将字符串拆分成一个个单字 保存到数组 letter 中
    		for ($i = 0; $i < mb_strlen($string); $i++) {
    			$letter[] = mb_substr($string, $i, 1, 'utf-8');
    		}
    		$letter = array_filter($letter);
    		$content = "";
    		for ($i = 0; $i < count($letter); $i++) {
    			// 换行处理
    			if ($letter[$i] == "/" && $letter[$i + 1] == "n") {
    				$content .= "
    ";
    				unset($letter[$i]);
    				unset($letter[$i + 1]);
    				continue;
    			}
    			if ($width) {
    				$teststr = $content . " " . $letter[$i];
    				$testbox = imagettfbbox($fontsize, $angle, $fontface, $teststr);
    				if (($testbox[2] > $width) && ($content !== "")) {
    					$content .= "
    ";
    				}
    			}
    			$content .= $letter[$i];
    		}
    		return $content;
    	}
    // Hex颜色转RGB颜色
    	public function HexToRGB($colour) {
    		if ($colour[0] == '#') {
    			$colour = substr($colour, 1);
    		}
    		if (strlen($colour) == 6) {
    			list($r, $g, $b) = array(
    				$colour[0] . $colour[1],
    				$colour[2] . $colour[3],
    				$colour[4] . $colour[5],
    			);
    		} elseif (strlen($colour) == 3) {
    			list($r, $g, $b) = array(
    				$colour[0] . $colour[0],
    				$colour[1] . $colour[1],
    				$colour[2] . $colour[2],
    			);
    		} else {
    			return false;
    		}
    		$r = hexdec($r);
    		$g = hexdec($g);
    		$b = hexdec($b);
    		return array(
    			'red' => $r,
    			'green' => $g,
    			'blue' => $b,
    		);
    	}
    }
    $png = new textPNG();
    $png->draw();
    ?>
    

      

  • 相关阅读:
    cocos2d-x 获得系统语言繁体
    状态机
    cocos2d-x 混合模式
    cocos2d-x 3.x 橡皮擦功能
    MySQL 库大小、表大小、索引大小查询命令
    MySQL批量杀进程
    多实例MySQL批量添加用户和密码并授权
    删除或清空具有外键约束的表数据报-ERROR 1701 (42000)
    ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'
    MySQL 多实例给root用户创建密码
  • 原文地址:https://www.cnblogs.com/yutaoyao/p/4286311.html
Copyright © 2011-2022 走看看