要上传到OSS的话需要先安装OSS 

composer require aliyuncs/oss-sdk-php

不啰嗦,直接贴代码(自己公司项目已上线保证可用)

(注:多张图片就再代码的$config 里面的image数组里多写一套配置,多种文字要合成的话也是多写一套配置, 在制作时候是通过循环处理没套配置的!)

class PostersController extends BaseController
{use User;//生成海报public function getPoster(Request $request){$params = $request->all();//海报参数验证$validatorOrders = Validator::make($params,Posters::$validate_rule,Posters::$message,Posters::$attributeNames);if($validatorOrders->fails()) {$errorMsg = $validatorOrders->messages()->first();return $this->error($errorMsg);}$params['title'] = str_replace(' ', '',removeEmoji($params['title']));$params['vice_title'] = removeEmoji(str_replace(' ', '',removeEmoji($params['vice_title'])));if(mb_strlen($params['title'],'UTF8')>9){return $this->error('标题不能超过9个字');}if(mb_strlen($params['vice_title'],'UTF8')>60){return $this->error('副标题不能超过60个字');}//获取海报信息$config = array('image'=>array(array('url'=>$params['code_image'],     //二维码地址'is_yuan'=>false,          //true图片圆形处理'stream'=>0,'left'=>-1,               //小于0为小平居中'top'=>0,                 //等于0时上下居中'right'=>0,'width'=>200,             //图像宽'height'=>200,            //图像高'opacity'=>100            //透明度),array('url'=>$params['logo_image'],     //头像地址'is_yuan'=>true,          //true图片圆形处理'stream'=>0,'left'=>90,               //小于0为小平居中'top'=>43,'right'=>0,'width'=>230,             //图像宽'height'=>71,            //图像高'opacity'=>100            //透明度),),'text'=>array(['text'=>$params['title'],            //文字内容'left'=>-1,                  //小于0为水平居中'top'=>254,'width'=>726,'fontSize'=>56,                  //字号'fontColor'=>'245,218,152',         //字体颜色'angle'=>0,'hang_size'=>46,                  //行高'fontPath'=>public_path('static/font/simkai.ttf'),     //字体文件],['text'=>$params['vice_title'],            //文字内容'left'=>132,                  //小于0为水平居中'top'=>379,'width'=>583,'fontSize'=>26,                  //字号'fontColor'=>'245,218,152',         //字体颜色'angle'=>0,'hang_size'=>20,                  //行高'fontPath'=>public_path('static/font/simkai.ttf'),     //字体文件],['text'=>$params['name'],            //文字内容'left'=>-1,                  //小于0为水平居中'top'=>865,'width'=>242,'fontSize'=>28,                  //字号'fontColor'=>'245,218,152',         //字体颜色'angle'=>0,'hang_size'=>27,                  //行高'fontPath'=>public_path('static/font/simkai.ttf'),     //字体文件],['text'=>$params['tel'],            //文字内容'left'=>-1,                  //小于0为水平居中'top'=>929,'width'=>242,'fontSize'=>24,                  //字号'fontColor'=>'245,218,152',         //字体颜色'angle'=>0,'hang_size'=>19,                  //行高'fontPath'=>public_path('static/font/simkai.ttf'),     //字体文件],['text'=>$params['address'],            //文字内容'left'=>-1,                  //小于0为水平居中'top'=>973,'width'=>242,'fontSize'=>24,                  //字号'fontColor'=>'245,218,152',         //字体颜色'angle'=>0,'hang_size'=>29,                  //行高'fontPath'=>public_path('static/font/simkai.ttf'),     //字体文件],),'background'=>'https://qunxianghui-mall-upload.oss-cn-hangzhou.aliyuncs.com/upload/image/20190410/0311f58b024472485f3d7c24e0541926.png', //背景图);$filename = public_path().'/liwei'.time().'.jpg';//$filename为空是直接浏览器显示图片
//        $poster_img = PoserService::createPoster($config);$poster_img = PoserService::createPoster($config,$filename);if($poster_img){$params['image'] = $poster_img;$params['user_id'] = $this->user_id;$params['store_id'] = $this->store_id;$params['created_at'] = time();$params['updated_at'] = time();$res = Posters::create($params);if($res){return $this->success('制作成功',$params);}else{return $this->success('制作失败');}}else{return $this->success('制作失败');}}
}

上面用到我封装的服务里面的代码,继续贴代码

<?php
/*** Created by PhpStorm.* User: liwei* Date: 2019/4/9* Time: 17:17*/namespace App\Services;
use OSS\OssClient;
use OSS\Core\OssException;
use DB;
use Exception;class Poster
{/*** 生成宣传海报* @param array  /包括图片和文字* @param string  $filename 生成海报文件名,不传此参数则不生成文件,直接输出图片* @return [type] [description]*/public static function createPoster($config = array() , $filename = ""){//如果要看报什么错,可以先注释调这个headerif(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,'width'=>0,'fontSize' => 32, //字号'fontColor' => '255,255,255', //字体颜色'angle' => 0,'hang_size'=>10,                  //行高);$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'];$val['top'] = $val['top'] ==0 ? ceil($backgroundHeight- $val['height'])/2 : $val['top'];//放置图像imagecopymerge($imageRes, $canvas, $val['left'], $val['top'], $val['right'], $val['bottom'], $val['width'], $val['height'], $val['opacity']); //左,上,右,下,宽度,高度,透明度}}//处理文字if (!empty($config['text'])) {$text_image ='';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'];$pos=["color" => [$R, $G, $B],'top'=> $val['top'],'angle' => 0,'fontSize'=> $val['fontSize'],'str_width'=> $val['width'],'back_width'=> $backgroundInfo[0],'left'=> $val['left'],'hangSize'=> $val['hang_size'],'fontPath'=>  $val['fontPath']];Poster::draw_txt_to($imageRes,$pos,$val['text'],true); // 自动换行处理
//                imagettftext($imageRes, $val['fontSize'], $val['angle'], $val['left'], $val['top'], $fontColor, $val['fontPath'], $val['text']);}}//生成图片if (!empty($filename)) {$res = imagejpeg($imageRes, $filename, 90); //保存到本地if (!$res){return false;}$ossFileName = 'upload/image/' . date("Ymd") . '/' . sha1(date('YmdHis', time()) . uniqid()) .'.jpg';try {$config = config('app.aliyun_oss');//实例化对象 将配置传入$ossClient = new OssClient($config['KeyId'], $config['KeySecret'], $config['Endpoint']);//这里是有sha1加密 生成文件名 之后连接上后缀$result = $ossClient->uploadFile($config['Bucket'], $ossFileName, $filename);$arr = ['oss_url' => $result['info']['url'],  //上传资源地址'relative_path' => $ossFileName     //数据库保存名称(相对路径)];} catch (OssException $e) {return $e->getMessage();}finally {imagedestroy($imageRes);unlink($filename);}return $arr['oss_url'];} else {header("Content-type:image/png");imagejpeg($imageRes); //在浏览器上显示imagedestroy($imageRes);}}public static function draw_txt_to($card, $pos, $str){$str_top = $pos["top"];$angle = $pos["angle"];$fontsize = $pos["fontSize"];$str_width = $pos['str_width'];$back_width = $pos['back_width'];$margin_left = $pos["left"];$hang_size = $pos["hangSize"];$temp_string ='';$font_file = $pos["fontPath"];  //字体$tp = 0;$font_color = imagecolorallocate($card, $pos["color"][0], $pos["color"][1], $pos["color"][2]);// 参数分别是 字体大小, 角度, 字体名称, 字符串, 预设宽度$content = "";// 将字符串拆分成一个个单字 保存到数组 letter 中preg_match_all("/./u", $str, $arr);$letter = $arr[0];foreach($letter as $l) {$teststr = $content.$l;$testbox = imagettfbbox($fontsize, $angle, $font_file, $teststr);if (($testbox[2] > $str_width) && ($content !== "")) {$content .= PHP_EOL;}$content .= $l;}$textbox = imagettfbbox($fontsize, $angle, $font_file,$content);$txt_height = $textbox[0]-$textbox[7];$text_width = $textbox[2]-$textbox[0];$x = ($back_width - $text_width) / 2; //文字居中$y = $str_top+$txt_height+14; // 加9为调整行距imagettftext($card, $fontsize, $angle, $x, $y, $font_color, $font_file, $content);}/*** 文字自动换行算法* @param $card 画板* @param $pos 数组,top距离画板顶端的距离,fontsize文字的大小,width宽度,left距离左边的距离,hang_size行高* @param $str 要写的字符串* @param $iswrite  是否输出,true,  花出文字,false只计算占用的高度* @return int 返回整个字符所占用的高度*/public static function is_firstfuhao($str){$fuhaos = array("\"", "“", "'", "<", "《",);return in_array($str, $fuhaos);}

php 制作生成海报 图片合成 文字合成 上传到OSS相关推荐

  1. thinkphp6,压缩图片内存,并上传到oss,质量影响不大。

    首先安装官方推荐的上传云端插件 Thans / thinkphp-filesystem-cloud 1采用composer安装 composer require thans/thinkphp-file ...

  2. cesium实现图片与文字合成新图标

    文章目录 1.实现效果 2.实现方法 2.1背景 2.2思路 2.3实现 Cesium实战系列文章总目录: 传送门 1.实现效果 2.实现方法 2.1背景 在Cesium项目开发过程中,需要使用点聚合 ...

  3. PHP将图片和文字合成到一张背景图上

    PHP将图片和文字合成到一张背景图上 /*** 将两张图片合成一张* $bg_path 背景图地址* $poster 图片2* $x 图片2在背景图片上位置的左边距,单位:px (例:436)* $y ...

  4. uniapp canvas 图片加上文字合成一张新图并保存到手机相册

    uniapp canvas 图片加上文字合成一张新图并保存到手机相册 背景图上是奖章徽章,中间加上自定义文本,我这个图是因为背景图上原来就有字,随便找的,所以跟我写的文字层叠了 具体实现代码 < ...

  5. php 图片与文字合成,PHP图片和文字合成

    昨天接到一个PHP项目,其中有个小功能:PHP图片和文字合成,如下需求和代码: 将上一页传递过来的姓名.性别.服务时长,合成到当前页面的图片上. //处理 $name = empty($name) ? ...

  6. 怎么在线制作手机海报图片?

    很多人认为自己不懂设计,不会使用设计工具,就无法制作手机海报,但当下很多在线设计平台的出现,让很多不懂设计的人群也能轻松制作海报,在标小智Logo官网下,大家可以随意添加一张图片,然后一键制作成手机海 ...

  7. html生成海报图片

    html生成海报图片 效果图(源码下载地址在文章底部) html源码: 需要引入的js文件: 手机在线演示: 源码下载:https://xson.cc/?page=1 效果图(源码下载地址在文章底部) ...

  8. uniapp中自定义生成海报图片

    uniapp中自定义生成海报图片 效果示例图 效果示例图 ##代码块 <template><view class="cardPoster-wrap">< ...

  9. vue+flask实现视频合成(拖拽上传)

    vue+flask实现视频合成 效果如下 欢迎访问博客代码哈士奇 技术 聊天 交流群 974178910 前端交流群 535620886 vue+flask实现视频合成 拖拽上传我们之前一个文章有写过 ...

最新文章

  1. android与mysql数据库同步_android开发 如何通过web服务器访问MYSQL数据库并且使其数据同步到android SQLite数据库?...
  2. yii2 gradview 输出当前时间和图片
  3. 强化学习与深度,神经网络的结合随记
  4. ITK:平方每个像素
  5. JavaScript对象、JSON对象、JSON字符串的区别
  6. 【ES6(2015)】Proxy
  7. bootstrap-自定义导航栏隐藏参数@screen-sm
  8. python自动获取北京时间_python实现定时同步本机与北京时间的方法
  9. Atitit.数据库新特性战略规划 mssql sql server 2008 SQL2012 SQL2014
  10. js中 push pop shift unshift使用的小问题
  11. OPENGL回归原点
  12. 我的世界服务器连接显示不见了,我的世界服务器为什么进去就卡,然后几十秒后显示“连接已丢失”怎么? 爱问知识人...
  13. 编码:隐匿在计算机软硬件背后的语言(2)--二进制
  14. mysql报08S01的错误- SQL Error: 0, SQLState: 08S01 偶发
  15. mix2s android p,待遇堪比“亲儿子” 小米MIX 2s迎来Android P升级
  16. MicroKMS神龙版
  17. 小程序中关于敏感词汇检测
  18. Web重构之道 大漠
  19. 程序员应具备的素质-拨乱反正篇(转)
  20. 爬虫——网站模拟登录

热门文章

  1. 全网最详细 Spring Cloud 入门总结
  2. 商业Wi-Fi:4G时代的垃圾
  3. mybatis学习之高级映射
  4. Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?
  5. Android实现简单的闹钟
  6. python 输出字符串中首字母为h到z_Python字符串
  7. Binary Cross Entropy
  8. JIL Widget打包
  9. Python 头像上右下角添加小红旗
  10. 学会这个方法,tf卡数据恢复非难事!