H5项目开发分享——用Canvas合成文字

以前曾用Canvas合成、裁剪、图片等《用H5中的Canvas等技术制作海报》。这次用Canvas来画文字。

下图中“老王考到驾照后”这几个字是画在Canvas上的,与在PS中打入的字非常接近,毫无违和感。

前面一段时间也在研读JavaScript设计模式相关的知识,这次正好小小的实践一下,但对设计模式的理解还不是很深。

 

一、项目总览

  

总共就两张页面,第一张是选择性别,输入名字,第二张页面是合成文字,并展示出来。

虽然页面很简单,但在做这个项目的时候,涉及到了很多方面,自定义字体、CSS3动画、Canvas、CSS3选择器、本地缓存、构建工具等。

下图是工程文件总览:

 

二、构建工具

目前开发采用的是自动化构建工具“gulp”,“config.js”和“gulpfile.js”都是配置文件。

关于这个工具,以前曾写过介绍《前端自动化构建工具gulp记录

有了构建工具后,就能方便的压缩图片、压缩CSS、压缩JS、编译Sass文件、编译Jade文件、搭建本地服务器等。

网上有个很时髦的工具“webpack”,在构建工具也引用了,目前就仅仅用来合并JS。

 

三、HTML

1)Jade

不同于以前编写html,这里我使用了Jade,一个模版引擎。

通过使用Jade,可以将html中通用的抽象出来,还可以使用循环、条件、继承等特性,减少代码,代码也更可读。

Jade代码如下,下面是一个模版layout中的代码,其他页面可以继承他,这样很多通用的代码就不用再写了。

 

2)flexible.js

这段脚本是用来解决H5页面终端适配的。具体的使用方法可以参考这里

在脚本中会做两个操作,

一个是放大,如果是IOS系统,那么会根据当前的设备像素比来做页面的放大操作,如果是Android就还是默认的。

例如Iphone6中设备像素比是2,那么就设置为0.5,也就是1/2。

<meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">

另外一个就是计算rem的基准值,获取到“document.documentElement”的宽度,再除以10,作为一个基准值。

var width = docEl.getBoundingClientRect().width;
var rem = width / 10;

具体可以参考《移动开发屏幕适配分析

 

三、CSS

1)Sass

目前开发CSS,会使用Sass预编译工具,它允许你使用变量、嵌套规则、 mixins、导入等众多功能,并且完全兼容 CSS 语法。

Sass 有助于保持大型样式表结构良好,同时也让你能够快速开始小型项目。

通过Sass,可以将CSS模块化、代码更清晰、并且能将通用的代码抽象出来复用。

下面的代码是引用了自己写的一个库“PrimusUI”中的部分模块:

移动端开发,由于屏幕尺寸很多,所以用弹性布局,会比较方便,专门封装了一段操作弹性布局各个属性的代码“grid”。

传统的浮动布局,很容易出现各种问题,尤其是字体间的对齐,非常头疼,具体可以参考《CSS3伸缩盒Flexible Box

 

2)自定义字体图标

上图中的“icon”,封装了自定义字体的CSS代码。

自定义字体图标相对于图片,有可控制大小、颜色、对齐更简单等优势。

并且现在移动端都能支持,适当的使用自定义字体可以提升页面性能。

国外有“Font Awesome”,国内有“iconfont”,iconfont中有丰富的图标,基本能满足你日常的开发需求,如果没有还可以自己制作矢量图,上传到网上自动转换。

我将用到的图标放到了一个项目中,以便重复使用。

 

3)CSS3

CSS3扩展了很多属性,下图中的选中的勾就是通过伪类实现的。

input[type=radio]:checked {background: url(../img/checked.png) no-repeat 32px 5px;background-size: 40px 40px;
}

还经常会用到伪对象选择符“::after”或“::before”,有了这两个就相当于多了两个标签。

上图中的长按保存这张图片就设置在伪对象中。

&::after {position: absolute;content: "";background: url(../img/prompt.png) no-repeat;width: 350px;top: 40px;left: 50%;margin-left: -175px;height: 70px;background-size: 100% 100%;
}

还会做一些小动画,脉冲,上下位移,渐变等,更多动画属性可以参考《CSS3中的动画效果记录

 

四、JavaScript

1)通用模块

JS与CSS一样,也整理了一些通用的模块,在实际项目中,直接引用即可。

上面的模块一个封装了缓存,一个封装了平时需要操作DOM的相关方法。

DOM中有个方法是用于图片预加载的,主要是为了图片阻塞页面加载CSS、JS、HTML资源,提升页面性能,关于预加载可以参考《图片预加载与懒加载

/*** 图片预加载*/
$("img[data-src]").each(function() {var $this = $(this);var src = $this.data('src');dom.preImage(src, function() {$this.attr('src', src);});
});

 

2)命令模式封装的Canvas

命令模式是将请求与实现解耦并封装成独立对象,根据不同参数,执行不同功能。

这里将canvas画文本与合成图片封装了起来:

var CanvasCommand = (function() {var canvas = document.createElement('canvas');var ctx = canvas.getContext('2d');canvas.width = 520;canvas.height = 500;var $compose = $('#compose');var Action = {fillText: function(font) {var canvas2 = document.createElement('canvas');var sizes = [], width=0;$.each(font, function(key, value) {sizes.push(value['size']);width += value['size'] * value['txt'].length + 5;});canvas2.width = width - 5;//画布宽度var max = Math.max.apply(this, sizes);canvas2.height = max * 1.5;//画布高度var ctx2 = canvas2.getContext('2d');ctx2.fillStyle = "#ffed03";ctx2.fillRect(0, 0, canvas2.width, canvas2.height);var x = 0;$.each(font, function(key, value) {ctx2.font = (value['bold'] || '')+" "+value['size']+"px serif";ctx2.fillStyle = "black";ctx2.fillText(value['txt'], x, max);x += value['size'] * value['txt'].length + 5;});return canvas2;},fillImage: function(num, txts) {var qrcode = new Image();qrcode.src = 'img/qrcode.png';qrcode.onload = function() {var image = new Image();image.src = 'img/story/'+num+'.png';image.onload = function() {ctx.drawImage(image, 0, 0, canvas.width, canvas.height);ctx.drawImage(qrcode, 20, 400, 80, 80);$.each(txts, function(key, value) {ctx.drawImage(value, value.left, value.top, value.width, value.height);});var base64 = canvas.toDataURL("image/jpeg", 0.6);$compose.attr('src', base64);};};}};return {/*** 命令格式 command,params* @param param*/execute: function(param) {return Action[param.command].apply(Action, param.params);//执行命令
        }}
})();

1.这里使用了canvas中的fillText来渲染文本,在渲染的时候还通过font设置了字体,fillStyle设置了颜色,MDN上有篇canvas的基础教程

2.canvas中的drawImage就是用来嵌入图片的,设置好起始坐标和图片大小后就能将图片展示在一起。

3.上面的操作就是:在一张预先写好文案的图片上写上动态输入的名字,再配上自定义文案和二维码图片。

  

 

源码地址:

https://github.com/pwstrick/road

转载于:https://www.cnblogs.com/strick/p/6158320.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMOS图像传感器——SNR计算

图像质量评价在计算机视觉,人工智能,高清视频传输上面有很广泛的应用。目前,图像质量评价主要分为三个方向,有参考图像的质量评价,半参考的图像质量评价,以及无参考的图像质量评价。许多时候,我们利用CIS采集的RAW DATA本身就是含噪信号,因为我们往往不知道感兴趣的像素…

Java this 关键字的用法

this 关键字的用法 this 在类中就是代表当前对象&#xff0c;可以通过 this 关键字完成当前 对象的成员属性、成员方法和构造方法的调用。 那么何时用 this? 当在定义类中的方法时&#xff0c;如果需要调用该类对象&#xff0c;就可以用 this 来表示这个对象。也就是说&#x…

数字图像处理——中值滤波及其改进算法

一、算法介绍 中值滤波器是非线性滤波器的一个例子&#xff0c;它在保留图像特征方面非常有效。 但是&#xff0c;滤波器的窗口大小直接影响中值滤波器的性能。 较小的窗口保留了特征&#xff0c;但会导致噪声抑制的减少。 在较大窗口的情况下&#xff0c;噪声抑制很高&#xf…

环信快速集成,以及实际集成中遇到的坑

一.pod集成遇到的问题 1.直接pod 安装 pod EaseUI, :git > https://github.com/easemob/easeui-ios-hyphenate-cocoapods.git 在这个过程中&#xff0c;如果你pod已经安装了sdwebimage&#xff0c;mjrefresh等他自身包含的三方&#xff0c;就需要在你的podfile里面把这个给删…

用NPOI从DataBase到Excel '2

NPOI的C# Helper代码2 1 public static MemoryStream ExportXls(DataTable dt)2 {3 HSSFWorkbook wk new HSSFWorkbook();4 ISheet sheet null;5 6 string sheetName "Sheet1";7 if (!string.Is…

CMOS图像传感器——噪声模型

由于CMOS图像传感噪声的复杂性和不可控性,学者们一直在寻求一种能对其比较精确表的噪声模型。在图像降噪领域,为了降低算法设计的复杂度,人们普遍采用基于信道相关噪声的模型(即加性噪声),但其缺点就是不能精确地表示传感器的噪声。于是Hirakawa提出了一 种精确CMOS传感器…

TCp传输粘包问题

解决TCP网络传输“粘包”问题 当前在网络传输应用中&#xff0c;广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口&#xff08;API&#xff09;。TCP/IP传输层有两个并列的协 议&#xff1a;TCP和UDP。其中TCP&#xff08;transport control protocol&#xff0c;传…

AtomicIntegerArray和AtomicIntegerFieldUpdater

2019独角兽企业重金招聘Python工程师标准>>> AtomicIntegerArray 对int数组中元素的操作不是原子性的&#xff0c;所以存在并发操作时&#xff0c;我们应该使用AtomicIntegerArray类来代替int数组。 下面是验证演示代码&#xff1a; public class AtomicIntegerArra…

CMOS图像传感器——高动态范围

动态范围是CMOS 图像传感器中很重要的一项评价指标。动态范围指示了CMOS 图像传感器能够在同一帧图像中同时探测到的最大光强信号和最小光强信号的范围。动态范围通常用dB 形式来表示,其计算公式如下 其中Pmax 和Pmin 分别是最大非饱和光强与最小可探测光强。对于线性…

《Linux内核设计与实现》读书笔记(七)- 中断处理

中断处理一般不是纯软件来实现的&#xff0c;需要硬件的支持。通过对中断的学习有助于更深入的了解系统的一些底层原理&#xff0c;特别是驱动程序的开发。 主要内容&#xff1a; 什么是中断中断类型中断相关函数中断处理机制中断控制方法总结1. 什么是中断 为了提高CPU和外围硬…

入门视频采集与处理(学会分析YUV数据)

标签&#xff1a;分析码流 视频采集 RGB YUV 原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ticktick.blog.51cto.com/823160/555791做视频采集与处理&#xff0c;自然少不了要学会分析…

数字后端——时序验证

时序验证则是采用时序分析等方法验证设计是否满足时序收敛&#xff0c;这些时序检验工作包括反向标定(back-annotation)、时序与功耗的检验、时序与信号完整性的检验和当代低功耗纳米先进设计中的“多模式多端角”(MMMC&#xff0c;multi-mode multi-comer)检验。 一、反向标定…

Hadoop系列(三)MapReduce Job的几种提交运行模式

Job执行可以分为本地执行或者集群执行。hadoop集群安装部署在远程centos系统中。使用经典的WordCount代码为例。 1. 本地执行模式&#xff08;本地为MacOS环境&#xff09;&#xff0c;无需启动远程的hadoop集群&#xff0c;本地job会提交给本地执行器LocalJobRunner去执行。 1…

常见视频接口介绍,VGA,YPbPr,DVI,HDMI,DisplayPort

1&#xff0c;VGA(D-SUB) 这种是显示器最常见的&#xff0c;用了很多年&#xff0c;色域空间是RGB&#xff0c;也就是红绿蓝&#xff0c;模拟信号&#xff0c;无音频 插头是15针的&#xff0c;实际所需的最小针数应该是5针&#xff0c;也就是RGB三色信号&#xff0c;水平…

芯片面积估计方法

一、概念 芯片面积的主要涵盖部分分为三部分 IO&#xff1a;芯片的信号及电源pad等Standard cell : 实现芯片的功能逻辑Macro block &#xff1a;第三方IP( PLL DAC POR Memory .etc )芯片面积估计就是通过目标工艺的库信息&#xff0c;设计的spec、以往设计的信息及&#xff…

WordPress开发之WP Custom Register Login插件试用

简介 WP Custom Register Login可以为你的WordPress网站前台增加注册、登录、找回密码的功能&#xff1b;你可以通过简码在任何页面上调用。此外&#xff0c;该插件还支持设置自动通过用户的电子邮件验证新帐户激活&#xff0c;自带算术验证码&#xff0c;有效防护垃圾注册。对…

Java数据类型(基本数据类型)学习

Java数据类型&#xff08;基本数据类型&#xff09;学习 与其他语言一样&#xff0c;Java编程同样存在&#xff0c;比如int a&#xff0c;float b等。在学习变量之前我就必须先了解Java的数据类型啦。 Java的数据类型包括基本数据类型和引用数据类型。具体如下&#xff1a; 各数…

SLVS-EC接口学习

SLVS summarize 一、概述 SLVS-EC高速串行接口技术&#xff0c;在CIS和DSP&#xff08;数字信号处理器&#xff09;之间实现了高帧率的宽带像素数据传输。 SLVS-EC引入了一个优化的数据包格式和控制协议&#xff0c;几乎没有冗余&#xff0c;而且结构简单&#xff0c;仅由两层…

关于Unity中NGUI的Pivot和锚点

Pivot 1.创建一个Sprite类型的Sprite1节点&#xff0c;关联一个图集和一张贴图&#xff0c;用图中的六个按钮调整这个贴图的Pivot点&#xff0c;一共有八个点可以选择 2.再创建一个Sprite类型的Sprite2节点&#xff0c;作为Sprite1节点的子节点&#xff0c;关联一个图集和一张贴…

PrimeTime指南——概述和基本流程

PrimeTime&#xff08;PT&#xff09;是Synopsys的sign-off quality的静态时序分析工具。PrimeTime可以集成于逻辑综合和物理综合的流程&#xff0c;让设计者分析并解决复杂的时序问题&#xff0c;并提高时序收敛的速度。 一、概述 PT最大的两个特点是&#xff1a; 基于时序路…