uni-app canvas在vue3环境保存为图片到相册报错

发布于 1周前 作者 bupafengyu 来自 Uni-App

uni-app canvas在vue3环境保存为图片到相册报错

这段代码在 vue2 中能够正常运行,也能保存为图片到相册,但是 vue3 环境报错:

"canvasToTempFilePath:fail Failed to execute 'drawImage' on 'CanvasRenderingContext2D': The provided value is not of type '(CSSImageValue or HTMLImageElement or SVGImageElement or HTMLVideoElement or HTMLCanvasElement or ImageBitmap or OffscreenCanvas or VideoFrame)'"

是在微信小程序模拟器中出现的

代码如下:

<template>  
    <view>  
        <canvas style="width: 300px; height: 400px;"  
            canvas-id="firstCanvas" id="firstCanvas"></canvas>  

        <button @click="saveImage11">保存</button>  
    </view>  

</template>  

<script>  
    export default {  
        data() {  
            return {  
                selectId: 'firstCanvas',  
                scrollLeft: 0,  
                canvas: null  
            }  
        },  
        props: ['content'],  
        watch: {  
            content(value) {  
                if (value) {  
                    this.createCanvas11()  
                }  
            }  
        },  
        methods: {  
            // 生成canvas  
            createCanvas11() {  
                const ctx = uni.createCanvasContext('firstCanvas', this);  
                ctx.clearRect(0, 0, 300, 400)  
                ctx.fillStyle = "#FFFFFF";  
                ctx.fillRect(0, 0, 300, 400);  

                function findBreakPoint(text, width, context) {  
                    var min = 0;  
                    var max = text.length - 1;  
                    while (min <= max) {  
                        var middle = Math.floor((min + max) / 2);  
                        var middleWidth = context.measureText(text.substr(0, middle)).width;  
                        var oneCharWiderThanMiddleWidth = context.measureText(text.substr(0, middle + 1)).width;  
                        if (middleWidth <= width

2 回复

你给的代码不够完整,不能运行,能提供更多内容吗,或者你进行删减代码,看看具体报错是哪一行有问题。 切换成 type=2d 的新版写法有没有问题?


uni-app 中使用 canvas 绘制内容并保存为图片到相册时,可能会遇到一些报错。以下是一些常见的问题及解决方案,特别是在 Vue3 环境中。

1. 权限问题

在保存图片到相册时,需要确保应用有写入相册的权限。如果没有权限,保存操作会失败。

解决方案:

manifest.json 中配置权限:

{
  "app-plus": {
    "permissions": [
      "writePhotosAlbum"
    ]
  }
}

在代码中动态请求权限:

uni.getSetting({
  success(res) {
    if (!res.authSetting['scope.writePhotosAlbum']) {
      uni.authorize({
        scope: 'scope.writePhotosAlbum',
        success() {
          console.log('授权成功');
        },
        fail() {
          console.log('授权失败');
        }
      });
    }
  }
});

2. Canvas 绘制问题

确保 canvas 绘制的内容已经完成,并且在保存之前已经正确渲染。

解决方案:

canvas 绘制完成后,使用 uni.canvasToTempFilePathcanvas 内容转换为临时文件路径,然后再保存到相册。

const canvas = uni.createCanvasContext('myCanvas');
canvas.draw(); // 绘制内容

canvas.draw(false, () => {
  uni.canvasToTempFilePath({
    canvasId: 'myCanvas',
    success(res) {
      const tempFilePath = res.tempFilePath;
      uni.saveImageToPhotosAlbum({
        filePath: tempFilePath,
        success() {
          console.log('保存成功');
        },
        fail(err) {
          console.log('保存失败', err);
        }
      });
    },
    fail(err) {
      console.log('生成临时文件失败', err);
    }
  });
});

3. Canvas ID 问题

确保 canvasid 与代码中的 canvasId 一致。

解决方案:

template 中正确设置 canvasid

<canvas canvas-id="myCanvas" id="myCanvas" style="width: 300px; height: 300px;"></canvas>

4. 异步问题

canvas 的绘制是异步的,确保在绘制完成后再进行保存操作。

解决方案:

使用 canvas.draw 的回调函数来确保绘制完成后再进行保存操作,如上文所示。

5. Vue3 环境问题

Vue3 中,canvas 的上下文获取方式与 Vue2 略有不同,确保正确获取 canvas 上下文。

解决方案:

Vue3 中,可以使用 ref 来获取 canvas 元素:

import { ref, onMounted } from 'vue';

export default {
  setup() {
    const canvasRef = ref(null);

    onMounted(() => {
      const canvas = uni.createCanvasContext('myCanvas', canvasRef.value);
      canvas.draw(); // 绘制内容

      canvas.draw(false, () => {
        uni.canvasToTempFilePath({
          canvasId: 'myCanvas',
          success(res) {
            const tempFilePath = res.tempFilePath;
            uni.saveImageToPhotosAlbum({
              filePath: tempFilePath,
              success() {
                console.log('保存成功');
              },
              fail(err) {
                console.log('保存失败', err);
              }
            });
          },
          fail(err) {
            console.log('生成临时文件失败', err);
          }
        });
      });
    });

    return {
      canvasRef
    };
  }
};
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!