最近有一個項目需要對拍照界面進行自定義,之前使用的是html寫的項目界面,但是在html中想要自定義拍照界面十分的困難,于是想到了使用微信小程序來實現(xiàn)拍照界面的自定義
在微信小程序中實現(xiàn)自定義拍照功能主要使用到如下的組件和API
1:camera組件
常見的屬性有:
(1):mode
應用模式,只在初始化時有效,不能動態(tài)變更,參數(shù)有:normal(相機模式),scanCode(掃碼模式) ,默認為normal
(2):device-position
攝像頭朝向,參數(shù)有front(前置),back(后置),默認為back
(3):flash
閃關燈,參數(shù)有:auto(自動,手機相機目前的閃光燈狀態(tài)), on(打開閃光燈), off(關閉閃光燈),默認為auto
(4):binderror
用戶不允許使用攝像頭時觸發(fā)事件
例如:
<camera device-position="back" flash="off" > </camera>
2:拍攝照片API(CameraContext.takePhoto)
參數(shù)說明:
(1)quality
成像質量,參數(shù)有:high(高質量),normal(普通質量),low(低質量),默認為normal
(2)success
接口調用成功的回調函數(shù)
(3)fail
接口調用失敗的回調函數(shù)
例如:
//拍攝照片
wx.createCameraContext().takePhoto({
quality: 'high',//拍攝質量(high:高質量 normal:普通質量 low:高質量)
success: (res) => {
//拍攝成功
//照片文件的臨時文件
var file = res.tempImagePath;
},
fail: (res) => {
//拍攝失敗
},
})
3:上傳拍照文件API(uploadFile)
參數(shù)說明:
url:上傳文件的服務器地址
filePath:要上傳文件資源的路徑 (本地路徑)
name:文件對應的 key,開發(fā)者在服務端可以通過這個 key 獲取文件的二進制內容
formData:HTTP 請求中其他額外的參數(shù)
success:接口調用成功的回調函數(shù)
fail:接口調用失敗的回調函數(shù)
例如:
wx.chooseImage({
success (res) {
const tempFilePaths = res.tempFilePaths
wx.uploadFile({
url: 'https://example.weixin.qq.com/upload', //僅為示例,非真實的接口地址
filePath: tempFilePaths\[0\],
name: 'file',
formData: {
'user': 'test'
},
success: (res) => {
//上傳成功
},
fail: function(t) {
//上傳失敗
},
})
}
})
4:根據(jù)如上我們就可以實現(xiàn)在微信小程序中自定義拍照頁面來實現(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">打開相機授權</button>
</view>
(2):js端
// pages/web/index.js
Page({
/\*\*
\* 頁面的初始數(shù)據(jù)
\*/
data: {
devicePosition:'back',
authCamera: false,//用戶是否運行授權拍照
},
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',//拍攝質量(high:高質量 normal:普通質量 low:高質量)
success: (res) => {
//拍攝成功
//照片文件的臨時文件
var file = res.tempImagePath;
console.log(file)
//上傳圖片到服務器
wx.uploadFile({
url: 'XXXX', //上傳服務器地址
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,
})
}
}
});
},
})
具體相信如下:
在接口處理上傳文件的流程和正常的表單上傳文件流程相同,這里就不多敘述了