html5 canvas合成海报所遇问题及解决方案总结


Posted in HTML / CSS onAugust 03, 2017

前言:最近做了一个用canvas合成海报图片的移动端项目,由于一点canvas基础都没有,所以去网上搜了一位前辈的demo,但是开发过程中遇到了很多问题,现将所遇问题及解决方法总结如下:

1、移动端canvas项目适配全屏问题

问题描述:由于canvas的width和height只能设置px值,不支持rem单位,所以想在移动设备屏幕分辨率繁杂的情况下达到canvas铺满全屏的效果很困难。解决方法:通过js获取到手机屏幕的clientWidth值,赋给canvas,以此来达到适配全屏的效果;

var clientWidth = document.documentElement.clientWidth;  
var canvasWidth = Math.floor(clientWidth);  
var canvasHeight = Math.floor(clientWidth*(1334/750));  
$("#main").css('width',canvasWidth+'px');  
$("#main").css('height',canvasHeight+'px');

2、canvas合成的图片出现模糊现象

问题描述:canvas生成的图片出现模糊问题,尤其是图片上有二维码需要识别的,用户根本无法识别;

解决方法:1)可以引用hidpi-canvas.js插件解决此问题;

 2)也可以将canvas的style中的width和height值设置为你想要的大小,然后将canvas的width和height的值分别放大x倍,此处注意,当你在画布中绘制图片或者文字时,相应数值也应放大x倍。

3、合成图片时部分机型图片错乱

问题描述:部分安卓手机在导出canvas的base64图片时,只能显示想要效果图片的一半,初步分析是设备像素比引起的bug。

解决方法:获取设备像素比pr,判断机型,此处我只判断了是iphone还是安卓,暂时还未出现问题,合成图片时再将width和height值恢复到原来的大小。

//hidpi-canvas将canvas的width和height属性放大pr倍  
if (navigator.userAgent.match(/iphone/i)) {  
    canvas.width = width ;//恢复为原先的大小  
    canvas.height = height ;  
}else{  
    canvas.width = width / pr;//恢复为原先的大小  
    canvas.height = height / pr;  
}

4、iphone手机上传图片出现旋转问题

问题描述:测试时发现,iPhone手机上传照片出现旋转情况,而上传从网上保存的图片则不会出现此问题,安卓正常。

解决方法:此问题可使用exif.js插件解决,此插件会获取照片拍摄时的角度等信息,主要是Orientation属性,从而进行相应操作;

html5 canvas合成海报所遇问题及解决方案总结

var file = $(this)[0].files[0];  
EXIF.getData(file, function() {    
    EXIF.getAllTags(this);       
    Orientation = EXIF.getTag(this, 'Orientation');    
});

5、canvas绘制跨域图片无法导出base64图片

问题描述:当画布中存在跨域请求来的图片时,导出base64图片失败,初步分析应该是canvas本身的安全机制引起的。

解决方法:此bug需要前后端配合解决,首先后端设置图片允许跨域,然后前端设置Img.crossOrigin = "Anonymous";即可。

var pageqrcodeimg = qrcodecanvas.toDataURL('image/jpg');  
var qrcodeImg = new Image();  
qrcodeImg.crossOrigin = "Anonymous";   
qrcodeImg.src = pageqrcodeimg;  
qrcodeImg.onload=function(){  
        //绘制图片  
}

6、canvas绘制图片时会出现白屏情况

问题描述:canvas绘制图片时偶尔会出现白屏情况,初步分析是图片还没读取完毕就执行了绘图操作。

解决方法:给img添加onload函数,图片读取完毕再执行绘图操作。

qrcodeImg.onload=function(){  
        //绘制图片  
}

 7、微信浏览器中长按图片无法保存

问题描述:通过canvas生成的图片在微信浏览器中长按无法保存或者识别二维码,安卓部分图片出现此情况,iphone正常,初步分析是图片质量太大导致。

解决方法:导出base64图片时压缩图片质量。

var mycanvas = document.getElementById("main");  
var image = mycanvas.toDataURL("image/jpeg",0.7);

后记:目前遇到的问题基本就这些,后期如果遇到什么问题会持续更新。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
Jan 23 HTML / CSS
CSS3 transform的skew属性值图文详解
Jul 21 HTML / CSS
一款基于css3的动画按钮代码教程
Nov 23 HTML / CSS
CSS3 实现图形下落动画效果
Nov 13 HTML / CSS
CSS3实现红包抖动效果
Dec 23 HTML / CSS
html5使用canvas实现图片下载功能的示例代码
Aug 26 HTML / CSS
利用HTML5实现使用按钮控制背景音乐开关
Sep 21 HTML / CSS
使用phonegap进行提示操作的具体方法
Mar 30 HTML / CSS
html5清空画布方法(三种)
Oct 16 HTML / CSS
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
Apr 23 HTML / CSS
HTML5给汉字加拼音收起展开组件的实现代码
Apr 08 HTML / CSS
flex布局中使用flex-wrap实现换行的项目实践
Jun 21 HTML / CSS
从零实现一个自定义html5播放器的示例代码
Aug 01 #HTML / CSS
浅谈HTML5 服务器推送事件(Server-sent Events)
Aug 01 #HTML / CSS
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
Jul 31 #HTML / CSS
html5教你做炫酷的碎片式图片切换 (canvas)
Jul 28 #HTML / CSS
H5 canvas实现贪吃蛇小游戏
Jul 28 #HTML / CSS
LocalStorage记住用户和密码功能
Jul 24 #HTML / CSS
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
Jul 24 #HTML / CSS
You might like
探讨PHP删除文件夹的三种方法
2013/06/09 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
Yii 2.0在Grid中格式化时间方法示例
2017/06/06 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
Javascript面象对象成员、共享成员变量实验
2010/11/19 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
JS中使用DOM来控制HTML元素
2016/07/31 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
AngularJs 延时器、计时器实例代码
2017/09/16 Javascript
基于vue2.0的活动倒计时组件countdown(附源码下载)
2018/10/09 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
python 合并文件的具体实例
2013/08/08 Python
Python装饰器原理与用法分析
2018/04/30 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
详解Python循环作用域与闭包
2019/03/21 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
2019/06/13 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
2020/12/04 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
在求职信中如何凸显个人优势
2013/10/30 职场文书
即将毕业大学生自荐信
2014/01/24 职场文书
刚毕业大学生自荐信范文
2014/02/20 职场文书
励志演讲稿500字
2014/08/21 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
Java中使用Filter过滤器的方法
2021/06/28 Java/Android