Hi头像

Hi头像

  • 网站首页
  • 技术博客
  • 教程小册

›4-实战开发

标题

  • 《从0到1开发一个智能头像识别小程序》

1-前言

  • 1.1 产品需求设计、页面流程图及项目规划
  • 1.2 技术选型的依据

2-项目配置

  • 2.1 小程序开启云开发模式
  • 2.2 人脸五官分析的环境配置

3-知识储备

  • 3.1 图片裁剪、模糊、保存、分享的技巧
  • 3.2 Canvas绘制技巧,包含小程序与 Web 端
  • 3.2 云开发图像处理的使用方法

4-实战开发

  • 4.1.1 上篇:借助云存储和图像处理扩展人脸智能裁剪
  • 4.1.2 下篇:图像识别流程——图片裁剪、图片压缩、base64转换
  • 4.2 云开发必备——图像安全审核
  • 4.3 通过五官分析实现为人脸佩戴贴纸
  • 4.4 人脸贴纸移动技巧
  • 4.5 头像绘制和图片保存弹窗
  • 4.6【未写】海报分享页面
  • 4.7 CMS扩展实战-节日主题贴纸放在云开发
  • 4.8 【第二期】个人中心的制作
  • 4.9【第二期】小程序与Web端的账户体系摸索

云开发-公众号外发

  • 图片识别加速,从10秒变为1秒,是怎么做到的呢?
  • 简单几步,让微信小程序变身 H5 网页
  • 【草稿】借助云存储,让大图识别转换真正加速
  • 云开发CMS实战-Hi头像节日主题贴纸大升级
  • 小程序云开发环境部署静态网站托管的实战
  • Web 云开发实战之盲水印添加工具(核心版)
  • Web 云开发实战之盲水印添加工具(步骤版)

更多探索

  • 【草稿】深色模式在Web端的适配技巧,附带小程序侧的思考
  • 【草稿】小程序框架:Taro 2.0与Taro 3.0的核心分析

4.4 人脸贴纸移动技巧

本文知识点

  • 图形移动的基本概念
  • 图形移动
    • 拖拽移动图形
    • 旋转图形
    • 水平翻转图形
    • 移除图形
    • 确认

图形移动及事件代理

touch事件绑定-事件委托代理

图形拖拽的方案主要有两种:

  • view(类似于web端的div)的拖动,难度较小,并且主图形内的四个边角上还能使用绝对定位放上可操作性元素。
  • canvas 画布上的图形移动,有一些拖拽库可用,但我这里觉得,操作难度大,并且图形上可操作性元素还需要重新计算位置,比较麻烦。

我这里选择是view上用 CSS 的 transform: translate(X, Y) 来进行图片定位

在前文中,我提过我使用的 600px 对应 600rpx的方法,不仅便于计算,还在页面缩放时有好的效果。

底图

在iPhone 6上的600rpx对应300px,在iPhone 5上就是256px,再后续还要有一次换算。

图形位置

在人脸五官分析时后的位置

// 数据为随意写的
{
  // 图形id
  shapeId: 'xxx',
  // 图形宽度
  shapeWidth: 300,
  // 图形中间位置 X 轴
  shapeCenterX: 200,
  // 图形中间位置 Y 轴
  shapeCenterY: 200,
  // 旋转操作时的 X 轴的相对位置
  resizeCenterX: 240,
  // 旋转操作时的 Y 轴的相对位置
  resizeCenterY: 240,
  // 旋转角度
  rotate: 0,
  // 水平翻转,正向为1,反向为-1
  reserve: 1
}
// 单个图形在view上的位置,transX、transY与 translateHat 有类似的逻辑
// 在 JSX 中的代码
let transX = shapeCenterX - shapeWidth / 2 - 2 + 'rpx'
let transY = shapeCenterY - shapeWidth / 2 - 2 + 'rpx'

let shapeStyle = {
  width: shapeWidth + 'rpx',
  height: shapeWidth + 'rpx',
  transform: `translate(${transX}, ${transY}) rotate(${rotate + 'deg'})`,
  zIndex: shapeIndex === currentShapeIndex ? 2 : 1
}
// 图形位置
<View className='shape-container' key={timeNow} style={shapeStyle}>

图形上

<View className='shape-container' key={timeNow} style={shapeStyle}>
  <Image className="shape-image" data-type='shape' data-shape-index={shapeIndex} src={imageUrl} style={shapeImageStyle} />
  {
    currentShapeIndex === shapeIndex && (
      <Block>
        <View className='shape-btn-remove' data-shape-index={shapeIndex} onClick={this.removeShape}></View>
        <View className='shape-btn-resize' data-shape-index={shapeIndex} data-type='rotate-resize'></View>
        <View className='shape-btn-reverse' data-shape-index={shapeIndex} onClick={this.reverseShape}></View>
        <View className='shape-btn-checked' data-shape-index={shapeIndex} onClick={this.checkedShape}></View>
      </Block>
    )
  }
</View>
  • 核心算法:怎么实现口罩的实时转动
    • 当 touchstart 时,保存此时的 touch 起始点,并以此时的底图和口罩位置作为旋转角度和缩放比例值计算的参考点
    • 当 touchmove 时,根据起始点 和 临时的终止点 计算在 x/y 方向上的移动距离,计算参考点分别 加上这个距离,得到移动后的位置,通过移动前后的位置 计算移动前后位置的变动 计算旋转角和缩放比例
    • 当 touchend 时,重置底图和口罩的位置及旋转角和缩放比例

细节事件

以下内容,尚未完成

拖动 旋转 移除 水平翻转 确认效果 手动添加贴纸,图形移动 写出遗憾,感觉旋转那里有bug,还未很好复现

去除缩放比例

缩放比例,四个点就得分别计算 而用实际宽高及位置调整后,四个点就可以定位到正方形的四个角上。

有待思考,比较欠缺的地方? canvas有类似的图形操作库,但div方式的,还未找到特别理想的!

参考 shape-edit仓库中的代码

px与rpx转换

← 4.3 通过五官分析实现为人脸佩戴贴纸4.5 头像绘制和图片保存弹窗 →
  • 图形移动及事件代理
    • 底图
    • 图形位置
    • 细节事件
Hi头像
文档
开篇介绍
相关资源
云开发 CloudBaseTaro
关于
联系我们GitHub主页Star
Copyright © 2020. All Rights Reserved.
沪ICP备2022023998号