最近要做一个H5活动页面,大概功能是给图片人脸换妆,自然也少不了上传原始图片和导出最终图片等功能。如果图片加工(即人脸换妆)放在服务器处理,那么并发量高的时候,肯定产生大量阻塞。于是想把图片加工放在客户端处理,用HTML堆砌出图片的最终效果,但是怎样把HTML导出成图片呢?
图片上传
图片上传可以参考HTTP文件上传的一个后端完善方案(NginX),或者使用现有的云存储服务,如七牛等等。
五官定位
人脸识别和五官定位可以利用OpenVC自行实现,或者使用成熟的云识别服务,如Face++等等。这里使用腾讯云的人脸识别服务。
人脸换妆
假设有一张图片,识别结果如下:
图片来源:万象优图-腾讯云
根据五官定位点,在适当位置给人脸添上妆饰,比如小胡子:
源码:
1 |
|
最终效果:
这只是HTML,怎样保存成图片呢?
导出图片
把HTML保存成图片,在服务器上可以用PhantomJS实现,在浏览器上呢?其实也是可以实现的,首先将HTML(DOM结构)写入Canvas,Canvas再导出DataURL,最后DataURL赋予img标签的src属性,便得到最终图片,详情请阅读Drawing DOM objects into a canvas。
这里使用插件html2canvas来实现HTML写入Canvas功能,类似的插件还有rasterizeHTML.js等等。
源码:
1 | <script type="text/javascript" src="./html2canvas.min.js"></script> |
在PC端可以用a标签下载图片,href属性值应该是canvas导出的DataURL:
1 | <a href="DataURL" download="最终效果" id="a1">下载</a> |
在移动端则需要显示图片,并引导用户长按保存图片。
最后
注意:如果最终图片未能写入canvas,可能是图片跨域问题,或者图片未加载完就开始写了。
另外:可以分析图片人脸的表情、姿态、年纪、心情等属性,搭配更合适的妆饰,效果更佳;原始图片与妆饰图片可能会有色调、分辨率等不相配的问题,可以使用CSS3滤镜调整,使得最终画面更融洽。