Hi头像

Hi头像

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

›3-知识储备

标题

  • 《从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的核心分析

3.1 图片裁剪、模糊、保存、分享的技巧

本文所讲内容主要基于微信原生小程序和 Taro(多端统一开发解决方案)。如果使用Taro语法,那在微信原生小程序中写法也类似。

选择图片

Taro.chooseImage({
  count: 1, // 选择数量
  sourceType: ['album', 'camera'], // 选择图片的来源
  sizeType: ['original', 'compressed'] // 所选的图片的尺寸
}).then(res => {
  this.setState({
    originSrc: res.tempFilePaths[0]
  });
}).catch(error => {
  console.log('error :', error);
})

在安卓手机上压缩效果不好,使用原图,然后图片裁剪时,再用canvas实现图片压缩的目的的效果更好。

也就是说,sizeType设置为original,在使用基于Canvas实现的图片裁剪来获取特定宽高的图片。

裁剪图片

在“我要戴口罩”小程序中的另一个痛点就是如果上传一个长方形图片,会被强行变成正方形。我就想如何裁剪出正方形图片呢,此时在 npmjs 仓库中发现了taro-cropper这个强大的图片裁剪插件(也可以在 Taro 物料市场找到)。

  • 原生小程序侧:wx-plugin/image-cropper,功能强大,但使用起来较麻烦
  • web端:react-cropper,下载量挺大,感觉应该好用
  • Taro:使用 taro-cropper
// originSrc 为Taro.chooseImage() 的图片路径
<View className='cropper-wrap' hidden={!originSrc}>
  <TaroCropper
    src={originSrc}
    cropperWidth={900}
    cropperHeight={900}
    ref={this.catTaroCropper}
    fullScreen
    fullScreenCss
    onCut={this.onCut}
    hideCancelText={false}
    onCancel={this.onCancel}
  />
</View>

为何我把代码clone下来呢,因为我在跟 Taro v3.0.0 的新版本开发,在新版本中我是用React框架,就需要改进相应的写法啦。

图片压缩

在小程序上,主要使用 wx.compressImage() 来完成压缩,其在安卓上压缩效果也不是很好。此时,也有借助canvas进行压缩的。

Taro.compressImage({
  src: tempFilePaths, // 图片路径
  quality: 10 // 压缩质量,最大为100
}).then(res => {
  console.log('图片路径 :', res.tempFilePaths);
}).catch(error => {
  console.log('error :', error);
})

而在Web端,只能用canvas来实现图片压缩,不过在Web端可以动态创建canvas,再进行压缩后可以将canvas元素给去除。

图片模糊

用canvas画图,其宽高是不支持缩放的。也就是,900x900大小的画布放在宽高为300x300的canvas上,也只会显示左上角的300x300的区域。 而将300x300的图片给2倍屏或3倍屏的手机上看,会显得格外的模糊。

此时,就需要两个元素,一个被定为到UI界面之外的canvas元素,一个是由canvas导出的大图Image。

<Canvas className='canvas-mask' style={{ width: '900px', height:  '900px' }} canvasId='canvasMask' />
<Image className='poster-image' src={posterSrc} onClick={this.previewPoster} showMenuByLongpress />
.canvas-mask {
  position: absolute;
  left: 0;
  top: -9999px;
}

canvas元素不能设置为 display:none,否则就无法进行绘制了。

分享给朋友

在上面的示意图中,你会发现“点击可预览大图,长按可以分享图片”这句提示语,这其实代表了两个方法的实现。

  • Taro.previewImage() 点击图片预览图片
  • showMenuByLongpress 长按图片,开启长按图片显示识别小程序码菜单,其中就包含了“发送给朋友”这一选项。
<Image
  className='poster-image'
  src={posterSrc}
  onClick={this.previewPoster}
  showMenuByLongpress
/>

// 预览图片
previewPoster = () => {
  const { posterSrc } = this.state
  if (posterSrc !== '') Taro.previewImage({ urls: [posterSrc] })
}

而要实现“分享给朋友”,就需要设置页面分享方法,并在按钮上绑定对应生成好的海报了。

<!-- 按钮点击 -->
<Button
  className='poster-btn-share'
  openType='share'
  data-poster-src={posterSrc}
>
  发送给朋友
</Button>
// 页面分享方法
onShareAppMessage({ from, target }) {
  const DEFAULT_SHARE_COVER = 'https://n1image.hjfile.cn/res7/2020/02/02/a374bb58c4402a90eeb07b1abbb95916.png'

  let shareImage = DEFAULT_SHARE_COVER
  let shareUrl = '/pages/queen-king/queen-king'
  if (from === 'button') {
    const { dataset = {} } = target
    const { posterSrc = '' } = dataset
    if (posterSrc) {
        shareImage = posterSrc
      }

  }
  return {
    title: '给女神戴上皇冠吧!',
    imageUrl: shareImage,
    path: shareUrl
  }
}
← 2.2 人脸五官分析的环境配置3.2 Canvas绘制技巧,包含小程序与 Web 端 →
  • 选择图片
  • 裁剪图片
  • 图片压缩
  • 图片模糊
  • 分享给朋友
Hi头像
文档
开篇介绍
相关资源
云开发 CloudBaseTaro
关于
联系我们GitHub主页Star
Copyright © 2020. All Rights Reserved.
沪ICP备2022023998号