Hex2RGB('#'.$bc); $fc = $this->Hex2RGB('#'.$fc); $text_color = imagecolorallocate($im,$fc['r'],$fc['g'],$fc['b']); $background_color = imagecolorallocate($im,$bc['r'],$bc['g'],$bc['b']); $default_color = imagecolorallocate($im,5,5,5); //绘制矩形图片 imagefilledrectangle($im , 0, 0, $width-1 , $height-1 , $background_color); //填充 // imagefilledrectangle($im , 0, 0, $width-1 , $height-1 , $default_color); //填充 // imagerectangle($im , 0, 0, $width-1 , $height-1, $text_color); //边框 //添加文字 $text = isset($_HI['post']['text']) ? trim($_HI['post']['text']) :(isset($_HI['get']['text']) ? trim($_HI['get']['text']) :''); $text = !($text) ? '' : html_entity_decode($text); // imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text ); // 图片源;字体尺寸,文字方向,0从左至右,90从一至下;x、y,首字符起点位置,左下角坐标;color颜色索引。使用负的颜色索引值具有关闭防锯齿的效果;fontfile字体文件 // imagettftext($im,10,0,$width/2,$height/2,$text_color,"/fonts/STHeiti Medium.ttc","☆"); //中心位置标记 $strlen = mb_strlen($text); //字符数(中文算1个字符) //BUG 180430 只输入一个字时,部分情况报错(中,0,1,`);无字符输入时报错 if($strlen==0){ imagettftext($im,10,0,$width/2-1,$height/2-1,$default_color,"/fonts/STHeiti Medium.ttc","☆"); //中心位置标记 }else{ //文字方向 $fd = isset($_HI['post']['fd']) ? intval($_HI['post']['fd']) :(isset($_HI['get']['fd']) ? intval($_HI['get']['fd']) : -1); if($fd==-1){ if($width<$height){ $fd = 270; }else{ $fd = 0; } } $dstyle=1; //文本框长度以矩形长为限 // $dstyle=2; //文本框长度以矩形宽为限 if($dstyle==1){ $long = max($width,$height); //长 $short = min($width,$height); //短 $fd = ($width<$height) ? 270 : $fd; }else{ $long = $width; $short = $height; //短 } //设置文字大小及位置、方向等 $size_l = round($long/$strlen,2)-0.01; $size_l = intval($long/$strlen); $size_s = round($short/3,2)-0.01; $size_s = intval($short/3); $size = min($size_l,$size_s); //每个字的框宽限制 $f_w = imagefontwidth(6); $f_h = imagefontheight(6); $fontsize = intval(($size-$f_w)/1.2); //字体大小 $text_w = $f_w; if($strlen>1){ for($i=0;$i<$strlen;$i++){ $t = mb_substr($text, $i, 1, 'utf-8'); $len = strlen($t); if($len==3){ $text_w += $fontsize+$f_w; }elseif($len==2){ $text_w += $fontsize*2/3; }elseif($len==1){ $text_w += $fontsize*2/3; } } $text_w = $text_w-$f_w; }else{ $text_w = $fontsize; } $p_l = $long/2 -$text_w/2; $p_l = intval($p_l); $p_s = $short/2+$fontsize/2; //字符串底部-y轴高度 $p_s = intval($p_s); if($fd==90){ //90度时,右下角位置 $x = $p_s-$f_h; $y = $p_l+$text_w; }elseif($fd==270){ //270度时,左上角位置 $x = $short/2-$fontsize/2; $y = $p_l+$f_w; }else{ //0度时,左下角位置 $x = ($strlen==1) ? $p_l-$f_w : $p_l-$fontsize/2+2*$f_w; $y = $p_s-$f_h; } // var_dump('文本:'.$text);var_dump('字数:'.$strlen);var_dump('字框宽度:'.$size);var_dump('字体大小:'.$fontsize);var_dump('字体宽度:'.$f_w);var_dump('字体高度:'.$f_h);var_dump('文本框总宽度:'.$text_w);var_dump('字符X轴位置:'.$x);var_dump('字符Y轴位置:'.$y);var_dump('文字方向:'.$fd);die(); imagettftext($im,$fontsize,$fd,$x+1,$y+1,$default_color,"/fonts/Arial Unicode.ttf",$text); imagettftext($im,$fontsize,$fd,$x,$y,$text_color,"/fonts/Arial Unicode.ttf",$text); } //生成图片 ob_clean(); // header("Content-type:image/jpeg;"); // imagejpeg($im,null,100); header("Content-type:image/png;"); imagepng($im); //在根目录下生成图片文件 // imagejpeg($im,"temp2.jpg",100); // imagepng($im,"temp2.png"); //释放内存 imagedestroy($im); } /** * RGB转 十六进制 * @param $rgb RGB颜色的字符串 如:rgb(255,255,255); * @return string 十六进制颜色值 如:#FFFFFF */ function RGB2Hex($rgb){ $regexp = "/^rgb\(([0-9]{0,3})\,\s*([0-9]{0,3})\,\s*([0-9]{0,3})\)/"; $re = preg_match($regexp, $rgb, $match); $re = array_shift($match); $hexColor = "#"; $hex = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'); for ($i = 0; $i < 3; $i++) { $r = null; $c = $match[$i]; $hexAr = array(); while ($c > 16) { $r = $c % 16; $c = ($c / 16) >> 0; array_push($hexAr, $hex[$r]); } array_push($hexAr, $hex[$c]); $ret = array_reverse($hexAr); $item = implode('', $ret); $item = str_pad($item, 2, '0', STR_PAD_LEFT); $hexColor .= $item; } return $hexColor; } /** * 十六进制 转 RGB */ function Hex2RGB($hexColor) { $color = str_replace('#', '', $hexColor); if (strlen($color) > 3) { $rgb = array( 'r' => hexdec(substr($color, 0, 2)), 'g' => hexdec(substr($color, 2, 2)), 'b' => hexdec(substr($color, 4, 2)) ); } else { $color = $hexColor; $r = substr($color, 0, 1) . substr($color, 0, 1); $g = substr($color, 1, 1) . substr($color, 1, 1); $b = substr($color, 2, 1) . substr($color, 2, 1); $rgb = array( 'r' => hexdec($r), 'g' => hexdec($g), 'b' => hexdec($b) ); } return $rgb; } /** * 生成图片 * @param array 参数,包括图片和文字 * @param string $filename 生成海报文件名,不传此参数则不生成文件,直接输出图片 * @return [type] [description] */ function createPoster($config=array(),$filename=""){ //如果要看报什么错,可以先注释调这个header if(empty($filename)) header("content-type: image/png"); $imageDefault = array( 'left'=>0, 'top'=>0, 'right'=>0, 'bottom'=>0, 'width'=>100, 'height'=>100, 'opacity'=>100 ); $textDefault = array( 'text'=>'', 'left'=>0, 'top'=>0, 'fontSize'=>32, //字号 'fontColor'=>'255,255,255', //字体颜色 'angle'=>0, ); $background = $config['background'];//海报最底层得背景 //背景方法 $backgroundInfo = getimagesize($background); $backgroundFun = 'imagecreatefrom'.image_type_to_extension($backgroundInfo[2], false); $background = $backgroundFun($background); $backgroundWidth = imagesx($background); //背景宽度 $backgroundHeight = imagesy($background); //背景高度 $imageRes = imageCreatetruecolor($backgroundWidth,$backgroundHeight); $color = imagecolorallocate($imageRes, 0, 0, 0); imagefill($imageRes, 0, 0, $color); // imageColorTransparent($imageRes, $color); //颜色透明 imagecopyresampled($imageRes,$background,0,0,0,0,imagesx($background),imagesy($background),imagesx($background),imagesy($background)); //处理了图片 if(!empty($config['image'])){ foreach ($config['image'] as $key => $val) { $val = array_merge($imageDefault,$val); $info = getimagesize($val['url']); $function = 'imagecreatefrom'.image_type_to_extension($info[2], false); if($val['stream']){ //如果传的是字符串图像流 $info = getimagesizefromstring($val['url']); $function = 'imagecreatefromstring'; } $res = $function($val['url']); $resWidth = $info[0]; $resHeight = $info[1]; //建立画板 ,缩放图片至指定尺寸 $canvas=imagecreatetruecolor($val['width'], $val['height']); imagefill($canvas, 0, 0, $color); //关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h) imagecopyresampled($canvas, $res, 0, 0, 0, 0, $val['width'], $val['height'],$resWidth,$resHeight); $val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']) - $val['width']:$val['left']; $val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']) - $val['height']:$val['top']; //放置图像 imagecopymerge($imageRes,$canvas, $val['left'],$val['top'],$val['right'],$val['bottom'],$val['width'],$val['height'],$val['opacity']);//左,上,右,下,宽度,高度,透明度 } } //处理文字 if(!empty($config['text'])){ foreach ($config['text'] as $key => $val) { $val = array_merge($textDefault,$val); list($R,$G,$B) = explode(',', $val['fontColor']); $fontColor = imagecolorallocate($imageRes, $R, $G, $B); $val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']):$val['left']; $val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']):$val['top']; imagettftext($imageRes,$val['fontSize'],$val['angle'],$val['left'],$val['top'],$fontColor,$val['fontPath'],$val['text']); } } //生成图片 if(!empty($filename)){ $res = imagejpeg ($imageRes,$filename,90); //保存到本地 imagedestroy($imageRes); if(!$res) return false; return $filename; }else{ imagejpeg ($imageRes); //在浏览器上显示 imagedestroy($imageRes); } } }