Wechat applet to take pictures, call the camera, and imitate the camera APP

Wechat mini program to take pictures

Realize taking pictures, switching cameras, picture previews, and taking pictures

first look at the effect

insert image description here

wxml

<!--调用相机拍照-->
<view class="page-container">
    <view class='top'>
        <view class='mask1 {
     
     {ka? "ka" : "" }}'></view>
        <view class='mask2 {
     
     {ka? "ka" : "" }}'></view>
        <camera class="camera" wx:if="{
     
     {isAuth}}" device-position="{
     
     {devicePosition}}" flash="off" binderror="error" />
    </view>
    <view class="line" />
    <view class='bottom'>
        <view class='item' bindtap="preview">
            <image class='img' src="{
     
     {src}}" mode="aspectFill" />
        </view>
        <view class='item'>
            <view class='button' bindtap="takePhoto" hover-class="hover" hover-stop-propagation hover-start-time='0' hover-stay-time='200'> </view>
        </view>
        <view class='item' bindtap="change" mode="widthFix" hover-class="hover" hover-stop-propagation hover-start-time='0' hover-stay-time='200'>
            <image class='shotCut' src="img/shotCut.svg"  />
        </view>
    </view>
</view>

scss

/* pages/camera/camera.wxss */
.page-container {
    
    
    height: 100vh;
    width: 100vw;
    background: #F4F4F4;
    display: flex;
    flex-direction: column;
    align-items: center;
    position: relative;

    .top {
    
    
        width: 100%;
        flex: 1;
        position: relative;

        .camera {
    
    
            width: 100%;
            height: 100%;
        }

        @keyframes ka {
    
    
            0% {
    
    
                height: 0;
            }

            50% {
    
    
                height: 50%;
            }

            100% {
    
    
                height: 0%;
            }
        }

        .mask1 {
    
    
            position: absolute;
            width: 100%;
            height: 0%;
            background-color: rgba($color: #000000, $alpha: 0.5);
            z-index: 10;

            &.ka {
    
    
                animation: ka 0.2s;
            }
        }

        .mask2 {
    
    
            position: absolute;
            width: 100%;
            height: 0%;
            background-color: rgba($color: #000000, $alpha: 0.5);
            transform: rotate(180de);
            bottom: 0;
            z-index: 10;

            &.ka {
    
    
                animation: ka 0.2s;
            }
        }
    }

    .line {
    
    
        background-color: #F4F4F4;
        height: 1rpx;
        width: 100%;
    }

    .bottom {
    
    
        display: grid;
        height: 300rpx;
        width: 100%;
        grid-template-columns: repeat(3, 1fr);
        align-items: center; //垂直方向
        background-color: white;

        .item {
    
    
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100%;

            .img {
    
    
                width: 120rpx;
                height: 120rpx;
                border: 1px solid #CDCDCD;
                border-radius: 10rpx;
                overflow: hidden;
            }

            &.hover {
    
    
                .shotCut {
    
    
                    width: 80rpx;
                    height: 80rpx;
                    background-color: #F0F0F0;
                    border-radius: 10rpx;
                }
            }

            .shotCut {
    
    
                width: 80rpx;
                height: 80rpx;
            }

            .button {
    
    
                background-color: white;
                width: 120rpx;
                height: 120rpx;
                justify-content: center;
                align-items: center;
                background-color: #CDCDCD;
                border: 6px solid #e0e0e0;
                border-radius: 60rpx;
                box-sizing: border-box;

                &.hover {
    
    
                    background-color: white;
                }
            }
        }
    }
}

ts

// pages/camera/camera.ts
Page({
    
    
    /**
     * 页面的初始数据
     */
    data: {
    
    
        isAuth: false,
        src: '',
        devicePosition: "back",
        ka: false
    },
    //切换摄像头
    change() {
    
    
        let position = this.data.devicePosition === 'front' ? "back" : 'front';
        this.setData({
    
     devicePosition: position })
    },
    //预览
    preview() {
    
    
        wx.previewImage({
    
    
            current: this.data.src, 
            urls: [this.data.src] 
        })
    },
    takePhoto() {
    
    
        this.setData({
    
     ka: true })
        setTimeout(() => {
    
    
            this.setData({
    
    
                ka: false
            })
        }, 200);
        const ctx = wx.createCameraContext()
        ctx.takePhoto({
    
    
            quality: 'high',
            success: (res) => {
    
    
                let tempImagePath = res.tempImagePath
                this.setData({
    
    
                    src: tempImagePath
                })
                //保存到本地相册
                // wx.saveFile({
    
    
                //     tempFilePath: tempImagePath,
                //     success: function (res) {
    
    
                //       //返回保存时的临时路径 res.savedFilePath
                //       const savedFilePath = res.savedFilePath
                //       // 保存到本地相册
                //       wx.saveImageToPhotosAlbum({
    
    
                //         filePath: savedFilePath,
                //         success(res) {
    
    
                //             console.log("保存成功",res)
                //          },
                //          fail(res) {
    
    
                //             console.log("保存失败",res)
                //          }
                //       })
                //     },
                //     //保存失败回调(比如内存不足)
                //     fail: console.log
                //   })
            }
        })
    },
    /**
     * 生命周期函数--监听页面加载
     */
    onLoad() {
    
    
        const _this = this
        wx.getSetting({
    
    
            success: res => {
    
    
                if (res.authSetting['scope.camera']) {
    
    
                    // 用户已经授权
                    _this.setData({
    
    
                        isAuth: true
                    })
                } else {
    
    
                    // 用户还没有授权,向用户发起授权请求
                    wx.authorize({
    
    
                        scope: 'scope.camera',
                        success() {
    
     // 用户同意授权
                            _this.setData({
    
    
                                isAuth: true
                            })
                        },
                        fail() {
    
     // 用户不同意授权
                            _this.openSetting().then(res => {
    
    
                                _this.setData({
    
    
                                    isAuth: true
                                })
                            })
                        }
                    })
                }
            },
            fail: res => {
    
    
                console.log('获取用户授权信息失败')
            }
        })
    },
    // 打开授权设置界面
    openSetting() {
    
    
        const _this = this
        let promise = new Promise((resolve, reject) => {
    
    
            wx.showModal({
    
    
                title: '授权',
                content: '请先授权获取摄像头权限',
                success(res) {
    
    
                    if (res.confirm) {
    
    
                        wx.openSetting({
    
    
                            success(res) {
    
    
                                if (res.authSetting['scope.camera']) {
    
     // 用户打开了授权开关
                                    resolve(true)
                                } else {
    
     // 用户没有打开授权开关, 继续打开设置页面
                                    _this.openSetting().then(res => {
    
    
                                        resolve(true)
                                    })
                                }
                            },
                            fail(res) {
    
    
                                console.log(res)
                            }
                        })
                    } else if (res.cancel) {
    
    
                        _this.openSetting().then(res => {
    
    
                            resolve(true)
                        })
                    }
                }
            })
        })
        return promise;
    },

    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady() {
    
    

    },

    /**
     * 生命周期函数--监听页面显示
     */
    onShow() {
    
    

    },

    /**
     * 生命周期函数--监听页面隐藏
     */
    onHide() {
    
    

    },

    /**
     * 生命周期函数--监听页面卸载
     */
    onUnload() {
    
    

    },

Guess you like

Origin blog.csdn.net/Yu1441/article/details/131260536