微信小程序:截图组件welCropper,实现原理及其使用

2023-05-16

封面

截图

最近做项目的时候,需要做一个截图功能。用了一个别人写的截图工具,发现截出的图质量下降了,但是我们图片要用来做识别, 需要保证截出的图质量不下降。而且也不支持通过拖动来调整截图框的大小。所以这个截图工具无法满足需求。因为所以,就自己动手写了一个截图组件。

下面介绍一下实现原理和使用方法。

实现原理

组件wxml的层次结构图如下:

hierarchy.png

  • original canvas 用来绘制原图大小的图片,这样能保证截图后的质量不会下降,这个canvas是隐藏的。
  • movable-areamovable-view的容器,是官方提供的拖拽移动组件,用来移动截取框的四个角。这个组件支持多个点同时移动。
  • scale canvas用来绘制适应屏幕比例大小的图片(aspectFit),因为通常原图大小是超过屏幕长宽的。(一开始白线框和图片都在这一层,但后来发现每次移动都要绘制一次图片,这样会造成卡顿、性能下降。所以就想到通过增加一个move canvas来专门绘制白线框来降低绘制图片带来的资源消耗,因为图片是静止的,不需要重复绘制。)
  • move canvas是根据四个movable-view的位置绘制出截图框。

最后截图,通过四个点的位置计算出截图框的位置,然后放大对应原图大小的位置,得到在原图中的(x, y, width, height),最后通过官方提供的canvas接口截图。

wx.canvasToTempFilePath({
  x: x,
  y: y,
  width: w,
  height: h,
  destWidth: w,
  destHeight: h,
  canvasId: 'originalCanvas',
  success: function (res) {
  }
)}

旋转原理

设置旋转圆点
旋转

特点

  • 保证截图质量不会被压缩(也可以选择压缩图)
  • 截图框能够通过拖拽四个角来调整选区大小

使用

假设我们的应用文件结构如下:


./
├── app.js
├── app.json
├── app.wxss
├── pages
│   └── index
│       ├── index.js
│       ├── index.json
│       ├── index.wxml
│       └── index.wxss
└── welCropper
    ├── welCropper.js
    ├── welCropper.wxml
    └── welCropper.wxss

调用组件时,需要传入cropperDatacropperMovableItemscropperChangableData,因为数据和事件都是绑定在Page上的,所以要避免使用组件里面已经被占用的命名。
/pages/index/index.wxml

<!-- 引入组件 -->
<import src="/welCropper/welCropper.wxml" />

<!-- 调用组件 -->
<template is="welCropper" data="{{data:cropperData, cropperMovableItems:cropperMovableItems, cropperChangableData:cropperChangableData}}"></template>

<!-- 用于选择图片,传入cropper中 -->
<button bindtap='selectTap'>select image</button>

/pages/index/index.js

// 获取显示区域长宽
const device = wx.getSystemInfoSync()
const W = device.windowWidth
const H = device.windowHeight - 50

let cropper = require('../../welCropper/welCropper.js');

console.log(device)

Page({
    data: {
    },
    onLoad: function () {
        var that = this
        // 初始化组件数据和绑定事件
        cropper.init.apply(that, [W, H]);
    },
    selectTap() {
        var that = this

        wx.chooseImage({
            count: 1, // 默认9
            sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
            sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
            success(res) {
                const tempFilePath = res.tempFilePaths[0]
                console.log(tempFilePath)
                
                // 将选取图片传入cropper,并显示cropper
                // mode=rectangle 返回图片path
                // mode=quadrangle 返回4个点的坐标,并不返回图片。这个模式需要配合后台使用,用于perspective correction
                let modes = ["rectangle", "quadrangle"]
                let mode = modes[0]   //rectangle, quadrangle
                that.showCropper({
                    src: tempFilePath,
                    mode: mode,
                    sizeType: ['original', 'compressed'],   //'original'(default) | 'compressed'
                    callback: (res) => {
                        if (mode == 'rectangle') {
                            console.log("crop callback:" + res)
                            wx.previewImage({
                                current: '',
                                urls: [res]
                            })
                        }
                        else {
                            wx.showModal({
                                title: '',
                                content: JSON.stringify(res),
                            })

                            console.log(res)
                        }

                        // that.hideCropper() //隐藏,我在项目里是点击完成就上传,所以如果回调是上传,那么隐藏掉就行了,不用previewImage
                    }
                })
            }
        })
    }
})

最后引入组件的样式
/pages/index/index.wxss

@import "/welCropper/welCropper.wxss";

注意

  • 因为wx.canvasToTempFilePath输出的是.png图片,截出来的图有可能远远大于原图(比如3通道图变成4通道的图)

源代码

  • Github:tomfriwel/welCropper,将welCropper文件夹复制到自己项目,引入调用就行了。
  • wepy 版本:github: callmesoul/wepy-corpper

如果出现什么bug、问题或者建议可以告诉我,我会尽量改进。

效果图

效果动图mode=rectangle

效果动图mode=quadrangle

效果图mode=rectangle

如果将movable-view显示出来是这样的:

显示movable-view后

mode=quadrangle

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序:截图组件welCropper,实现原理及其使用 的相关文章

  • 不是技术也能看懂云计算,大数据,人工智能

    我今天要讲这三个话题 xff0c 一个是云计算 xff0c 一个大数据 xff0c 一个人工智能 xff0c 我为什么要讲这三个东西呢 xff1f 因为这三个东西现在非常非常的火 xff0c 它们之间好像互相有关系 xff0c 一般谈云计算
  • 那些在调试器里没问题(在开发环境没问题),但是独立运行却出问题的原因汇总...

    为什么80 的码农都做不了架构师 xff1f gt gt gt 1 静态编译的动态库依赖 xff0c 在调试器中会把程序的起始目录放在当前项目目录 xff0c 因此如果依赖库在当前项目目录则不会出问题 2 权限问题 xff0c 比如调试器可
  • Android-Parcelable理解与使用(对象序列化)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt parcel定义介绍 xff1a android提供了一种新的类型 xff1a parcel xff08 英文解释 xff1a 包裹 xff0c 小包 xff09 xff0
  • 参考ElementUI的文档实现方案,实现自己组件库的说明文档

    实现使用markdown编写的个人组件库说明文档 前一篇文章实现了按需加载封装个人的组件库功能 xff0c 有了组件库 xff0c 当然还要有配套说明文档 xff0c 这样使者用起来才更方便 打包完成的dist目录是最终可放到服务器中 xf
  • 【设计模式】我终于读懂了代理模式。。。

    文章目录 x1f466 代理模式的基本介绍 x1f467 代理模式示意图 x1f469 静态代理 x1f468 应用实例 x1f476 思路分析图解 类图 x1f475 静态代理优缺点 x1f474 动态代理 x1f471 JDK 中生成代
  • 今年读过的还不错的计算机类书籍

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 今年读过的还不错的计算机类书籍 一年又快过去了 xff0c 今年恶补了很多计算机基础知识 xff0c 参kao了网上各种程序员必读书目 xff0c 看下来觉得很有收获 1
  • <ps> ps aux 和ps -aux和 ps -ef的选择

    Linux中的ps命令是Process Status的缩写 ps命令用来列出系统中当前运行的那些进程 ps命令列出的是当前那些进程的快照 xff0c 就是执行ps命令的那个时刻的那些进程 xff0c 如果想要动态的显示进程信息 xff0c
  • python学习笔记(六):常用模块

    一 模块 包 什么是模块 xff1f 模块实质上就是一个python文件 它是用来组织代码的 xff0c 意思就是说把python代码写到里面 xff0c 文件名就是模块的名称 xff0c test py test就是模块名称 什么是包 x
  • Linux经常用到的命令

    1 Linux下用vim打开配置文件乱码 xff0c 在终端输入 xff1a LANG 61 即可 2 查看端口是否被占用 xff1a 3 netstat anp grep port netstat ltn 4 lsof i port 5
  • (部分清帐)关于收到部分还款SAP系统两种处理方法的说明和比较-转

    背景 销售货物给A顾客 同时开出发票16000元 数日后 进行收款作业 但收款金额为15000元 小于原发票金额 此时在系统中做收款 同时处理未清项 F 28收款 输入实际收款金额后进入 34 处理未清项 34 界面 可发现在右下角输入金额
  • Java获取单词的首字母的方法_java – 从句子中的每个单词中提取第一个字母

    我已经开发了一个语音到文本程序 用户可以说一个简短的句子 然后将其插入文本框 如何提取每个单词的首字母然后将其插入文本字段 xff1f 例如 如果用户说 xff1a Hello World 我想在文本框中插入HW 解决方法 如果你有一个字符
  • python学习笔记-(九)模块

    基础知识 1 定义 模块 xff1a 用来从逻辑上组织python代码 xff08 变量 xff0c 函数 xff0c 类 xff0c 逻辑 实现一个功能 xff09 xff0c 本质就是 py结尾的python文件 xff08 文件名 x
  • Ubuntu 查看磁盘空间大小命令<转>

    df h Df命令是linux系统以磁盘分区为单位查看文件系统 xff0c 可以加上参数查看磁盘剩余空间信息 xff0c 命令格式 xff1a df hl 显示格式为 xff1a 文件系统 容量 已用 可用 已用 挂载点 Filesyste
  • linux开机自动启动vnc,怎样实现重启linux后自动启动vncserver服务?

    linux开机自动启动vncserver服务 xff0c 需要先保证VNC安装无问题以及各种配置以及防火墙正常 xff0c 下面是vncserver服务安装 配置以及设置自启动的步骤 xff1a 首先需要检查一下服务器是否已经安装了VNC服
  • 【设计模式】我终于读懂了模板方法模式。。。

    x1f34e 豆浆制作问题 编写制作豆浆的程序 xff0c 说明如下 1 制作豆浆的流程 选材 gt 添加配料 gt 浸泡 gt 放到豆浆机打碎 2 通过添加不同的配料 xff0c 可以制作出不同口味的豆浆 3 选材 浸泡和放到豆浆机打碎这
  • python-Django中连接MySQL数据库及设置用户名密码

    为什么80 的码农都做不了架构师 xff1f gt gt gt 项目和应用创建好以后 xff0c 进入当前的目录所在的文件夹即可操作 xff0c 也可以用pycharm中的Tools工具运行manage py xff0c 本人采用的是运行p
  • gitlab linux环境搭建,Linux搭建gitlab

    由于上一篇搭建的git服务器 xff0c 进行权限控制时很不方便 xff0c 决定重新搭建gitlab作为管理项目工具 xff0c 有web页面操作起来也很方便 本文只记录安装过程以备后用 一 服务端 配置服务yum源 vim etc yu
  • 林帆:Docker运行GUI软件的方法

    欢迎关注大数据和人工智能技术文章发布的微信公众号 xff1a 清研学堂 xff0c 在这里你可以学到夜白 xff08 作者笔名 xff09 精心整理的笔记 xff0c 让我们每天进步一点点 xff0c 让优秀成为一种习惯 xff01 继上周
  • python内部函数如何修改外部函数变量

    2019独角兽企业重金招聘Python工程师标准 gt gt gt python3 nonlocal关键字 def func result 61 10 def down nonlocal result result 61 result 1
  • 解决bug的能力

    解决问题的高手都会努力保持明白的基础上加上一点不明白的现场模型 xff0c 所以他很喜欢把一些无聊的干扰因素直接删除掉 英语报错信息只能一边看一边读 xff0c 永远告诉自己 xff0c 我还没有读懂 转载于 https blog 51ct

随机推荐

  • Cannot open channel to 3 at election address :3888 java.net.ConnectException: Connection refused (Co...

    关于Linux中搭建分布式时可能遇到的问题 这个问题来自于今天安装zookeeper时踩的一个大坑 xff0c 害的我花了一天时间 在搭建zookeeper的分布式时 xff0c 往往要进行这样的配置 xff1a server 1 61 h
  • Xgboost 模型保存和载入()

    https blog csdn net u012884015 article details 78653178 xgb model get booster save model 39 xgb model 39 tar 61 xgb Boos
  • 新版福昕阅读器(Foxit Reader)启动速度慢解决办法

    新版福昕阅读器 xff08 FoxitReader xff09 启动速度慢解决办法之前喜欢使用福昕阅读器的原因就是看中了其小巧 xff0c 可是最近版本的阅读器打开速度变得慢了很多 xff08 不是电脑配置问题 xff09 xff0c 比A
  • 漫谈 SLAM 技术(上)

    欢迎大家前往腾讯云社区 xff0c 获取更多腾讯海量技术实践干货哦 作者 xff1a 解洪文 导语 随着最近几年机器人 无人机 无人驾驶 VR AR的火爆 xff0c SLAM技术也为大家熟知 xff0c 被认为是这些领域的关键技术之一 本
  • 【设计模式】我终于读懂了命令模式。。。

    文章目录 x1f436 智能生活项目需求 x1f42d 命令模式基本介绍 x1f439 命令模式的原理类图 x1f430 对原理类图的说明 即 命名模式的角色及职责 x1f43a 命令模式解决智能生活项目 x1f438 下面我们跟着代码de
  • css制作从下往上逐渐显示的div

    html代码 span class hljs tag lt span class hljs name div span span class hljs attr class span 61 span class hljs string 34
  • 清除redis缓存的命令,redis常用命令

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 清除redis缓存的命令 xff0c redis常用命令 Redis 命令 xff1a flushall gt 清空整个 Redis 服务器的数据 删除所有数据库的所有 k
  • R语言做正态分布检验

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 首先准备两个样本 code set seed 0 a lt runif 100 min 61 3 max 61 3 b lt rnorm 100 mean 61 0 sd
  • node-gyp安装 报错if not defined npm_config_node_gyp

    解决if not defined npm config node gyp 1 br npm install g node gyp 2 npm config set node gyp 34 node C Users me AppData Ro
  • Oracle在Windows上的运行问题分析和解决

    Oracle大型数据库系统在AIX UNIX上的实战详解 集中讨论的继续 做了一周关于Oracle在32位windows上实施的培训 xff0c 恰好期间有几位Oracle用户邮件询问关于Windows系统调整问题 正好吧 xff0c 把准
  • iOS UIImage 图片局部拉伸的一些学习要点

    之前 做纯色局部拉伸 通过 top bottom left right 相交的阴影拉伸 屡试不爽 实施方法 imageView image 61 UIImage imageNamed 64 34 icon helper palace day
  • Python 查看模块的帮助文档,方法和帮助信息

    参考链接 xff1a https blog csdn net u013810296 article details 55509284 这里介绍下python自带的查看帮助功能 xff0c 可以在编程时不中断地迅速找到所需模块和函数的使用方法
  • 移动电源、3G路由拆机

    这款电源 4400mAh xff0c 淘宝也就八十元左右 xff0c 可以作为无线路由使用 xff0c 可以插 3G 网卡 xff0c 总的来说还算不错 xff0c 关键是外观精美 xff0c 网上一堆和华美 A100 那样的 xff0c
  • FreeRTOS——任务调度—抢占式,时间片和合作式

    以下转载自安富莱电子 xff1a http forum armfly com forum php 本章教程为大家将介绍 FreeRTOS 操作系统支持的任务调度方式 xff1a 抢占式 xff0c 时间片和合作式 xff0c 这部分 算是
  • Linux无网络怎么安装软件,解决无网络环境使用yum本地源安装软件

    搞运维的朋友经常会遇到单位的服务器使用的是内网 xff0c 编译安装时间长 xff0c 麻烦些 xff0c 使用yum安装相对简单 xff0c 由于不能联网所以配置本地yum源是必要的 其实配置本地源是很简单的 xff0c 只需要挂载上系统
  • 到了这个年纪,就应该阅读Spring源码了,源码阅读指南-编译加运行

    文章目录 到了那个年纪 xff0c 就应该阅读Spring源码了 x1f604 第一步 xff0c clone x1f606 第二步 xff0c 使用idea打开项目 x1f60a gradle介绍 xff08 插叙手法 xff09 x1f
  • 页面加载完成

    1 document ready function alert 34 页面加载完成 xff01 34 简写 xff1a function alert 34 页面加载完成 xff01 34 2 原生JS方法 window nl ad 61 f
  • Java写的斗地主游戏源码

    源码下载在最后 我们的前年的课设要求做一个斗地主程序 xff0c 当时正在愁如何做界面 xff0c 当时刚好在学习C xff0c 于是就用C 完成了这个程序 一方面 xff0c 当时我C 功底还很差 xff08 其实现在也不怎么样 xff0
  • 加密的m3u8、ts文件合并

    加密后的ts文件不能直接合并或播放 xff0c 需要使用key对每个ts文件进行解密 分为两种情况 xff1a 1 如果ts文件已经全部下载好 xff0c 则可以直接在本地通过ffmpeg快速解密合并 2 如果ts文件没有下载好 xff0c
  • 微信小程序:截图组件welCropper,实现原理及其使用

    最近做项目的时候 xff0c 需要做一个截图功能 用了一个别人写的截图工具 xff0c 发现截出的图质量下降了 xff0c 但是我们图片要用来做识别 需要保证截出的图质量不下降 而且也不支持通过拖动来调整截图框的大小 所以这个截图工具无法满