封面
最近做項目的時候,需要做一個截圖功能。用了一個別人寫的截圖工具,發(fā)現(xiàn)截出的圖質(zhì)量下降了,但是我們圖片要用來做識別, 需要保證截出的圖質(zhì)量不下降。而且也不支持通過拖動來調(diào)整截圖框的大小。所以這個截圖工具無法滿足需求。因為所以,就自己動手寫了一個截圖組件。
下面介紹一下實現(xiàn)原理和使用方法。
實現(xiàn)原理
組件wxml的層次結(jié)構(gòu)圖如下:
hierarchy.png
-
original canvas 用來繪制原圖大小的圖片,這樣能保證截圖后的質(zhì)量不會下降,這個canvas是隱藏的。
-
movable-area是movable-view的容器,是官方提供的拖拽移動組件,用來移動截取框的四個角。這個組件支持多個點同時移動。
-
scale canvas用來繪制適應(yīng)屏幕比例大小的圖片(aspectFit),因為通常原圖大小是超過屏幕長寬的。
-
move canvas是根據(jù)四個movable-view的位置繪制出截圖框。
最后截圖,通過四個點的位置計算出截圖框的位置,然后放大對應(yīng)原圖大小的位置,得到在原圖中的(x, y, width, height),最后通過官方提供的canvas接口截圖。
-
wx.canvasToTempFilePath({
-
x: x,
-
y: y,
-
width: w,
-
height: h,
-
destWidth: w,
-
destHeight: h,
-
canvasId: 'originalCanvas',
-
success: function (res) {
-
}
-
)}
最后截圖,通過四個點的位置計算出截圖框的位置,然后放大對應(yīng)原圖大小的位置,得到在原圖中的(x, y, width, height),最后通過官方提供的canvas接口截圖。
特點
-
保證截圖質(zhì)量不會被壓縮
-
截圖框能夠通過拖拽來調(diào)整大小
使用
假設(shè)我們的應(yīng)用文件結(jié)構(gòu)如下:
-
./
-
├── app.js
-
├── app.json
-
├── app.wxss
-
├── pages
-
│ └── index
-
│ ├── index.js
-
│ ├── index.json
-
│ ├── index.wxml
-
│ └── index.wxss
-
└── welCropper
-
├── welCropper.js
-
├── welCropper.wxml
-
└── welCropper.wxss
調(diào)用組件時,需要傳入cropperData和cropperMovableItems,因為數(shù)據(jù)和事件都是綁定在Page上的,所以要避免使用組件里面已經(jīng)被占用的命名。 /pages/index/index.wxml
-
<!-- 引入組件 -->
-
<import src="/welCropper/welCropper.wxml" />
-
-
<!-- 調(diào)用組件 -->
-
<template is="welCropper" data="{{data:cropperData, cropperMovableItems:cropperMovableItems}}"></template>
-
-
<!-- 用于選擇圖片,傳入cropper中 -->
-
<button bindtap='selectTap'>select image</button>
/pages/index/index.js
-
// 獲取顯示區(qū)域長寬
-
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
-
// 初始化組件數(shù)據(jù)和綁定事件
-
cropper.init.apply(that, [W, H]);
-
},
-
selectTap() {
-
var that = this
-
-
wx.chooseImage({
-
count: 1, // 默認(rèn)9
-
sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖,默認(rèn)二者都有
-
sourceType: ['album', 'camera'], // 可以指定來源是相冊還是相機,默認(rèn)二者都有
-
success(res) {
-
const tempFilePath = res.tempFilePaths[0]
-
console.log(tempFilePath)
-
-
// 將選取圖片傳入cropper,并顯示cropper
-
that.showCropper(tempFilePath, (resPath) => {
-
console.log("crop callback:" + resPath)
-
wx.previewImage({
-
current: '',
-
urls: [resPath]
-
})
-
-
// that.hideCropper() //隱藏,我在項目里是點擊完成就上傳,所以如果回調(diào)是上傳,那么隱藏掉就行了,不用previewImage
-
})
-
}
-
})
-
}
-
})
最后引入組件的樣式 /pages/index/index.wxss
-
@import "/welCropper/welCropper.wxss";
-
效果圖
效果動圖
截圖
如果將movable-view顯示出來是這樣的:
顯示movable-view后
源代碼: Github:tomfriwel/welCropper,將welCropper文件夾復(fù)制到自己項目,引入調(diào)用就行了。
如果出現(xiàn)什么bug、問題或者建議可以告訴我,我會盡量改進。
|