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 .= "\n"; 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 .= "\n"; } } $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(); ?>