我自己分装好的方法,外链自己去下:

/**
* !!!使用前请导入jq文件!!!
海报生成,
二维码链接生成
*/ document.write('<script src="/Public/static/qrcode.js" type="text/javascript" charset="utf-8"></script>');
document.write('<script src="/Public/static/html2canvas.js" type="text/javascript" charset="utf-8"></script>'); var scroll; /**
* 生成二维码
* @param id 容器的id,
* @param link 网站链接
* @param w 二维码宽度
* @param h 二维码高度
* @returns {Promise<any>}
*/
function code(id, link, w=128, h=128) { return new Promise((resolve, reject)=>{ var qrcode = new QRCode(id, {
text: link,
width: w,
height: h,
colorDark : "#000000",
colorLight : "#ffffff",
correctLevel : QRCode.CorrectLevel.H
}); if (qrcode._oQRCode == null)
{
reject(true);
}else {
resolve(false);
}
})
} /**
* 生成海报
* @param selector jq的选择器: #id | .class | 标签名称
* @returns {Promise<any>}
*/
function pister(selector) {
//直接选择要截图的dom,就能截图,但是因为canvas的原因,生成的图片模糊
//html2canvas(document.querySelector('div')).then(function(canvas) {
// document.body.appendChild(canvas);
//});
//创建一个新的canvas
return new Promise( (resolve, reject) => { var canvas2 = document.createElement("canvas"); let _canvas = document.querySelector(selector);
var w = parseInt(window.getComputedStyle(_canvas).width);
var h = parseInt(window.getComputedStyle(_canvas).height);
//将canvas画布放大若干倍,然后盛放在较小的容器内,就显得不模糊了
canvas2.width = w;
canvas2.height = h;
canvas2.style.width = w + "px";
canvas2.style.height = h + "px";
canvas2.dpi=window.devicePixelRatio * 4;
//可以按照自己的需求,对context的参数修改,translate指的是偏移量,scale是对绘图进行缩放,所有之后的绘图也会被缩放。定位也会被缩放。如果您 scale(2,2),那么绘图将定位于距离画布左上角两倍远的位置。
var context = canvas2.getContext("2d");
let hy = _canvas.offsetTop;
if (typeof scroll != "number")
{
scroll = 0;
}
var shy = hy - scroll; context.translate(0,-shy);
// context.scale(2, 2); html2canvas(_canvas, { canvas: canvas2 }).then(function(canvas) {
//document.body.appendChild(canvas);
//canvas转换成url,然后利用a标签的download属性,直接下载,绕过上传服务器再下载
// document.querySelector(".down").setAttribute('href', canvas.toDataURL());
var url = canvas.toDataURL();
if (url != undefined)
{
resolve(url);
}else {
reject(false);
}
});
})
} window.onscroll = function() {//为了保证兼容性,这里取两个值,哪个有值取哪一个  
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
//scrollTop就是触发滚轮事件时滚轮的高度
scroll = scrollTop;
} /**
* @param code_id 放二维码的id(任意标签)
* @param link 二维码跳转网址
* @param selector 你要生成图片的html的id
* @param img_selector 海报img标签的id
* @constructor
*/
function Person(code_id, link, selector, img_selector) {
this.code_id = code_id;
this.link = link;
this.selector = selector;
this.img_selector = img_selector;
} /**
* @param w 二维码的宽度
*/
function setCodeWidth(w) {
Person.prototype.CodeWidth = w;
} /**
* @param h 二维码的高度
*/
function setCodeHeight(h) {
Person.prototype.CodeHeight = h;
} /**
* 二维码海报
* @param Person
*/
function codePister(Person) {
//二维码生成
var timea = setTimeout(() => {
var w,h;
if (Person.CodeWidth != undefined)
{
w = Person.CodeWidth;
}else {
w = document.documentElement.clientWidth * 0.2;
} if (Person.CodeHeight != undefined)
{
h = Person.CodeHeight;
}else {
h = document.documentElement.clientWidth * 0.2;
} if ($('#'+Person.code_id).children('img').length > 0)
{
$('#'+Person.code_id).children('img')[0].remove();
}
code(Person.code_id,Person.link,w,h);
clearTimeout(timea);
}, 50); //图片生成
var timeb = setTimeout(() => {
pister("#"+Person.selector).then((src)=>{
// console.log(src);
$('#'+Person.img_selector).attr('src',src)
}).catch((msg)=>{
console.log(msg);
});
clearTimeout(timeb);
},500);
} /**
* 二维码海报(推荐)
* @param Person
*/
function notice(Person) {
var timea = setTimeout(() => {
var w,h;
if (Person.CodeWidth != undefined)
{
w = Person.CodeWidth;
}else {
w = document.documentElement.clientWidth * 0.2;
} if (Person.CodeHeight != undefined)
{
h = Person.CodeHeight;
}else {
h = document.documentElement.clientWidth * 0.2;
} $('#'+Person.code_id).children().remove();
code(Person.code_id,Person.link,w,h).then( (co) => { pister("#"+Person.selector).then((cod)=>{
$('#'+Person.img_selector).attr('src',cod)
}).catch((msg)=>{
console.log(msg);
console.log('海报生成失败');
}); }).catch( (er) => {
console.log('二维码生成失败');
} );
clearTimeout(timea);
}, 50);
}

js html生成图片的更多相关文章

  1. 【原创】最近写的一个比较hack的小爬虫

    目标:爬取爱漫画上面自己喜欢的一个漫画 分析阶段: 0.打开爱漫画主页,迎面就是一坨js代码..直接晕了 1.经过抓包和对html源码的分析,可以发现爱漫画通过另外一个域名发送图片,而当前域名中通过j ...

  2. webpack4-1.常见配置

    参看:文档地址 视频地址:https://www.bilibili.com/video/av51693431 webpack的作用:代码转换.文件优化.代码分割.模块管理.自动刷新.代码检验.自动发布 ...

  3. 移动端js模拟截屏生成图片并下载功能的实现方案

    一.根据PM需求如下: 移动端wap 实现将二维码生成图片下载至用户手机相册保存 二.根据现有思路: 1.使用第三方工具html2canvas,将页面中指定范围的dom转换为canvas 2.随后使用 ...

  4. js依赖mui.css生成图片验证码

    js依赖mui.css生成图片验证码 相关css和js引入路径 https://cdnjs.cloudflare.com/ajax/libs/mui/3.7.1/css/mui.css https:/ ...

  5. 通过js实现随机生成图片

    这次给大家分享一个通过js向HTML添加便签,实现随机代码生成的案例,代码已经放在下方,这里我在下面准备了50张图片,但是没有放在博文中,如果读者想要练习,可以自己下载一些图片,建议下载的多一些. & ...

  6. js 将网页内容生成图片

    $(function () { $("#saveimg_btn").on("click",function (event) { event.preventDef ...

  7. 通过JS将BSAE64生成图片并下载

    HTML:<div style="display:block;margin:0 auto;width:638px;height:795px;"><div id=& ...

  8. js实现html截图生成图片

      没有华丽的开场,直入主题,这就是题主随笔风格.随笔既是日常工作积累,也可理解是个工作笔记,方便日后用到之处快速的有方可寻.   先讲一个需求场景: 定制网页截图传给服务器端保存,用户关注公众号后自 ...

  9. 调用 js 生成图片二维码

    一.js 生成二维码: 首先,需要引用 jQuery 和 jquery.qrcode.js.然后: //生产二维码 $("#qrcodeCanvas").qrcode({ rend ...

随机推荐

  1. 并查集 & 最小生成树详细讲解

    并查集 & 最小生成树 并查集 Disjoint Sets 什么是并查集?     并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将 ...

  2. (CSS):last-child与:last-of-type区别

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>la ...

  3. C++编译/编辑器对OIer的必要功能

    (没有引战的意思,如果有不同意见可以评论区发言,只是写出我目前的情况) 作为一个C++ OIer肯定是用过Dev的,因为学校推荐啊我也没有办法.都知道Dev又丑又没有代码补全,但是却是最最最适合OIe ...

  4. php静态变量的运用

    <?php $count = 5; function get_count() { static $count = 0; return $count++; } echo $count; echo ...

  5. spring boot 异步发送邮件

    发送邮件由于是一个耗时的操作,有可能需要一个几十秒的操作,但是呢,接口 是一个瞬间完成的,为了不影响接口的性能,所以需要对发送邮件的操作进行异步操作,我们这里呢,首先我们要引入发送邮件的测试模块. & ...

  6. 使用tap、Fragment等相关相关知识点。实现类似微信的界面

    实验结果,可以实现通过左右活动来切换不同的界面.也可以通过点击不同的下方按钮来实现切换不同的界面. 自己也添加了相关的自己编写的小页面来展示相关的效果.主要的是对于碎片Fragment对于tap的相关 ...

  7. PAT 链表倒序的算法优化

    之前的答案错误问题已经解决了,现在还有运行超时的问题,先贴上之前的代码 1 #include <iostream> 2 #include <string.h> 3 using ...

  8. 答好友困惑:Java零基础如何入门,不知道怎么学,迷茫ING

    作者:程序员小跃 几个星期之前,我在知乎上看到一个提问,说是:对于完全没有经验零基础自身的数学底子也很弱学习Java应该怎么学习呢?想着类似的问题我也有过回答,并且反馈还是蛮好的,就参考之前的思路回答 ...

  9. posix系统线程调度-设置线程优先级

    #include <thread> #include <mutex> #include <iostream> #include <chrono> #in ...

  10. MyBatis-Plus使用小结

    官网: https://mybatis.plus/ https://gitee.com/baomidou/mybatis-plus https://github.com/baomidou/mybati ...