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

推荐订阅源

爱范儿
爱范儿
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
G
GRAHAM CLULEY
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V2EX - 技术
V2EX - 技术
The Last Watchdog
The Last Watchdog
S
Secure Thoughts
Webroot Blog
Webroot Blog
PCI Perspectives
PCI Perspectives
L
LINUX DO - 最新话题
Hacker News: Ask HN
Hacker News: Ask HN
N
News and Events Feed by Topic
H
Heimdal Security Blog
H
Help Net Security
T
The Blog of Author Tim Ferriss
P
Proofpoint News Feed
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
F
Full Disclosure
小众软件
小众软件
S
Securelist
罗磊的独立博客
NISL@THU
NISL@THU
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cisco Blogs
云风的 BLOG
云风的 BLOG
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
Know Your Adversary
Know Your Adversary
S
Schneier on Security
D
DataBreaches.Net
M
MIT News - Artificial intelligence
V
Vulnerabilities – Threatpost
N
News and Events Feed by Topic
有赞技术团队
有赞技术团队
F
Fortinet All Blogs
T
Tenable Blog
The Register - Security
The Register - Security
C
Check Point Blog
AWS News Blog
AWS News Blog
Cloudbric
Cloudbric
C
CXSECURITY Database RSS Feed - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google Online Security Blog
Google Online Security Blog
博客园 - 叶小钗
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园 - 司徒正美

博客园 - 辰

【破解】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 数据无关。