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 border-radius属性详解
Jul 05 HTML / CSS
多重CSS背景动画实现方法示例
Apr 04 HTML / CSS
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
Apr 16 HTML / CSS
css3实现超炫风车特效
Nov 12 HTML / CSS
利用纯css3实现的文字亮光特效的代码演示
Nov 27 HTML / CSS
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
Jan 06 HTML / CSS
CSS3 input框的实现代码类似Google登录的动画效果
Aug 04 HTML / CSS
探究 canvas 绘图中撤销(undo)功能的实现方式详解
May 17 HTML / CSS
HTML5 input元素类型:email及url介绍
Aug 13 HTML / CSS
整理HTML5中支持的URL编码与字符编码
Feb 23 HTML / CSS
HTML5中图片之间的缝隙完美解决方法
Jul 07 HTML / CSS
html5 http的轮询和Websocket原理
Oct 19 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
PHP5 的对象赋值机制介绍
2011/08/02 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
Yii 实现数据加密和解密
2021/03/09 PHP
nginx 设置多个站跨域
2021/03/09 Servers
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
2009/08/09 Javascript
js几个验证函数代码
2010/03/25 Javascript
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
将数字转换成大写的人民币表达式的js函数
2014/09/21 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
JavaScript实现表格点击排序的方法
2015/05/11 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
JS前端开发判断是否是手机端并跳转操作(小结)
2017/02/05 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
VUE中v-model和v-for指令详解
2017/06/23 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
介绍Python的Django框架中的静态资源管理器django-pipeline
2015/04/25 Python
Python中__new__与__init__方法的区别详解
2015/05/04 Python
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
python flask框架实现重定向功能示例
2019/07/02 Python
Python中base64与xml取值结合问题
2019/12/22 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
Html5 localStorage入门教程
2018/04/26 HTML / CSS
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
详解px单位html5响应式方案
2018/03/08 HTML / CSS
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
参观接待方案
2014/03/17 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
思想工作总结范文
2015/08/12 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书