今天在开发中需要用到开发宣传海报 今天我发一下大概的方法
方法函数
/** * 生成宣传海报 * @param array 参数,包括图片和文字 * @param string $filename 生成海报文件名,不传此参数则不生成文件,直接输出图片 * @return [type] [description] */ function createPoster1($config = array() , $filename = "") { //如果要看报什么错,可以先注释调这个header //if(empty($filename)) header("content-type: image/png"); 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); 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); //如果是透明的gif或png做透明处理 $ext = pathinfo($val[\'url\']); if (array_key_exists(\'extension\',$ext)) { if ($ext[\'extension\'] == \'gif\' || $ext[\'extension\'] == \'png\') { imageColorTransparent($canvas, $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\']; //如果left小于-1我这做成了计算让其水平居中 if ($val[\'left\'] < 0) { $val[\'left\'] = ceil($backgroundWidth - $val[\'width\']) / 2; } $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\']; //如果left小于-1我这做成了计算让其水平居中 if ($val[\'left\'] < 0) { $fontBox = imagettfbbox($val[\'fontSize\'], 0, $val[\'fontPath\'], $val[\'text\']); //文字水平居中实质 $val[\'left\'] = ceil(($backgroundWidth - $fontBox[2]) / 2); //计算文字的水平位置 } $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 { header("Content-type:image/png"); imagejpeg($imageRes); //在浏览器上显示 imagedestroy($imageRes); } }
THINKPHP中使用
//生成海报 public function get_poster(){ $uid = $this->userInfo[\'uid\']; $qrInfo = QrcodeService::getTemporaryQrcode(\'spread\',$uid); //获取用户信息 $userinfo = WechatUser::where(\'uid\',$uid)->find()->toArray(); //dump($userinfo);die; //获取海报信息 $poster = Db::name(\'system_popover\')->where(\'id\',1)->find(); $config = array( \'image\'=>array( array( \'url\'=>$qrInfo[\'url\'], //二维码地址 \'is_yuan\'=>false, //true图片圆形处理 \'stream\'=>0, \'left\'=>-1, //小于0为小平居中 \'top\'=>735, \'right\'=>0, \'width\'=>250, //图像宽 \'height\'=>250, //图像高 \'opacity\'=>100 //透明度 ), array( \'url\'=>download_remote_pic($userinfo[\'headimgurl\']), //头像地址 \'is_yuan\'=>true, //true图片圆形处理 \'stream\'=>0, \'left\'=>-1, //小于0为小平居中 \'top\'=>532, \'right\'=>0, \'width\'=>132, //图像宽 \'height\'=>132, //图像高 \'opacity\'=>100 //透明度 ), ), \'text\'=>array( array( \'text\'=>$userinfo[\'nickname\'], //文字内容 \'left\'=>-1, //小于0为小平居中 \'top\'=>600, \'fontSize\'=>28, //字号 \'fontColor\'=>\'90,90,90\', //字体颜色 \'angle\'=>0, \'fontPath\'=>ROOT_PATH.\'public/static/font/simsunb.ttf\', //字体文件 ) ), \'background\'=>\'http://\'.$_SERVER[\'HTTP_HOST\'].$poster[\'background\'], //背景图 ); $filename = \'public/\'.time().\'.jpg\'; //echo createPoster($config); //$filename为空是真接浏览器显示图片 echo createPoster($config,$filename); }