惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
V
Visual Studio Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
P
Proofpoint News Feed
Last Week in AI
Last Week in AI
U
Unit 42
W
WeLiveSecurity
博客园 - Franky
Recent Announcements
Recent Announcements
Hacker News - Newest:
Hacker News - Newest: "LLM"
Attack and Defense Labs
Attack and Defense Labs
月光博客
月光博客
The Cloudflare Blog
Spread Privacy
Spread Privacy
腾讯CDC
P
Privacy International News Feed
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
NISL@THU
NISL@THU
T
Troy Hunt's Blog
小众软件
小众软件
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Microsoft Security Blog
Microsoft Security Blog
L
Lohrmann on Cybersecurity
Webroot Blog
Webroot Blog
Y
Y Combinator Blog
量子位
P
Palo Alto Networks Blog
N
News and Events Feed by Topic
V
Vulnerabilities – Threatpost
K
Kaspersky official blog
IT之家
IT之家
T
Threat Research - Cisco Blogs
Cloudbric
Cloudbric
云风的 BLOG
云风的 BLOG
C
Check Point Blog
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
G
Google Developers Blog
S
Secure Thoughts

博客园 - 辰

【破解】webix 9.1.6 试用版 弹窗提示破解教程 【经验】微信小程序 canvas 图片拉伸 对 wx.canvasToTempFilePath 截图导出的影响。 [入门到吐槽系列] 微信小程序 上传图片 前端压缩 保存到云存储 使用Canvas新API的巨坑! [入门到吐槽系列] 微信小程序 敏感违规图片检测 mediaCheckAsync,客服接口 消息推送 的各种坑分享! [突发救援] 网站突发被腾讯云因未备案 屏蔽,60分钟内抢救恢复成功! [入门到吐槽系列] Webix 10分钟入门 二 表单Form的使用 [入门到吐槽系列] Webix 10分钟入门 一 管理后台制作 租了一台华为云耀云服务器,却直接被封公网ip,而且是官方的bug导致! 从事游戏行业也有10年,让我来说下游戏的本质,为什么上瘾。 Egret 生成 自带EUI 的微信小游戏 踩坑! JMeter入门 像屎一样的 Spring Boot入门,总算有反应了 亲测有效!一种完美动态阈值白平衡算法 Java实现。 Windows 2008 - 由于管理员设置的策略,该磁盘处于脱机状态 egret调用页面js的方法。 egret GUI 和 egret Wing 是我看到h5 最渣的设计 Egret 集成第三方库 记录 乐高情报站7月份抽奖数据汇总。 今天是第二个最值得纪念的日子。
【经验】微信小程序Canvas 的画图尺寸学习研究。
· 2022-03-12 · via 博客园 - 辰

概述

微信小程序的 Canvas 实在太难用,这里记录一些场景经验,提高认识。

画图的尺寸问题

在页面声明一个 canvas

<canvas id="previewCanvas" c type="2d" style="width: {{canvasWidth}}px; height: {{canvasHeight}}px;">
</canvas>

封装一个画图片到 canvas 的代码

  // {canvasId, width, height, canvasWidth, canvasHeight, path, success}
  drawImageToCanvas: function (config) {
    const query = wx.createSelectorQuery();
    query.select(config.canvasId).fields({
      node: true,
      size: true
    }).exec(e1 => {
      console.log('图像处理', config.canvasId, 'wx.createSelectorQuery', e1);

      const canvas = e1[0].node;
      const ctx = canvas.getContext('2d');

      ctx.clearRect(0, 0, e1[0].width, e1[0].height);
      ctx.mozImageSmoothingEnabled = false;
      ctx.webkitImageSmoothingEnabled = false;
      ctx.msImageSmoothingEnabled = false;
      ctx.imageSmoothingEnabled = false;

      // 必须设置为 canvas 初始化的大小,否则图片会被拉伸
      // 注意,在 html 设置的 width、height 是显示大小,这里设置的是画图大小
      // 如果这里的尺寸比 html 的小,就会放大;否则缩小
      canvas.width = config.canvasWidth;
      canvas.height = config.canvasHeight;

      if (config.backgroundHex) {
        ctx.fillStyle = config.backgroundHex;
        ctx.fillRect(0, 0, config.width, config.height);
      }

      // 如果有图片,才画图
      if (config.path) {
        const img = canvas.createImage();
        img.onload = (e2) => {
          console.log("图像处理", config.canvasId, 'img.onload', e2);

          // 默认把图片全部像素画在目标尺寸上
          ctx.drawImage(img, 0, 0, config.width, config.height);
          if (config.success) config.success(canvas);
        };
        img.src = config.path;
      } else {
        if (config.success) config.success(canvas);
      }
    });

测试用例:

已知页面声明的 canvas 的 style 长宽都是300;图片的长宽是:602x397。

目前已知的长宽包括了:

  • 界面长宽:界面 html 的 style 声明的长宽
  • 代码长宽:代码对 canvas 设置的长宽
  • 图片尺寸:drawImage 的长宽

测试1:代码长宽=界面长宽,图片尺寸=图片尺寸

  onLoad: function (options) {
    var that = this;
    var url = "cloud://wxss-brick-0f77b1.7778-wxss-brick-0f77b1-1257336119/images/image1.jpeg";
    wx.getImageInfo({
      src: url,
      success: function (e2) {
        console.log('图像处理', 'getImageInfo', e2);
        that.drawImageToCanvas({
          canvasId: '#previewCanvas',
          width: e2.width,
          height: e2.height,
          canvasWidth: 300,
          canvasHeight: 300,
          path: e2.path,
          success: function () {},
        });
      },
    });
  },

结论:图片没有压缩拉伸,超出了界面显示范围。

测试2:代码长宽=图片尺寸,图片尺寸=图片尺寸

  onLoad: function (options) {
    var that = this;
    var url = "cloud://wxss-brick-0f77b1.7778-wxss-brick-0f77b1-1257336119/images/image1.jpeg";
    wx.getImageInfo({
      src: url,
      success: function (e2) {
        console.log('图像处理', 'getImageInfo', e2);
        that.drawImageToCanvas({
          canvasId: '#previewCanvas',
          width: e2.width,
          height: e2.height,
          canvasWidth: e2.width,
          canvasHeight: e2.height,
          path: e2.path,
          success: function () {},
        });
      },
    });
  },

结论:图片填满了整个 canvas,但是被拉伸了。页面的尺寸决定了图片是否拉伸。

测试3:代码长宽=图片尺寸,图片尺寸=界面长宽

  onLoad: function (options) {
    var that = this;
    var url = "cloud://wxss-brick-0f77b1.7778-wxss-brick-0f77b1-1257336119/images/image1.jpeg";
    wx.getImageInfo({
      src: url,
      success: function (e2) {
        console.log('图像处理', 'getImageInfo', e2);
        that.drawImageToCanvas({
          canvasId: '#previewCanvas',
          width: 300,
          height: 300,
          canvasWidth: e2.width,
          canvasHeight: e2.height,
          path: e2.path,
          success: function () {},
        });
      },
    });
  },

结论:图片没有填满整个 canvas,但是也是被压缩了

测试4:代码长宽=界面长宽,图片尺寸=界面长宽

  onLoad: function (options) {
    var that = this;
    var url = "cloud://wxss-brick-0f77b1.7778-wxss-brick-0f77b1-1257336119/images/image1.jpeg";
    wx.getImageInfo({
      src: url,
      success: function (e2) {
        console.log('图像处理', 'getImageInfo', e2);
        that.drawImageToCanvas({
          canvasId: '#previewCanvas',
          width: 300,
          height: 300,
          canvasWidth: 300,
          canvasHeight: 300,
          path: e2.path,
          success: function () {},
        });
      },
    });
  },

 效果等同2.

测试结论:

canvas 代码设置的尺寸与图片的尺寸决定了图片在画布的表现;

界面尺寸仅仅是显示问题,和 canvas 数据无关。