canvas橡皮擦功能

2022-11-18 17:20:34 浏览数 (1)

 canvas橡皮擦功能

 话不多说,直接上代码

代码语言:javascript复制
<template>
    <view>
        <view class="wrapper">
            <view class="handCenter">
                <canvas class="handWriting" style="height:300px" :disable-scroll="true" @touchstart="uploadScaleStart"
                    @touchmove="uploadScaleMove" canvas-id="handWriting"></canvas>
            </view>
            <view class="colorwarp">
                <image @click="selectColorEvent('black','#1A1A1A')"
                    :src="selectColor === 'black' ? '/static/other/color_black_selected.png' : '/static/other/color_black.png'"
                    :class="[selectColor === 'black' ? 'color_select' : '', 'black-select']"></image>
                <image @click="selectColorEvent('red','#ca262a')"
                    :src="selectColor === 'red' ? '/static/other/color_red_selected.png' : '/static/other/color_red.png'"
                    :class="[selectColor === 'red' ? 'color_select' : '', 'black-select']"></image>
                    
            </view>
            <view class="">
                设置橡皮擦大小
            </view>
            <view class="">
                <slider  value="5" @change="sliderChange" min="1" max="10" show-value />
            </view>
            <view class="warp">
                <view class="" @click="retDraw">
                    重写
                </view>
                <view class="" @click="saveCanvasAsImg">
                    保存
                </view>
                <view class="" @click="previewCanvasImg">
                    预览
                </view>
                <view class="" @click="subCanvas">
                    完成
                </view>
            </view>
        </view>
    </view>
</template>

<script>
    export default {
        data() {
            return {
                canvasName: 'handWriting',
                ctx: '',
                startX: null,
                startY: null,
                canvasWidth: 0,
                canvasHeight: 0,
                selectColor: 'black',
                lineColor: '#1A1A1A', // 颜色
                lineSize: 5, // 笔记倍数
                bgColor:'#fff',
            //    bgImg:'../../static/ceshi.png',
                bgImg:'http://maomao.judianseo.com/ceshi.png'
            };
        },
        onLoad() {
            this.ctx = uni.createCanvasContext("handWriting");
            this.$nextTick(() => {
                uni.createSelectorQuery().select('.handCenter').boundingClientRect(rect => {
                        this.canvasWidth = rect.width;
                        this.canvasHeight = rect.height;
                        /* 将canvas背景设置为 白底,不设置  导出的canvas的背景为透明 */
                    })
                    .exec();
            });
        },
        mounted(){
            this.ctxcanvas();
        },
        methods: {
            //选择大小橡皮擦
            sliderChange(e) {
                console.log('value 发生变化:'   e.detail.value)
                this.lineSize = e.detail.value
            },
            ctxcanvas(){
                const context = this.ctx;
                const query = uni.createSelectorQuery().in(this);
                query.select('.handCenter').boundingClientRect(data => {
                    // console.log("得到布局位置信息"   JSON.stringify(data));
                    context.setFillStyle(this.bgColor);
                    context.fillRect(0, 0, data.width, data.height); //TODO context的宽和高待定
                    context.fill();
                    let img = 'http://maomao.judianseo.com/ceshi.png'
                    console.log(img)
                    context.drawImage(img, 0, 0, data.width, data.height);
                    context.draw();
                }).exec();
            },
            // 笔迹开始
            uploadScaleStart(e) {
                this.startX = e.changedTouches[0].x
                this.startY = e.changedTouches[0].y
                //设置画笔参数
                //画笔颜色
                this.ctx.setStrokeStyle(this.lineColor)
                //设置线条粗细
                this.ctx.setLineWidth(this.lineSize)
                //设置线条的结束端点样式
                this.ctx.setLineCap("round") //'butt'、'round'、'square'
                //开始画笔
                this.ctx.beginPath()
            },
            // 笔迹移动
            uploadScaleMove(e) {
                //取点
                let temX = e.changedTouches[0].x
                let temY = e.changedTouches[0].y
                //画线条
                this.ctx.moveTo(this.startX, this.startY)
                this.ctx.lineTo(temX, temY)
                this.ctx.stroke()
                this.startX = temX
                this.startY = temY
                this.ctx.draw(true)
            },
            /**
             * 重写
             */
            retDraw() {
                this.ctx.clearRect(0, 0, 700, 730);
                this.ctx.draw();
                //设置canvas背景
                this.ctxcanvas();
            //    this.setCanvasBg('#fff');
            },
            /**
             * @param {Object} str
             * @param {Object} color
             * 选择颜色
             */
            selectColorEvent(str, color) {
                this.selectColor = str;
                this.lineColor = color;
            },
            //完成
            subCanvas() {
                uni.canvasToTempFilePath({
                    canvasId: 'handWriting',
                    fileType: 'png',
                    quality: 1, //图片质量
                    success(res) {
                        // console.log(res.tempFilePath, 'canvas生成图片地址');
                        uni.showToast({
                            title: '以保存'
                        });
                        //保存到系统相册
                        uni.saveImageToPhotosAlbum({
                            filePath: res.tempFilePath,
                            success(res) {
                                uni.showToast({
                                    title: '已成功保存到相册',
                                    duration: 2000
                                });
                            }
                        });
                    }
                });
            },
            //保存到相册
            saveCanvasAsImg() {
                uni.canvasToTempFilePath({
                    canvasId: 'handWriting',
                    fileType: 'png',
                    quality: 1, //图片质量
                    success(res) {
                        console.log(res.tempFilePath, 'canvas生成图片地址');
                        uni.saveImageToPhotosAlbum({
                            filePath: res.tempFilePath,
                            success(res) {
                                uni.showToast({
                                    title: '已保存到相册',
                                    duration: 2000
                                });
                            }
                        });
                    }
                });
            },
            //预览
            previewCanvasImg() {
                uni.canvasToTempFilePath({
                    canvasId: 'handWriting',
                    fileType: 'jpg',
                    quality: 1, //图片质量
                    success(res) {
                        uni.previewImage({
                            urls: [res.tempFilePath] //预览图片 数组
                        });
                    }
                });
            },
            //设置canvas背景色  不设置  导出的canvas的背景为透明
            //@params:字符串  color
            setCanvasBg(color) {

                /* 将canvas背景设置为 白底,不设置  导出的canvas的背景为透明 */
                //rect() 参数说明  矩形路径左上角的横坐标,左上角的纵坐标, 矩形路径的宽度, 矩形路径的高度
                //这里是 canvasHeight - 4 是因为下边盖住边框了,所以手动减了写
                this.ctx.rect(0, 0, this.canvasWidth, this.canvasHeight);
                this.ctx.drawImage(this.bgImg, 0, 0, this.canvasWidth, this.canvasHeight)
                // ctx.setFillStyle('red')
                this.ctx.setFillStyle(color);
                this.ctx.fill(); //设置填充
                this.ctx.draw(); //开画
            }
        }
    };
</script>

<style lang="scss" scoped>
    page {
        background: #fbfbfb;
        height: auto;
        overflow: hidden;
    }

    .wrapper {
        width: 100%;
        height: 95vh;
    /*     margin: 30rpx 0;
        overflow: hidden;
        display: flex;
        align-content: center;
        flex-direction: row;
        justify-content: center; */
        font-size: 28rpx;
    }

    .handWriting {
        background: #fff;
        width: 100%;
        height: 95vh;
    }

    .handRight {
        display: inline-flex;
        align-items: center;
    }

    .handCenter {
        border: 4rpx dashed #e9e9e9;
        flex: 5;
        overflow: hidden;
        box-sizing: border-box;
    }

    .handTitle {
        transform: rotate(90deg);
        flex: 1;
        color: #666;
    }

    .handBtn button {
        font-size: 28rpx;
    }

    .handBtn {
        width: 100%;
        height: 95vh;
        display: flex;
        justify-content: space-between;
        align-content: space-between;
        flex: 1;
    }

    .delBtn {
        position: absolute;
        top: 250rpx;
        left: 0rpx;
        transform: rotate(90deg);
        color: #666;
    }
    .subBtn {
        display: inline-flex;
        transform: rotate(90deg);
        background: #008ef6;
        color: #fff;
        margin-bottom: 30rpx;
        text-align: center;
        justify-content: center;
    }

    /*Peach - 新增 - 保存*/

    .saveBtn {
        transform: rotate(90deg);
        color: #666;
    }

    .previewBtn {
        transform: rotate(90deg);
        color: #666;
    }

    .uploadBtn {
        transform: rotate(90deg);
        color: #666;
    }

    /*Peach - 新增 - 保存*/

    .black-select {
        top: 30rpx;
        left: 25rpx;
    }

    .black-select.color_select {
        width: 60rpx;
        height: 60rpx;
    }

    .red-select {
        width: 60rpx;
        height: 60rpx;
    }

    .red-select.color_select {
        width: 60rpx;
        height: 60rpx;
    }
    .colorwarp{
        width: 100%;
        height: 150rpx;
        display: flex;
        align-items: flex-start;
        image{
            width: 60rpx;
            height: 60rpx;
        }
    }
    .warp{
        width: 100%;
        display: flex;
        align-items: center;
        justify-content: space-between;
        view{
            display: flex;
            align-items: center;
            justify-content: center;
            width: 20%;
            height: 80rpx;
            background-color: #008ef6;
            color: #fff;
        }
    }
</style>

0 人点赞