利用JS怎样实现页面截屏的功能,实现方法是怎样
Admin 2022-06-07 群英技术资讯 1579 次浏览
这篇文章主要介绍了利用JS怎样实现页面截屏的功能,实现方法是怎样相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇利用JS怎样实现页面截屏的功能,实现方法是怎样文章都会有所收获,下面我们一起来看看吧。"页面截屏"是前端经常遇到的需求,比如页面生成海报,弹窗图片分享等,因为浏览器没有原生的截图API,所以需要借助canvas来实现导出图片实现需求。
方案1:需要手动计算每个DOM元素的Computed Style,然后需要计算好元素在canvas的大小位置等属性。
方案1难点
方案2:该项目在Github上stars已有两万多start,作者仍在积极维护。API非常简单,在已有项目中开箱即用。
因为是常见的需求,所以社区会有成熟的解决方案,首先试试社区的解决方案。
<div id="capture" style="padding: 10px; background: #f5da55">
<h4 style="color: #000; ">Hello world!</h4>
</div>
html2canvas(document.querySelector("#capture")).then(canvas => {
document.body.appendChild(canvas)
});
以上是官网的实例用法。在网页上出现了一个新的 canvas DOM。接下来我们只需要把canvas转换成图片就好。这里使用canva原生的toDataURL和toBlob方法上次到七牛云。
使用时需要注意。此处如果生产的画布中有跨域图片,需要配置allowTaint为true。
如果是原生canvas实现,canvas需要所有跨域图片请求完成才可绘制。有两种解决方案
function asyncImage(url) {
const img = new Image();
img.src = url;
img.setAttribute('crossOrigin', 'anonymous');
return new Promise((resolve, reject) => {
img.onload = () => resolve(img);
img.onerror = reject;
});
}
好的,大功告成~是不是可以交付需求了呢?开开心心提测,但是在移动端测试的时候发现生产的图片非常模糊。这样是不行的,明显low了许多(测试不给过orz)。
github有相应的解决方案 传送门 ,这个回答也是解决很多人的问题
基本原理:将canvas宽高放大两倍。把css把canvas的style设置成1倍大小。
var shareContent = YourTargetElem;
var width = shareContent.offsetWidth;
var height = shareContent.offsetHeight;
var canvas = document.createElement("canvas");
var scale = 2 || window.devicePixelRatio ; //也可以使用设备像素比
canvas.width = width * scale;
canvas.height = height * scale;
canvas.getContext("2d").scale(scale, scale);
var opts = {
scale: scale,
canvas: canvas,
logging: true,
width: width,
height: height
};
html2canvas(shareContent, opts).then(function (canvas) {
var context = canvas.getContext('2d');
var img = Canvas2Image.convertToImage(canvas, canvas.width, canvas.height);
document.body.appendChild(img);
$(img).css({
"width": canvas.width / 2 + "px",
"height": canvas.height / 2 + "px",
})
});
原理我们已经知道了,实际操作之后图像也确实清晰了很多。但是问题还是没有解决掉。
缩小虽然提高了清晰度,但是我们需要的图片是原始比例的大小。。
最终多次尝试无果后,选择放弃使用框架。直接用原生canvas撸一个!
我们知道,在高清屏的设备下,任何绘制canvas中的图像、文字、线条、形状都可能会出现模糊的问题。可通过引入 GitHub 中的 hidpi-canvas 有效地解决。
核心代码如下
function asyncImage(url) {
const img = new Image();
img.src = url;
img.setAttribute('crossOrigin', 'anonymous');
return new Promise((resolve, reject) => {
img.onload = () => resolve(img);
img.onerror = reject;
});
}
async function drawCanvas(){
var canvas = document.querySelector('canvas');
var context = canvas.getContext('2d');
var ratio = getPixelRatio(context); // 关键代码
canvas.width = 300 * ratio; // 画布宽度
canvas.height = 300 * ratio; // 画布高度
var divWidth = 300 * ratio; // 用于内容居中
var divHeight = 300 * ratio; // 用于内容居中
const image = await asyncImage('picUrl')
const imgWidth = 550
const imgHeight = 300
context.drawImage(this, 50, 50, imgWidth * ratio, imgHeight * ratio)
// Some other code
const Blob = canvas.toBlob((Blob)=>{
//上传七牛云
});
}
最终生成的图片终于清晰了...只需要根据dom的offsetWidth等适配不同屏幕就可以了。
如果对图片的清晰度要求不高,或者图片需求是生成缩略图的情况下。采用 html2canvas 是非常不错的选择。
否则,还是用canvas绘制出的图片更清晰。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
目录一.前言二.想法设计/实现过程三.基本样式四.时间函数控制器五,时,分,秒占位六.时间动态填充一.前言今天看到某网站的时间特别的丑陋,所以就诞生了写一个看时间的炫酷的时钟前端页面。 特点就是炫酷,特效好,个人以心情愉快的感觉。 对于时间的变化,我打算使用翻页的特效来完成,色系的话采用黑色以主题,给人一种神秘的感觉。
React是用于构建用户界面的JavaScript库, 起源于Facebook的内部项目,因为该公司对市场上所有 JavaScript MVC框架,都不满意,就决定自己写一套,用来架设Instagram的网站。做出来以后,发现这套东西很好用,就在2013年5月开源了。
检查nodejs是否安装成功的方法:1、打开“开始”菜单,在程序列表中找到node.js目录及程序,则证明安装成功;2、在cmd命令行中执行“node -v”命令,显示node版本,则证明安装成功。
本文是主要给大家介绍Vue中reactive和ref的内容,接下来会分别介绍reactive和ref的用法以及两者的区别,对大家学习和理解reactive和ref的使用有一定的参考价值,感兴趣的朋友接下跟随小编一起学习一下吧。
这篇文章主要为大家详细介绍了js实现新闻轮播效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008