• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

canvas组件绘制的内容导出生成图片保存到相册后打开异常

android 搞代码 3年前 (2022-03-02) 39次浏览 已收录 0个评论

问题景象:

  canvas组件绘制的内容导出生成图片保留到相册,进入相册,关上该图片看不到绘制的内容,只有彩色的背景图。

下图中绿色背景局部是canvas组件绘制的内容。

保留到相册效果图如下:

问题剖析:

  华为的快利用引擎会在每次调用getContext办法创立ctx,会返回不同的ctx对象,有的外面会有内容,有的外面会为空,获取的时候是随机获取的,可能会获取到空的ctx,导致保留后的图片没有内容,问题代码如下。

canvas绘制代码

<code class="java"> pic() {
      var test = this.$element("canvas");
      var ctx = test.getContext("2d");
      var img = new Image();
      img.src = "http://www.huawei.com/Assets/CBG/img/logo.png";
      img.onload = function () {
        console.log("图片加载实现");
        ctx.drawImage(img, 10, 10, 300, 300, );
      }
      img.onerror = function () {
        console.log("图片加载shibai");
      }
    },
 

保留图片代码

<code class="java">save() {
      var test = this.$element("canvas");
      test.toTempFilePath({
        fileType: "jpg",
        quality: 1.0,
        success: (data) => {
          console.log(`Canvas toTempFilePath success ${data.uri}`)
          console.log(`Canvas toTempFilePath success ${data.tempFilePath}`)
          media.saveToPhotosAlbum({
            uri: data.uri,
            success: function (ret) {
              console.log("save success: ");
            },
            fail: function (data, code) {
              console.log("handling fail, code=" + code);
            }
          })
        },
        fail: (data) => {
          console.log('Canvas toTempFilePath data =' + data);
        },
        complete: () => {
          console.log('Canvas toTempFilePath complete.');
        }
      })
    }

解决办法
把ctx定义为全局变量,对ctx进行非空判断,为空时,初始化保留。

优化代码如下

<code class="java">var ctx; //定义一个全局的
    pic() {
      if (!ctx) { //对空对象进行判断,ctx为空的时候,把“2d”赋给它
        var test = this.$element("canvas");
        var tt = test.getContext("2d");
        ctx = tt;
      }
      var img = new Image();
      img.src = "http://www.huawei.com/Assets/CBG/img/logo.png";
      img.onload = function () {
        console.log("图片加载实现");
        ctx.drawImage(img, 10, 10, 300, 300, );
      }
      img.onerror = function () {
        console.log("图片加载shibai");
      }
    }
  

欲了解更多详情,请参见:

快利用开发领导文档:https://developer.huawei.com/consumer/cn/doc/development/quickApp-Guides/quickapp-whitepaper

快利用canvas组件:

https://developer.huawei.com/consumer/cn/doc/development/quickApp-References/quickapp-component-canvas

画布接口:

https://developer.huawei.com/consumer/cn/doc/development/quickApp-References/quickapp-api-canvas

原文链接: https://developer.huawei.com/consumer/cn/forum/topic/0201404980467060234?fid=18
作者:AppGallery Connect


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:canvas组件绘制的内容导出生成图片保存到相册后打开异常

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址