PHP将HTML标签转化为图片

composer require yangshuanlin/php-html2img

test.php 

<?php
require 'vendor/autoload.php';
use Html2image\Assets\html2Img;/*** html:可以是html文件 或者网页URL 或者为参数 必填* $data 额外的参数 必填* $back_url 回调地址 必填*/
$html=file_get_contents('./index.html');
$path= $_SERVER['DOCUMENT_ROOT'].'/image/';
$file_name=time();
$data['path']=$path;
$data['file_name']=$file_name;
$back_url='base64_image_save.php';
$html2img=new Html2img($back_url);
$html2img->getImage($html,$data);

index.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>页面丢失了</title></head><body><div class="error"><div class="sky"><h2><span>4</span><span>0</span><span>4</span></h2><div class="grass"></div><img src="lib/image/plane.jpg" class="plane"></div><div class="field"><h2>啊哦,页面走丢了</h2><a href="#">返回首页</a></div></div></body>
<style>
@CHARSET "UTF-8";
*
{margin: 0;padding: 0;box-sizing: border-box;font-family: consolas;
}
.error{min-height: 100vh;background: linear-gradient(0deg,#fff,#03a9f4);
}
.sky{position: relative;widows: 100%;height: 60vh;display: flex;justify-content: center;align-items: center;
}
.sky h2{font-size: 12em;color: #fff;text-shadow: 15px 15px 0 rgba(0,0,0,0.1);
}
.sky h2 span{margin: 0;padding: 0;display: inline-block;animation: animate 2s ease-in-out infinite;
}
.sky h2 span:nth-child(even){animation-delay: -1s;
}
@keyframes animate{0%,100%{transform: translateY(-50px);}50%{transform: translateY(50px);}
}.field{padding: 100px;height: 40vh;background: #6e2308;box-shadow: inset 0 20px 10px #51680c;text-align: center;
}
.field h2{color: #fff;font-size: 2em;font-family: 宋体;margin-bottom: 20px;
}
.field a{background: #fff;color: #000;width: 160px;height: 50px;line-height: 50px;border-radius: 50px;display: inline-block;text-decoration: none;font-size: 20px;
}
.plane{position: absolute;bottom: 200px;left: 100px;max-width: 300px;
}
</style>
</html><!-- 存放二维码的容器 -->
<div id='qrcode'></div>
<script type='text/javascript' src='http://cdn.staticfile.org/jquery/2.1.1/jquery.min.js'></script> 
<script src="https://cdn.bootcss.com/jquery.qrcode/1.0/jquery.qrcode.min.js"></script>
<script type="text/javascript" >
//解决中午乱码问题
function toUtf8(str) {var out, i, len, c;out = "";len = str.length;for (i = 0; i < len; i++) {c = str.charCodeAt(i);if ((c >= 0x0001) && (c <= 0x007F)) {out += str.charAt(i);} else if (c > 0x07FF) {out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));} else {out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));}}return out;
}
//二维码宽高
var qrcodewidth = 400;
var qrcodeheight = 400;
//canvas宽高
var canvaswidth = qrcodewidth;
var canvasheight = qrcodeheight + 100;
//logo宽高
var logowidth = 100;
var logoheight = 100;
//文字描述位置
var textleft = qrcodewidth / 2;
var texttop = qrcodeheight + 70;
//logo位置
var logoleft = (qrcodewidth - logowidth) / 2;
var logotop = (qrcodeheight - logoheight) / 2;var qrcode = $('#qrcode').qrcode({render : 'canvas',text : toUtf8("https://blog.csdn.net/tswc_byy"),width : qrcodewidth,height : qrcodeheight,background : '#ffffff',foreground : '#000000',
});
var canvas = qrcode.find('canvas').get(0);
var img = new Image();
img.src = canvas.toDataURL('image/png');
img.onload = function() {canvas.width = canvaswidth;canvas.height = canvasheight;var ctx = canvas.getContext('2d');//设置画布背景ctx.fillStyle = '#ffffff';ctx.fillRect(0, 0, canvas.width, canvas.height);//设置文字样式ctx.fillStyle = '#000000';ctx.font = 'bold ' + 50 + 'px Arial';ctx.textAlign = 'center';//文字描述ctx.fillText("二维码标题", textleft, texttop);//绘制二维码ctx.drawImage(img, 0, 0);//设置logovar logo = new Image(logowidth, logoheight);logo.src = 'img/1.gif';logo.onload = function() {ctx.drawImage(logo, logoleft, logotop, logowidth, logoheight);}}</script>

base64_image_save.php 

<?php
$poatdata=file_get_contents("php://input");
$data=params_parse($poatdata);
$rest=base64_image_content($data['base64data'],$data['path'],$data['file_name']);
echo json_encode($rest);/*** @param $base64_image_content  [要保存的Base64编码]* @param $path [图片要保存的路径 绝对路径]* @param string $file_name [图片文件名,不带后缀]* @return array* @throws Exception*/
function base64_image_content($base64_image_content,$path,$file_name=''){try {if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)) {$type = $result[2];if(!file_exists($path)){mkdir($path,0777,true);}$new_file = $path .$file_name . ".{$type}";$image_data = str_replace($result[1], '', $base64_image_content);$rest = file_put_contents($path.'/'.$new_file, base64_decode($image_data));if ($rest) {return ['code' => 1, 'msg' => '保存成功', 'img_path' => $new_file];} else {return ['code' => 0, 'msg' => '保存失败'];}} else {return ['code' => 0, 'msg' => '参数错误'];}}catch (Exception $e){throw new Exception($e->getMessage());}
}/*** 请求参数解析成数组格式* @param $data* @return mixed*/
function params_parse($data){$param=explode('&',$data);foreach ($param as $k=>$v){$index=substr($v,0,strpos($v,'='));$temp[$index]=substr($v,strpos($v,'=')+1);;}return $temp;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Axure教程】能增删改的树形表格

多层级表格又成为树形表格&#xff0c;是在后台常用的一种表格形式&#xff0c;当表格数据存在多层级关系是&#xff0c;可以通过多层级表格&#xff0c;从而更加清晰的呈现数据内容&#xff0c;帮助人们更好地理解和分析数据之间的关系&#xff0c;从而更加有效地传递信息。 …

【吊打面试官系列】Java虚拟机JVM篇 - 关于JVM 新生代、老年代、永久代的区别

大家好&#xff0c;我是锋哥。今天分享关于JVM新生代、老年代、永久代的区别的JVM面试题&#xff0c;希望对大家有帮助&#xff1b; JVM 新生代、老年代、永久代的区别? 在 Java 中&#xff0c;堆被划分成两个不同的区域&#xff1a;新生代 ( Young ) 、老年代 ( Old ) 。而新…

前端React篇之React-Router的实现原理是什么?React-Router的路由有几种模式?

目录 React-Router的实现原理是什么&#xff1f;React-Router的路由有几种模式&#xff1f;HashRouterBrowserRouter React-Router的实现原理是什么&#xff1f; 基于hash的路由&#xff1a;通过监听浏览器的hashchange事件来感知URL中hash部分的变化。当hash发生变化时&#x…

名字空间和类型增强C++

一、名字空间 关键字&#xff1a;namespace&#xff1b; 作用&#xff1a;一个大项目中多个文件里的函数和变量名容易发生冲突&#xff0c;名字空间用来解决这种冲突 语法&#xff1a; namespace namespace_name {}例如&#xff1a; namespce Sample {int i;float f;void d…

PYTHON 120道题目详解(118-120)

118.解释Python中的迭代器&#xff08;Iterator&#xff09;和可迭代对象&#xff08;Iterable&#xff09;的区别和联系。 在Python中&#xff0c;迭代器&#xff08;Iterator&#xff09;和可迭代对象&#xff08;Iterable&#xff09;是两个非常重要的概念&#xff0c;它们在…

【微服务】nacos注册中心

Nacos注册中心 国内公司一般都推崇阿里巴巴的技术&#xff0c;比如注册中心&#xff0c;SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 1.1.认识和安装Nacos Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c;在…

C++ 改造红黑树,封装map和set

C 改造红黑树,封装map和set 一.前言:已经实现好了的红黑树二.简化STL库里面对于map和set的封装1.STL库中红黑树的简化代码2.STL库中set的简化代码3.STL库中map的简化代码4.封装map和set的第一步5.红黑树第一个模板参数的价值6.红黑树节点的定义 三.仿函数1.解除仿函数的误解2.仿…

Android App冷启动耗时优化

Android应用启动过程 Android应用启动过程&#xff0c;主要包含app::onCreate及执行前的Application阶段及Activity::onCreate执行之后的Activity阶段&#xff0c;以及两个阶段之间的间隙handleMessage阶段和最终页面渲染上屏完成前数据加载阶段四个区间组成。 具体来看&#x…

IDEA中配置Tomcat

在IDEA中配置Tomcat 第一步&#xff1a;选择这个方框 第二步&#xff1a;选择号&#xff0c;找到Tomcat Server&#xff08;Local&#xff09; 第三步&#xff1a;将红方框内填完整 第四步&#xff1a;创建artifaces&#xff0c;选择Deployment–>Artia…选择 *.war expl…

嵌入式驱动学习第三周——字符设备驱动关键结构体

前言 linux内核将字符设备抽象成一个具体的数据结构&#xff0c;可以理解为字符设备对象&#xff0c;这篇博客就来讲解一下字符设备驱动的关键结构体。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以…

ArcGis Pro Python工具箱教程 02 工具箱工具集添加

ArcGis Pro Python工具箱教程 02 工具箱工具集添加 经过上一章的教程&#xff0c;pyt工具箱已将可以建立一个模板了&#xff0c;但是所建立的工具都是在一个列表&#xff0c;要进行查找会非常麻烦&#xff0c;所以要采用工具集的分类 官方文档中已经给出了添加工具集的方法&a…

以题为例浅谈SSRF

什么是ssrf SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能够请求到与它相连…

HTML案例-2.标签综合练习

目录 效果 知识点 1.图像标签 2.链接标签 3.锚点定位 4.base标签 源码 页面1 页面2 效果 知识点 1.图像标签 <img src="图像URL" /> 单标签 属性 属性值 描述 src URL 图像的路径 alt 文本

javase day04笔记

第四天课堂笔记 运算符★★★ 算数运算符 数值&#xff1a;相加、求和字符串&#xff1a;拼接表示正号 -相减 /%&#xff1a;求余数&#xff0c;取模/–&#xff1a;自加自减 后置&#xff1a;先自身加1&#xff0c;然后将加1之前的值&#xff0c;再做其他运算m 5 ; n m …

【linux线程(二)】线程互斥与线程同步

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux线程 1. 前言2. 多线程互…

基于大模型和向量数据库的 RAG 示例

1 RAG 介绍 RAG是一种先进的自然语言处理方法&#xff0c;它结合了信息检索和文本生成技术&#xff0c;用于提高问答系统、聊天机器人等应用的性能。 2 RAG 的工作流程 文档加载&#xff08;Document Loading&#xff09; 从各种来源加载大量文档数据。这些文档…

Apache Paimon 使用 Postgres CDC 获取数据

a.依赖准备 flink-connector-postgres-cdc-*.jarb.Synchronizing Tables&#xff08;同步表&#xff09; 在Flink DataStream作业中使用 PostgresSyncTableAction 或直接通过flink run&#xff0c;可以将PostgreSQL中的一个或多个表同步到一个Paimon表中。 <FLINK_HOME&g…

reduce()方法的应用

reduce() 是 JavaScript 数组&#xff08;Array&#xff09;对象的一个方法&#xff0c;它接收一个函数作为累加器&#xff08;accumulator&#xff09;&#xff0c;数组中的每个值&#xff08;从左到右&#xff09;开始缩减&#xff0c;最终为一个值。 reduce() 方法的基本语…

Redis 除了做缓存,还能做什么?

分布式锁&#xff1a;通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下&#xff0c;我们都是基于 Redisson 来实现分布式锁。关于 Redis 实现分布式锁的详细介绍&#xff0c;可以看这篇文章&#xff1a;分布式锁详解open in new window 。限流&#xff1a;一般是通过 …

json-server 安装成功,查看版本直接报错。安装默认版本埋下的一个坑,和node版本不匹配

文章目录 一、作者的错误二、作者安装的过程三、版本问题的解决方式四、安装成功&#xff0c;显示命令不存在的解决思路五、安装失败的解决思路六、json-server运行命令参考文档 一、作者的错误 安装成功 错误原文 file:///C:/Users/ljj/AppData/Roaming/nvm/v14.18.1/node_g…