html2 canvas生成清晰的图片实现打印功能


Posted in HTML / CSS onSeptember 23, 2019

最近由于公司业务要求,需要完成一个一键生成照片图片打印总图的功能

html2canvas是一个非常强大的截图插件,很多生成图片和打印的场景会用到它

但是效果很模糊 ,本文主要记录一下如果解决模糊的问题以及各种参数如何设置

基本用法

 

window.html2canvas(dom, {
        scale: scale,
        width: dom.offsetWidth,
        height: dom.offsetHeight
    }).then(function (canvas) {
        var context = canvas.getContext('2d');
        context.mozImageSmoothingEnabled = false;
        context.webkitImageSmoothingEnabled = false;
        context.msImageSmoothingEnabled = false;
        context.imageSmoothingEnabled = false;
        var src64 = canvas.toDataURL()
}

scale 为放大倍数 ,我这里设置为4 ,越高理论上越清晰

dom.offsetWidth height: dom.offsetHeight 直接取得需要转为图片的dom元素的宽高

处理模糊问题
 

 

var context = canvas.getContext('2d');
context.mozImageSmoothingEnabled = false;
context.webkitImageSmoothingEnabled = false;
context.msImageSmoothingEnabled = false;
context.imageSmoothingEnabled = false;

这段代码去除锯齿,会使图片变得清晰,结合scale放大处理

细节问题
 

如果生成的base64太大,会损耗性能,需要压缩base64

首先可能需要获取base64的大小

getImgSize: function (str) {
    //获取base64图片大小,返回KB数字
    var str = str.replace('data:image/jpeg;base64,', '');//这里根据自己上传图片的格式进行相应修改

    var strLength = str.length;
    var fileLength = parseInt(strLength - (strLength / 8) * 2);

    // 由字节转换为KB
    var size = "";
    size = (fileLength / 1024).toFixed(2);

    return parseInt(size);
}

 

然后根据获取的大小判断你是否要压缩base64

压缩的代码如下

 

compress: function (base64String, w, quality) {
    var getMimeType = function (urlData) {
        var arr = urlData.split(',');
        var mime = arr[0].match(/:(.*?);/)[1];
        // return mime.replace("image/", "");
        return mime;
    };
    var newImage = new Image();
    var imgWidth, imgHeight;

    var promise = new Promise(function (resolve) {
        newImage.onload = resolve;
    });
    newImage.src = base64String;
    return promise.then(function () {


        imgWidth = newImage.width;
        imgHeight = newImage.height;
        var canvas = document.createElement("canvas");
        var ctx = canvas.getContext("2d");
        if (Math.max(imgWidth, imgHeight) > w) {
            if (imgWidth > imgHeight) {
                canvas.width = w;
                canvas.height = w * imgHeight / imgWidth;
            } else {
                canvas.height = w;
                canvas.width = w * imgWidth / imgHeight;
            }
        } else {
            canvas.width = imgWidth;
            canvas.height = imgHeight;
        }
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.drawImage(newImage, 0, 0, canvas.width, canvas.height);
        var base64 = canvas.toDataURL(getMimeType(base64String), quality);   
        return base64;
    })
}

 

使用方法

 

self.compress(src64,width,1).then(function(base){
    src64 = base
    src64 = src64.replace(/data:image\/.*;base64,/, '')
    // 调用接口保存图片
}).catch(function(err){
    dialog.tip(err.message, dialog.MESSAGE.WARN);
})

本文主要包括,html2canvas使用,参数,如何保证图片的清晰度和base64的一下处理

总结

以上所述是小编给大家介绍的html2 canvas生成清晰的图片实现打印功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

HTML / CSS 相关文章推荐
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
Sep 02 HTML / CSS
CSS3实现闪烁动画效果的方法
Feb 09 HTML / CSS
利用SVG和CSS3来实现一个炫酷的边框动画
Jul 22 HTML / CSS
css3新单位vw、vh的使用教程
Mar 23 HTML / CSS
HTML5中canvas中的beginPath()和closePath()的重要性
Aug 24 HTML / CSS
html5的新玩法——语音搜索
Jan 03 HTML / CSS
html5中为audio标签增加停止按钮动作实现方法
Jan 04 HTML / CSS
html5 的a标签 Href 拨电话的写法
Nov 04 HTML / CSS
Canvas环形饼图与手势控制的实现代码
Nov 08 HTML / CSS
html5 制作地图当前定位箭头的方法示例
Jan 10 HTML / CSS
HTML5逐步分析实现拖放功能的方法
Sep 30 HTML / CSS
html,css,javascript是怎样变成页面的
May 07 HTML / CSS
将SVG图引入到HTML页面的实现
Sep 20 #HTML / CSS
解析浏览器的一些“滚动”行为鉴赏
Sep 16 #HTML / CSS
html5移动端价格输入键盘的实现
Sep 16 #HTML / CSS
canvas生成带二维码海报的踩坑记录
Sep 11 #HTML / CSS
html5写一个BUI折叠菜单插件的实现方法
Sep 11 #HTML / CSS
html5借用repeating-linear-gradient实现一把刻度尺(ruler)
Sep 09 #HTML / CSS
做一个能自适应高度的textarea的示例代码
Sep 06 #HTML / CSS
You might like
多php服务器实现多session并发运行
2006/10/09 PHP
使用PHP提取视频网站页面中的FLASH地址的代码
2010/04/17 PHP
PHP中exec函数和shell_exec函数的区别
2014/08/20 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
php实现学生管理系统
2020/03/21 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
驱动事件的addEvent.js代码
2007/03/27 Javascript
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
提高NodeJS中SSL服务的性能
2014/07/15 NodeJs
Bootstrap创建可折叠的组件
2016/02/23 Javascript
js验证真实姓名与身份证号,手机号的简单实例
2016/07/18 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
当vue路由变化时,改变导航栏的样式方法
2018/08/22 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
JavaScript函数的4种调用方法实例分析
2019/03/05 Javascript
[49:42]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第一局
2016/03/04 DOTA
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
python numpy库np.percentile用法说明
2020/06/08 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
用Python 执行cmd命令
2020/12/18 Python
python使用numpy中的size()函数实例用法详解
2021/01/29 Python
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
介绍一下.net和Java的特点和区别
2012/09/26 面试题
优秀教师获奖感言
2014/01/31 职场文书
计算机专业职业规划
2014/02/28 职场文书
网页美工求职信范文
2014/04/17 职场文书
组工干部演讲稿
2014/09/02 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书