最近有一個(gè)項(xiàng)目需要對(duì)拍照界面進(jìn)行自定義,之前使用的是html寫的項(xiàng)目界面,但是在html中想要自定義拍照界面十分的困難,于是想到了使用微信小程序來實(shí)現(xiàn)拍照界面的自定義
在微信小程序中實(shí)現(xiàn)自定義拍照功能主要使用到如下的組件和API
1:camera組件
常見的屬性有:
(1):mode
應(yīng)用模式,只在初始化時(shí)有效,不能動(dòng)態(tài)變更,參數(shù)有:normal(相機(jī)模式),scanCode(掃碼模式) ,默認(rèn)為normal
(2):device-position
攝像頭朝向,參數(shù)有front(前置),back(后置),默認(rèn)為back
(3):flash
閃關(guān)燈,參數(shù)有:auto(自動(dòng),手機(jī)相機(jī)目前的閃光燈狀態(tài)), on(打開閃光燈), off(關(guān)閉閃光燈),默認(rèn)為auto
(4):binderror
用戶不允許使用攝像頭時(shí)觸發(fā)事件
例如:
<camera device-position="back" flash="off" > </camera>
2:拍攝照片API(CameraContext.takePhoto)
參數(shù)說明:
(1)quality
成像質(zhì)量,參數(shù)有:high(高質(zhì)量),normal(普通質(zhì)量),low(低質(zhì)量),默認(rèn)為normal
(2)success
接口調(diào)用成功的回調(diào)函數(shù)
(3)fail
接口調(diào)用失敗的回調(diào)函數(shù)
例如:
//拍攝照片
wx.createCameraContext().takePhoto({
quality: 'high',//拍攝質(zhì)量(high:高質(zhì)量 normal:普通質(zhì)量 low:高質(zhì)量)
success: (res) => {
//拍攝成功
//照片文件的臨時(shí)文件
var file = res.tempImagePath;
},
fail: (res) => {
//拍攝失敗
},
})
3:上傳拍照文件API(uploadFile)
參數(shù)說明:
url:上傳文件的服務(wù)器地址
filePath:要上傳文件資源的路徑 (本地路徑)
name:文件對(duì)應(yīng)的 key,開發(fā)者在服務(wù)端可以通過這個(gè) key 獲取文件的二進(jìn)制內(nèi)容
formData:HTTP 請(qǐng)求中其他額外的參數(shù)
success:接口調(diào)用成功的回調(diào)函數(shù)
fail:接口調(diào)用失敗的回調(diào)函數(shù)
例如:
wx.chooseImage({
success (res) {
const tempFilePaths = res.tempFilePaths
wx.uploadFile({
url: 'https://example.weixin.qq.com/upload', //僅為示例,非真實(shí)的接口地址
filePath: tempFilePaths\[0\],
name: 'file',
formData: {
'user': 'test'
},
success: (res) => {
//上傳成功
},
fail: function(t) {
//上傳失敗
},
})
}
})
4:根據(jù)如上我們就可以實(shí)現(xiàn)在微信小程序中自定義拍照頁面來實(shí)現(xiàn)上傳
(1):wxml端:
<!--pages/web/index.wxml-->
<camera binderror="handleCameraError" device-position="{{devicePosition}}" flash="off" wx:if="{{authCamera}}">
<cover-view>
<cover-image class="line" src="/images/outline.png"></cover-image>
</cover-view>
</camera>
<button type="primary" bindtap="takePhoto">拍照</button>
<button type="primary" bindtap="reverseCamera">攝像頭切換</button>
<view class="error-handler" wx:if="{{!authCamera}}">
<button class="nobtn" openType="openSetting">打開相機(jī)授權(quán)</button>
</view>
(2):js端
// pages/web/index.js
Page({
/\*\*
\* 頁面的初始數(shù)據(jù)
\*/
data: {
devicePosition:'back',
authCamera: false,//用戶是否運(yùn)行授權(quán)拍照
},
handleCameraError:function() {
wx.showToast({
title:'用戶拒絕使用攝像頭',
icon: 'none'
})
},
reverseCamera:function(){
this.setData({
devicePosition: "back" === this.data.devicePosition ? "front" : "back"
});
},
takePhoto:function() {
//拍攝照片
wx.createCameraContext().takePhoto({
quality: 'high',//拍攝質(zhì)量(high:高質(zhì)量 normal:普通質(zhì)量 low:高質(zhì)量)
success: (res) => {
//拍攝成功
//照片文件的臨時(shí)文件
var file = res.tempImagePath;
console.log(file)
//上傳圖片到服務(wù)器
wx.uploadFile({
url: 'XXXX', //上傳服務(wù)器地址
filePath: file,
name: 'file',
formData: {
'test': 'test'
},
success: (res) => {
//上傳成功
},
fail: function(t) {
//上傳失敗
},
})
},
fail: (res) => {
//拍攝失敗
},
})
},
/\*\*
\* 生命周期函數(shù)--監(jiān)聽頁面顯示
\*/
onShow: function () {
wx.getSetting({
success: (res) => {
if (res.authSetting\["scope.camera"\]) {
this.setData({
authCamera:true,
})
} else {
this.setData({
authCamera:false,
})
}
}
});
},
})
具體相信如下:
在接口處理上傳文件的流程和正常的表單上傳文件流程相同,這里就不多敘述了