Canvas拓展

Canvas


Canvas 在基于Web的图像显示方面比 Flash 更加立体、还有图形编辑器的应用,比如可视化组态编辑工具HT,它完全基于Canvas绘制。

最后模拟器的应用,模拟器产品可以完全由 canvas 来实现,视觉效果上更加逼真模拟实际生活中的工具,进一步优化物联网环境下的使用体验,降低使用者的学习成本。

总之未来Canvas的应用只会越来越普遍,所以具备Canvas这门技术是必不可缺的



Canvas实现下载

canvas.toDataURL('image/png')
默认设定创建一个 PNG 图片。

canvas.toDataURL('image/jpeg', quality)
也可以设定为创建一个 JPG 图片。还能有选择地提供从 0 到 1 的品质量,1 表示最好品质,0 表示品质最差基本无法辨别。

当我们用toDataURL()方法从画布中生成了一个数据链接后,我们可以将它用于元素显示出来,也可以将它放在一个有 download 属性的超链接里用于保存到本地。

const Img = document.querySelector('img')

document.querySelector('#button').addEventListener('click', () => {
   var url =  canvas.toDataURL('image/png', 1)
    Img.src = url;
  // 将base64转换为文件对象
  var arr = url.split(",")
  var mime = arr[0].match(/:(.*?);/)[1] // 此处得到的为文件类型
  var bstr = atob(arr[1]) // 此处将base64解码
  var n = bstr.length
  var u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  // 通过以下方式将以上变量生成文件对象,三个参数分别为文件内容、文件名、文件类型
  var file = new File([u8arr], "filename", { type: mime });
  // 将文件对象通过a标签下载
  var aDom = document.createElement("a"); // 创建一个 a 标签
  aDom.download = file.name; // 设置文件名
  let href = URL.createObjectURL(file); // 将file对象转成 UTF-16 字符串
  aDom.href = href; // 放入href
  document.body.appendChild(aDom); // 将a标签插入 body
  aDom.click(); // 触发 a 标签的点击
  document.body.removeChild(aDom); // 移除刚才插入的 a 标签
  URL.revokeObjectURL(href); // 释放刚才生成的 UTF-16 字符串
})

Canvas实现底色切换

    // 获取 canvas 元素
    var canvas = document.getElementById('canvas');
    // 通过判断getContext方法是否存在来判断浏览器的支持性
    if(canvas.getContext) {
      // 获取绘图上下文
      var ctx = canvas.getContext('2d');
      var img = new Image();
      // 设置图片跨域
      img.crossOrigin = 'anonymous';
      img.src = 'https://t7.baidu.com/it/u=1819248061,230866778&fm=193&f=GIF';
      img.onload = function() {
        ctx.drawImage(img, 0, 0);
      };
      
      // 原底色
      var original = function() {
        ctx.drawImage(img, 0, 0);
      };
      
      // 反相底色
      var invert = function() {
        ctx.drawImage(img, 0, 0);
        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
        const data = imageData.data;
        for (var i = 0; i < data.length; i += 4) {
          data[i]     = 255 - data[i];     // red
          data[i + 1] = 255 - data[i + 1]; // green
          data[i + 2] = 255 - data[i + 2]; // blue
        }
        ctx.putImageData(imageData, 0, 0);
      };

	// 黑白反向
      var grayscale = function() {
        ctx.drawImage(img, 0, 0);
        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
        const data = imageData.data;
        for (var i = 0; i < data.length; i += 4) {
          var avg = (data[i] + data[i + 1] + data[i + 2]) / 3;
          data[i]     = avg; // red
          data[i + 1] = avg; // green
          data[i + 2] = avg; // blue
        }
        ctx.putImageData(imageData, 0, 0);
      };
    }



上面代码用到了像素数据

getImageData()

该方法会返回一个 ImageData对象

它是画布区域的数据,画布的四个角分别表示为 (left, top)、(left + width, top)、(left, top + height)和(left + width, top + height) 四个点,这四个坐标点被设定为画布坐标空间元素。

ctx.getImageData(left, top, width, height)

canvas拾色器

document.addEventListener('click', (e) => {
            const x = e.layerX
            const y = e.layerY
            const {data} = ctx.getImageData(x, y, 1, 1)
            const color = `rgba(${data[0]},${data[1]}, ${data[2]}, ${data[3] / 255})`
            console.log(color);
        })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Raccom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值