2赞

评论

收藏

[PHP] uni-app 利用canvas画简单海报并保存图片

开发技术 开发技术 发布于:2023-03-06 13:30 | 阅读数:199 | 评论:0

<template>
  <view class="canvas-box">
    <canvas  class="canvas" :style="{width:`${canvasData.image_Width}px;`,height:`${canvasData.image_Height}px;`}" canvas-id="canvasID"></canvas>
    <view class="footer">
      <view class="preservationBtn" @click="saveImage">保存到相册</view>
    </view>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        imgUrl: '',
        statusBarHeight: 0,
        avatar :'../../static/blue.webp', //头像地址
                erweima:'../../static/erweima.webp',//二维码
                canvasData:{
                    image_Width:0,
                    image_Height:0
                }
      }
    },
    onLoad() {
      let ctx = uni.createCanvasContext('canvasID', this);
             uni.getImageInfo({
                src: 'https://img0.baidu.com/it/u=3269595841,4171123021&fm=253&fmt=auto&app=138&f=JPEG?w=281&h=500', //网络图片用来做背景
                success: (res) => {
                    // console.log(res);
                    this.canvasData.image_Width = res.width
                    this.canvasData.image_Height = res.height
                    ctx.save()
                    ctx.drawImage(res.path, 0, 0, this.canvasData.image_Width, this.canvasData.image_Height)
                    ctx.draw(true)
                    ctx.save()
                    this.drawCircular(ctx, this.avatar, 36, 32, 50, 50) //绘制圆形头像
                    ctx.setFontSize(18)
                    ctx.setFillStyle("#ffffff")
                    ctx.fillText('哆啦A梦没口袋', 98, 65)
                    ctx.font = '20px normal'
                    ctx.setFillStyle("#09CFB1")
                    ctx.fillText('伴我同行', 30, 122)
                    ctx.setFillStyle("#09CFB1")
                    ctx.fillText('一路前行', 60, 150)
                    ctx.fillStyle = "#2C405A";
                    ctx.fillRect(154,358,96,96); 
                    ctx.drawImage(this.erweima, 154,356,96,96) //二维码
                    ctx.draw(true, setTimeout(() => {
                        uni.canvasToTempFilePath({ //将canvas生成图片
                            x: 0,
                            y: 0,
                            width: 281,
                            height: 500,
                            destWidth: 281, //截取canvas的宽度
                            destHeight: 500, //截取canvas的高度
                            canvasId: 'canvasID',
                            success:(res)=> {
                                console.log('res.tempFilePath==========', res.tempFilePath)
                                this.imgUrl = res.tempFilePath
                            },
                            fail:(err)=> {
                              console.log(err)
                            }
                        })
                    }, 500))
                },
            })
    },
    methods: {
            //点击保存到相册
      saveImage() { 
        var _this = this;
        uni.saveImageToPhotosAlbum({
          filePath: _this.imgUrl,
          success() {
            uni.showToast({
                title: "图片已保存图片到相册",
                icon: 'none',
                duration: 2000
            })
          },
                    fail() {
                        uni.hideLoading()
                        uni.showModal({
                            content: '检测到您没打开获取信息功能权限,是否去设置打开?',
                            confirmText: "确认",
                            cancelText: '取消',
                            success: (res) => {
                                if (res.confirm) {
                                    uni.openSetting({
                                        success: (res) => {
                                            console.log(res);
                                            uni.showToast({
                                                title: "请重新点击分享保存图片~",
                                                icon: "none"
                                            });
                                        }
                                    })
                                } else {
                                    uni.showToast({
                                        title: "保存失败,请打开权限功能重试",
                                        icon: "none"
                                    });
                                }
                            }
                        })
                    }
        })
      },
      // 绘制圆形头像
       drawCircular(ctx, url, x, y, width, height) {
                //画圆形头像
                let avatarurl_width = width;
                let avatarurl_heigth = height;
                let avatarurl_x = x;
                let avatarurl_y = y;
                ctx.save(); //先保存状态,已便于画完园再用
                ctx.beginPath(); //开始绘制
                ctx.arc(avatarurl_width / 2 + avatarurl_x, avatarurl_heigth / 2 + avatarurl_y, avatarurl_width / 2, 0, Math
                    .PI * 2, false);
                ctx.setFillStyle("#FFFFFF")
                ctx.fill() //保证图片无bug填充
                ctx.clip(); //剪切
                ctx.drawImage(url, avatarurl_x, avatarurl_y, avatarurl_width, avatarurl_heigth); //推进去图片
                ctx.restore();
            },
    }
  }
</script>
<style lang="scss">
  .canvas-box {
        display: flex;
        flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    background-color: #2C405A;
        image{
            margin-top: 40rpx;
        }
        .canvas{
            margin-top: 40rpx;
        }
    .footer {
            margin-top: 40rpx;
      display: flex;
      align-items: center;
      justify-content: space-between;
      justify-content: center;
      .preservationBtn {
                margin-bottom: 40rpx;
        border: 1rpx solid #ffffff;
        color: #ffffff;
        display: flex;
        align-items: center;
                padding: 20rpx 40rpx;
                text-align: center;
                font-size: 30rpx;
                border-radius: 40rpx;
      }
    }
  }
</style>


关注下面的标签,发现更多相似文章