源代码

<?php/**** @authors Your Name (you@example.org)* @date    2019-07-18 15:20:32* @version $Id$*/namespace App\Tools;class Poster
{/*** 生成宣传海报* @param array  参数,包括图片和文字* @param string  $filename 生成海报文件名,不传此参数则不生成文件,直接输出图片* @return [type] [description]*/public static function createPoster($config = array(), $filename = "", $ext = 'jpg'){//如果要看报什么错,可以先注释调这个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,'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);if ($ext == 'png') {imagealphablending($imageRes, false);imagesavealpha($imageRes, true);}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) {if ($val && is_array($val) && file_exists($val['url'])) {$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']);// v($function);$resWidth  = $info[0];$resHeight = $info[1];//建立画板 ,缩放图片至指定尺寸$canvas = imagecreatetruecolor($val['width'], $val['height']);//2.上色   //防止png透明背景变黑 $color = imagecolorallocate($canvas, 255, 255, 255);//3.设置透明 imagecolortransparent($canvas, $color);imagefill($canvas, 0, 0, $color);//设定图像的混色模式imagealphablending($res, true);//关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h)imagecopyresampled($canvas, $res, 0, 0, 0, 0, $val['width'], $val['height'], $resWidth, $resHeight);//圆形生成if ($val['is_circular'] == 1) {$canvas = self::markRound($canvas, $val['width'], $val['height']);}$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) {if ($val && is_array($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'];$tmplist         = self::autoLineSplit($val['text'], $val['fontPath'], $val['fontSize'], 'utf8', $val['width']);foreach ($tmplist as $k => $v) {$h = $val['top'] + $k * 30;imagettftext($imageRes, $val['fontSize'], $val['angle'], $val['left'], $h, $fontColor, $val['fontPath'], $v);}}}}//生成图片if (!empty($filename)) {switch ($ext) {case 'jpg':$res = imagejpeg($imageRes, $filename, 80); //保存到本地break;case 'png':$res = imagepng($imageRes, $filename, 7); //保存到本地break;}// var_dump($filename);imagedestroy($imageRes);if (!$res) {return false;}return $filename;} else {imagejpeg($imageRes); //在浏览器上显示imagedestroy($imageRes);}}//生成圆形图片public static function markRound($src_img, $w, $h){$img = imagecreatetruecolor($w, $h);//这一句一定要有imagesavealpha($img, true);//拾取一个完全透明的颜色,最后一个参数127为全透明$bg = imagecolorallocatealpha($img, 59, 105, 138, 127);imagefill($img, 0, 0, $bg);$r   = $w / 2; //圆半径$y_x = $r; //圆心X坐标$y_y = $r; //圆心Y坐标for ($x = 0; $x < $w; $x++) {for ($y = 0; $y < $h; $y++) {$rgbColor = imagecolorat($src_img, $x, $y);if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {imagesetpixel($img, $x, $y, $rgbColor);}}}return $img;}/** 绘图文字分行函数* by COoL* - 输入:* str: 原字符串* fontFamily: 字体* fontSize: 字号* charset: 字符编码* width: 限制每行宽度(px)* - 输出:* 分行后的字符串数组*/public static function autoLineSplit($str, $fontFamily, $fontSize, $charset, $width){$result = [];$len = (strlen($str) + mb_strlen($str, $charset)) / 2;// 计算总占宽$dimensions = imagettfbbox($fontSize, 0, $fontFamily, $str);$textWidth  = abs($dimensions[4] - $dimensions[0]);// 计算每个字符的长度$singleW = $textWidth / $len;// 计算每行最多容纳多少个字符$maxCount = floor($width / $singleW);while ($len > $maxCount) {// 成功取得一行$result[] = mb_strimwidth($str, 0, $maxCount, '', $charset);// 移除上一行的字符$str = str_replace($result[count($result) - 1], '', $str);// 重新计算长度$len = (strlen($str) + mb_strlen($str, $charset)) / 2;}// 最后一行在循环结束时执行$result[] = $str;return $result;}/*** 制作文本信息数据* @param type $param*/public static function toMarkTxt($name, $left = 0, $top = 0, $width = 400, $fontSize = 18, $fontColor = '0,0,0'){if ($name) {$font = base_path() . '/public/upload/app/poster/SourceHanSansCN_Normal.otf';$info = ['text'      => $name,'left'      => $left,'top'       => $top,'fontSize'  => $fontSize, //字号'fontColor' => $fontColor, //字体颜色'angle'     => 0,'width'     => $width,'fontPath'  => $font,];return $info;}return [];}/*** 制作文本信息数据* @param type $param*/public static function toMarkImg($imgUrl, $left = 0, $top = 0, $width = 300, $height = 200, $is_circular = 0){$info = ['url'         => $imgUrl,'left'        => $left,'top'         => $top,'right'       => 0,'bottom'      => 0,'width'       => $width,'height'      => $height,'opacity'     => 100,'is_circular' => $is_circular,];return $info;}/*** 制作货运合同*/public static function markHYHT($orderInfo, $qm1 = '', $qm2 = ''){# 背景信息$config['background'] = base_path() . '/public/upload/app/poster/hyht_1200.jpg';$order_sn = $orderInfo['order_sn'];$store_name    = $orderInfo['store_name'];$user_name     = $orderInfo['car_driver'];$goods_name    = $orderInfo['order_name'];$start_address = $orderInfo['line_start'] . $orderInfo['start_address'];$end_address   = $orderInfo['line_end'] . $orderInfo['end_address'];$car_sn        = $orderInfo['car_sn'];$car_type      = $orderInfo['car_type'];# 文字展示信息$nowDate        = date('Y-m-d', time());$txt[]          = self::toMarkTxt($store_name, 340, 370); //甲方$txt[]          = self::toMarkTxt($user_name, 340, 410, 400); //乙方$txt[]          = self::toMarkTxt($store_name, 320, 530); //$txt[]          = self::toMarkTxt($goods_name, 180, 570);$txt[]          = self::toMarkTxt($goods_name, 300, 650); //货物名$txt[]          = self::toMarkTxt('暂无', 765, 650); //货物价值$txt[]          = self::toMarkTxt("{$start_address}-{$end_address}", 355, 690, 700, 16); //起运地$txt[]          = self::toMarkTxt($car_sn, 280, 730); //车牌号$txt[]          = self::toMarkTxt($car_type, 745, 730); //车辆类型$txt[]          = self::toMarkTxt($store_name, 300, 1175); //甲方$txt[]          = self::toMarkTxt($nowDate, 300, 1220); //甲方日期$txt[]          = self::toMarkTxt($user_name, 815, 1175); //甲方$txt[]          = self::toMarkTxt($nowDate, 815, 1220); //甲方日期$txt            = array_filter($txt);$config['text'] = $txt;// # 签名展示信息// $qm1             = base_path() . '/public/upload/app/poster/qm1.jpg';// $qm2             = base_path() . '/public/upload/app/poster/qm2.jpg';if ($qm1) {$qm1     = base_path() . '/public' . $qm1;$image[] = self::toMarkImg($qm1, 180, 1280);}if ($qm2) {$qm2     = base_path() . '/public' . $qm2;$image[] = self::toMarkImg($qm2, 710, 1280);}$config['image'] = $image;$filePath        = base_path() . "/storage/app/uploads/poster/contract/{$order_sn}.jpg";if (file_exists($filePath)) {@unlink($filePath);}Poster::createPoster($config, $filePath);return "/uploads/poster/contract/{$order_sn}.jpg";}
}

php海报/合同图片生成类相关推荐

  1. 一个用BitMap类完成的网页随机码图片生成类

    using System; using System.Collections.Generic; using System.Text; using System.Drawing; using Syste ...

  2. 移动端电子签名,签名内容移动缩放,生成合同图片(uniapp)

    昨天在技术群里看到有人在问电子签名的需求,通过uniapp开发的app,需要实现的签名.签名图片的缩放.拖动.并且和合同一起生成图片.于是利用空闲时间来写了写这个功能. 先看下具体效果 签名,生成合同 ...

  3. 小程序中如何实现编辑海报内容并生成海报图片(拖动那种)

    开始找到了下面这个博客: 转自 胜天一子半 博客地址:https://blog.csdn.net/qq_37942845/article/details/80169907 在项目中遇到了一个需要编辑海 ...

  4. Linux 系统下生成的海报的图片显示不了中文 原来是因为这个啊 新的知识点^_^

    微信小程序端有关于一篇文章生成一张海报图片,用于用户保存之后分享,这个是我在上一篇的文章分享了关于在Java后台生成一张海报图片的文章.发布之后又遇到了新的问题现在分享给有需要的人.原因及解决方法:由 ...

  5. java captcha 验证码_验证码图片生成工具类——Captcha.java

    验证码图片生成工具,使用JAVA生成的图片验证码,调用getRandcode方法获取图片验证码,以流的方式传输到前端页面. import java.awt.Color; import java.awt ...

  6. 最全的C#图片处理类ImageHelper.cs

    [图片处理]最全的C#图片处理类ImageHelper.cs <a target=_blank href="http://bbs.cskin.net/forum.php?mod=vie ...

  7. thinkphp3.2与phpexcel带图片生成 完美案例

    thinkphp3.2与phpexcel完美案例 // 导出exlpublic function look_down(){$id = I('get.id');$m = M ('offer_goods' ...

  8. php图片是啥,php图片处理类(附实例)

    分享一个php实现的图片处理类,可以设置文字水印与图片水印等,有需要的朋友参考下. 本节分享一个图片处理类,简单实现了文字水印与图片水印,是学习php图片操作的小例子. 代码: image = new ...

  9. php实现数字英文验证码,PHP英文数字验证码生成类

    闲着没事干写着玩的.wamp下测试没问题.服务器没有测试,使用请自行测试.代码如下 /** * 验证码生成类 * date 2014年7月26日 星期六 */ session_start(); cla ...

最新文章

  1. 用户方式中线程的同步——Windows核心编程学习手札之八
  2. 资本主义的历史仍未终结(作者:袁剑)【转】
  3. 专家的修炼之路 —— 德雷福斯模型 Dreyfus
  4. 05.full_text match_bool_prefix match_phrase_prefix 查询
  5. Java Throwable setStackTrace()方法与示例
  6. 解决sublime3不能编辑插件default settings的问题
  7. Mysql8.0Mysql5.7Mysql5.6Mysql5.5特性对比
  8. RTX5 | 事件标志组01 - 创建事件标志组
  9. python语_Python 基本语法
  10. 终于解决 k8s 集群中部署 nodelocaldns 的问题
  11. 投行巨头金融科技战略——摩根士丹利财富管理转型之路篇
  12. HTML5 Notification实现浏览器通知
  13. zen-cart修改 zencart 模板修改
  14. 游戏开发学习路线——游戏引擎原理
  15. 根据项目或WBS结算规则批量生成下阶WBS的结算规则-CJB2
  16. 【WebService笔记01】使用JWS实现WebService接口的发布和调用
  17. Flutter高仿微信-第52篇-群聊-清空聊天记录
  18. 功能测试之电梯的测试用例【杭州多测师】【杭州多测师_王sir】
  19. Java Web应用开发实用教程,JavaWeb应用开发实用教程习题部分汇总
  20. 2.25嵌入式课程学习总结

热门文章

  1. LeetCode——桶的思想
  2. 绿幕虚拟直播,直播时代的风口
  3. 2021-09-02 Day17-JS-第七天 Web APIs和DOM
  4. 抓取检测之 End-to-end Trainable Deep Neural Network for Robotic Grasp Detection and Semantic Segmentation
  5. 择偶标准与黑名单了解一下
  6. 项目场景: gyp verb check python checking for Python executable python2 in the PATH
  7. java Spring IOC
  8. 如何在给虚拟机设置静态IP
  9. 出现腰肌劳损怎么办?治疗护理6步走,帮你摆脱痛苦
  10. springboot配置datasource连接与mapper.xml文件位置