~~~
public static function buildExpireImage($data=[],$title=''){
//图片左上角汇总说明数据,可为空
$table_explain = [
0 => '[日期]'.date('Y-m-d H:i:00'),
1 =>' ',
];
//表头信息
$table_header = [
"","表头1","表头2","表头3","表头4","表头5","表头6","表头7","日期","姓名"
];
//每个格子的宽度,可根据数据长度自定义
$field_width = ['60','100','100','130','550','120','120','120','120','120'];
$clo=[];
foreach ($data as $k=>$v){
if($v['expired_date']>=10){
$clo[] = ['x'=>2, 'y'=>$k+2];
}
}
//参数
$params = [
'rowy' => ['1'],
'clo' => $clo,
'row' => count($data), //数据的行数
'file_name' => time().rand(1000000,99999).'test.png', //保存的文件名
'title' => $title,
'table_time' => date("Y-m-d H:i:s"),
'data' => $data,
'table_explain' => $table_explain,
'table_header' => $table_header,
'field_width' => $field_width,
'file_path' => './upload/image/' //文件保存路径
];
//调用方法
return substr(self::create($params),1);
}
public static function create($params)
{
$base = [
'border' => 10,//图片外边框
'file_path' => $params['file_path'],//图片保存路径
'title_height' => 25,//报表名称高度
'title_font_size' => 16,//报表名称字体大小
'font_ulr' => root_path().'public/simkai.ttf',//字体文件路径
'text_size' => 12,//正文字体大小
'row_hight' => 30,//每行数据行高
'head_bg_rgb'=>!empty($params['head_bg_rgb'])?$params['head_bg_rgb']:[242,244,42]
];
list($head_red ,$head_green ,$head_blue)=$base['head_bg_rgb'];
$save_path = $base['file_path'] . $params['file_name'];
//如果表说明部分不为空,则增加表图片的高度
if(!empty($params['table_explain'])){
// $base['title_height'] = $base['title_height'] * count($params['table_explain']);
$base['title_height'] = $base['title_height'] * 2;
}
//计算图片总宽
$w_sum = $base['border'];
foreach ($params['field_width'] as $key => $value) {
//图片总宽
$w_sum += $value;
//计算每一列的位置
$base['column_x_arr'][$key] = $w_sum;
}
$base['img_width'] = $w_sum + $base['border'] * 2-$base['border'];//图片宽度
$base['img_height'] = ($params['row']+1) * $base['row_hight'] + $base['border'] * 2 + $base['title_height'];//图片高度
$border_top = $base['border'] + $base['title_height'];//表格顶部高度
$border_bottom = $base['img_height'] - $base['border'];//表格底部高度
$img = imagecreatetruecolor($base['img_width'], $base['img_height']);//创建指定尺寸图片
$bg_color = imagecolorallocate($img, 255,255,255);//设定图片背景色
$borderbg_color = imagecolorallocate($img, $head_red ,$head_green ,$head_blue);//设定图片背景色
$text_coler = imagecolorallocate($img, 0, 0, 0);//设定文字颜色
$border_coler = imagecolorallocate($img, 0, 0, 0);//设定边框颜色
imagefill($img, 0, 0, $bg_color);//填充图片背景色
//先填充一个黑色的大块背景
imagefilledrectangle($img, $base['border'], $base['border'] + $base['title_height'], $base['img_width'] - $base['border'], $base['img_height'] - $base['border'], $border_coler);//画矩形
//再填充一个小两个像素的 背景色区域,形成一个两个像素的外边框
imagefilledrectangle($img, $base['border'] + 2, $base['border'] + $base['title_height'] + 2, $base['img_width'] - $base['border'] - 2, $base['img_height'] - $base['border'] - 2, $bg_color);//画矩形
foreach($params['rowy'] as $r){
$startx = $base['border'] + 2 ;
$starty = $base['border'] + $base['title_height'] + 2+($r-1)*30;
$endx = $base['img_width'] - $base['border'] - 2;
$endy = $base['border'] + $base['title_height'] + 2 + $r*30;
imagefilledrectangle($img, $startx, $starty, $endx, $endy, $borderbg_color);//画矩形
}
$diy_border_color = [];
foreach($params['clo'] as $c){
if (!empty($c['rgb']) && !isset($diy_border_color[implode(',', $c['rgb'])])) {
$diy_border_color[implode(',', $c['rgb'])] = imagecolorallocate($img, $c['rgb'][0],$c['rgb'][1],$c['rgb'][2]);//设定图片背景色
}
$this_border = $borderbg_color;
!empty($c['rgb']) && $this_border = $diy_border_color[implode(',', $c['rgb'])];
$startx = $base['border'] + $base['column_x_arr'][$c['x']-2]-10 ;
$starty = $base['border'] + $base['title_height'] + 2+($c['y']-1)*30;
$endx = $base['border'] + $base['column_x_arr'][$c['x']-1]-10;
$endy = $base['border'] + $base['title_height'] + 2+($c['y'])*30-3;
imagefilledrectangle($img, $startx, $starty, $endx, $endy, $this_border);//画矩形
}
//画表格纵线 及 写入表头文字
$sum = $base['border'];
foreach($base['column_x_arr'] as $key => $x){
imageline($img, $x, $border_top, $x, $border_bottom,$border_coler);//画纵线
$this_title_box = imagettfbbox($base['text_size'], 0, $base['font_ulr'], $params['table_header'][$key]);
$title_x_len = $this_title_box[2] - $this_title_box[0];
imagettftext($img, $base['text_size'], 0, $sum + (($x-$sum)/2 - $title_x_len/2), $border_top + ($base['row_hight']+$base['text_size'])/2, $text_coler, $base['font_ulr'], $params['table_header'][$key]);//写入表头文字
$sum += $params['field_width'][$key];
}
//画表格横线
foreach($params['data'] as $key => $item){
$border_top += $base['row_hight'];
//画横线
imageline($img, $base['border'], $border_top, $base['img_width'] - $base['border'], $border_top, $border_coler);
$this_first = imagettfbbox($base['text_size'], 0, $base['font_ulr'], $key);
$first_len = $this_first[2] - $this_first[0];
imagettftext($img, $base['text_size'], 0, $params['field_width'][0]/2 - $first_len/2+$base['border'], $border_top + ($base['row_hight']+$base['text_size'])/2, $text_coler, $base['font_ulr'], $key);//写入序号
$sub = 0;
$sum = $params['field_width'][0]+$base['border'];
foreach ($item as $value){
$sub++;
$this_title_box = imagettfbbox($base['text_size'], 0, $base['font_ulr'], $value);
$title_x_len = $this_title_box[2] - $this_title_box[0];
imagettftext($img, $base['text_size'], 0, $sum + (($base['column_x_arr'][$sub]-$sum)/2 - $title_x_len/2), $border_top + ($base['row_hight']+$base['text_size'])/2, $text_coler, $base['font_ulr'], $value);//写入data数据
$sum += $params['field_width'][$sub];
}
}
//计算标题写入起始位置
$title_fout_box = imagettfbbox($base['title_font_size'], 0, $base['font_ulr'], $params['title']);//imagettfbbox() 返回一个含有 8 个单元的数组表示了文本外框的四个角:
$title_fout_width = $title_fout_box[2] - $title_fout_box[0];//右下角 X 位置 - 左下角 X 位置 为文字宽度
$title_fout_height = $title_fout_box[1] - $title_fout_box[7];//左下角 Y 位置- 左上角 Y 位置 为文字高度
$save_path = $base['file_path'] . $params['file_name'];
if(!is_dir($base['file_path']))//判断存储路径是否存在,不存在则创建
{
mkdir($base['file_path'],0777,true);
}
//居中写入标题
imagettftext($img, $base['title_font_size'], 0, ($base['img_width'] - $title_fout_width)/2, 20, $text_coler, $base['font_ulr'], $params['title']);
//设置图片左上角信息
$a_hight = 20;
if(!empty($params['table_explain'])){
foreach ($params['table_explain'] as $key => $value) {
imagettftext($img, $base['text_size'], 0, 10+$a_hight, 50, $text_coler, $base['font_ulr'], $value);
$a_hight += 180;
}
}
imagepng($img,$save_path);//输出图片,输出png使用imagepng方法,输出gif使用imagegif方法
return $save_path;
}
~~~
![](https://img.kancloud.cn/aa/11/aa119fcd798eb683bd6f5362c6f1ea05_1546x355.png)
- Golang
- Beego框架
- Gin框架
- gin框架介绍
- 使用Gin web框架的知名开源线上项目
- go-admin-gin
- air 热启动
- 完整的form表单参数验证语法
- Go 语言入门练手项目推荐
- Golang是基于多线程模型
- golang 一些概念
- Golang程序开发注意事项
- fatal error: all goroutines are asleep - deadlock
- defer
- Golang 的内建调试器
- go部署
- golang指针重要性
- 包(golang)
- Golang框架选型比较: goframe, beego, iris和gin
- GoFrame
- golang-admin-项目
- go module的使用方法及原理
- go-admin支持多框架的后台系统(go-admin.cn)
- docker gocv
- go-fac
- MSYS2
- 企业开发框架系统推荐
- gorm
- go-zero
- 优秀系统
- GinSkeleton(gin web 及gin 知识)
- 一次 request -> response 的生命周期概述
- 路由与路由组以及gin源码学习
- 中间件以及gin源码学习
- golang项目部署
- 独立部署golang
- 代理部署golang
- 容器部署golang
- golang交叉编译
- goravel
- kardianos+gin 项目作为windows服务运行
- go env
- 适用在Windows、Linux和macOS环境下打包Go应用程序的详细步骤和命令
- Redis
- Dochub
- Docker部署开发go环境
- Docker部署运行go环境
- dochub说明
- Vue
- i18n
- vue3
- vue3基本知识
- element-plus 表格单选
- vue3后台模板
- Thinkphp
- Casbin权限控制中间件
- 容器、依赖注入、门面、事件、中间件
- tp6问答
- 伪静态
- thinkphp-queue
- think-throttle
- thinkphp队列queue的一些使用说明,queue:work和queue:listen的区别
- ThinkPHP6之模型事件的触发条件
- thinkphp-swoole
- save、update、insert 的区别
- Socket
- workerman
- 介绍
- 从ThinkPHP6移植到Webman的一些技术和经验(干货)
- swoole
- swoole介绍
- hyperf
- hf官网
- Swoft
- swoft官网
- easyswoole
- easyswoole官网地址
- EASYSWOOLE 聊天室DEMO
- socket问答
- MySQL
- 聚簇索引与非聚簇索引
- Mysql使用max获取最大值细节
- 主从复制
- 随机生成20万User表的数据
- MySQL进阶-----前缀索引、单例与联合索引
- PHP
- 面向切面编程AOP
- php是单线程的一定程度上也可以看成是“多线程”
- PHP 线程,进程、并发、并行 的理解
- excel数据画表格图片
- php第三方包
- monolog/monolog
- league/glide
- 博客-知识网站
- php 常用bc函数
- PHP知识点的应用场景
- AOP(面向切面编程)
- 注解
- 依赖注入
- 事件机制
- phpspreadsheet导出数据和图片到excel
- Hyperf
- mineAdmin
- 微服务
- nacos注册服务
- simps-mqtt连接客户端simps
- Linux
- 切换php版本
- Vim
- Laravel
- RabbitMQ
- thinkphp+rabbitmq
- 博客
- Webman框架
- 框架注意问题
- 关于内存泄漏
- 移动端自动化
- 懒人精灵
- 工具应用
- render
- gitlab Sourcetree
- ssh-agent失败 错误代码-1
- 资源网站
- Git
- wkhtmltopdf
- MSYS2 介绍
- powershell curl 使用教程
- NSSM(windows服务工具)
- MinGW64
- 知识扩展
- 对象存储系统
- minio
- 雪花ID
- 请求body参数类型
- GraphQL
- js 深拷贝
- window 共享 centos文件夹
- 前端get/post 请求 特殊符号 “+”传参数问题
- 什么是SCM系统?SCM系统与ERP系统有什么区别?
- nginx 日志格式统一为 json
- 特殊符号怎么打
- 收藏网址
- 收藏-golang
- 收藏-vue3
- 收藏-php
- 收藏-node
- 收藏-前端
- 规划ITEM
- 旅游类
- 人脸识别
- dlib
- Docker&&部署
- Docker-compose
- Docker的网络模式
- rancher
- DHorse
- Elasticsearch
- es与kibana都docke连接
- 4种数据同步到Elasticsearch方案
- GPT
- 推荐系统
- fastposter海报生成
- elasticsearch+logstash+kibana
- beego文档系统-MinDoc
- jeecg开源平台
- Java
- 打包部署
- spring boot
- 依赖
- Maven 相关 命令
- Gradle 相关命令
- mybatis
- mybatis.plus
- spring boot 模板引擎
- SpringBoot+Maven多模块项目(创建、依赖、打包可执行jar包部署测试)完整流程
- Spring Cloud
- Sentinel
- nacos
- Apollo
- java推荐项目
- gradle
- Maven
- Nexus仓库管理器
- Python
- Masonite框架
- scrapy
- Python2的pip2
- Python3 安装 pip3
- 安全攻防
- 运维技术
- 腾讯云安全加固建议
- 免费freessl证书申请
- ruby
- homeland
- Protobuf
- GIT
- FFMPEG
- 命令说明
- 音频
- ffmpeg合并多个MP4视频
- NODEJS
- 开发npm包
- MongoDB
- php-docker-mongodb环境搭建
- mongo基本命令
- Docker安装MongoDB最新版并连接
- 少儿编程官网
- UI推荐
- MQTT
- PHP连接mqtt
- EMQX服务端
- php搭建mqtt服务端