一步步教你利用Canvas对图片进行处理


Posted in Javascript onSeptember 19, 2017

前言

Canvas,中文译为“画布”,HTML5中新增了<canvas>元素,可以结合JavaScript动态地在画布中绘制图形。

今天,我们不讲Canvas的图形绘制,而是讲如何对图片进行处理,话不多说了,来一起看看详细的介绍吧。

大概流程非常简单,主要分为以下三个步骤:

一步步教你利用Canvas对图片进行处理
Canvas图片处理

是的,就像把大象装进冰箱一样简单,哈哈。

一、主要API

整个流程中所用到的主要Canvas API有:

  • 绘制图像: drawImage()
  • 获取图像数据: getImageData()
  • 重写图像数据: putImageData()
  • 导出图像: toDataURL()

1. drawImage()

顾名思义,该方法就是用于将图像绘制与Canvas画布当中,具体用法有三种:

      ① 在画布上定位图像:context.drawImage(img,x,y)

      ② 在画布上定位图像,并规定图像的宽度和高度:context.drawImage(img,x,y,width,height)

      ③ 剪切图像,并在画布上定位被剪切的部分:context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height)

以上参数值描述如下表:

参数 描述
img 规定要使用的图像、画布或视频。
sx 可选。开始剪切的 x 坐标位置。
sy 可选。开始剪切的 y 坐标位置。
swidth 可选。被剪切图像的宽度。
sheight 可选。被剪切图像的高度。
x 在画布上放置图像的 x 坐标位置。
y 在画布上放置图像的 y 坐标位置。
width 可选。要使用的图像的宽度。(伸展或缩小图像)
height 可选。要使用的图像的高度。(伸展或缩小图像)

2. getImageData()

该方法用于从Canvas画布中获取图像数据,具体用法如下:

获取画布指定矩形范围内的像素数据:var ImageData = context.getImageData(x,y,width,height)

以上参数值描述如下表:

参数 描述
x 开始复制的左上角位置的 x 坐标。
y 开始复制的左上角位置的 y 坐标。
width 将要复制的矩形区域的宽度。
height 将要复制的矩形区域的高度。

该方法会返回一个ImageData对象,该对象有三个属性分别为:width、height和data,而我们最主要用到的就是这个data数组,因为它保存着图像中每一个像素的数据。有了这些数据之后我们便可以对它们进行处理,最后再将其重写至Canvas画布中,这样就实现了对图片的处理转换。对于该data数组具体用法,我们可以在后面的实例中看到。

3. putImageData()

该方法很简单,就是用于将图像数据重写至Canvas画布中,具体用法如下:

context.putImageData(imgData,x,y,dirtyX,dirtyY,dirtyWidth,dirtyHeight)

以上参数值描述如下表:

参数 描述
imgData 规定要放回画布的 ImageData 对象。
x ImageData 对象左上角的 x 坐标,以像素计。
y ImageData 对象左上角的 y 坐标,以像素计。
dirtyX 可选。水平值(x),以像素计,在画布上放置图像的位置。
dirtyY 可选。水平值(y),以像素计,在画布上放置图像的位置。
dirtyWidth 可选。在画布上绘制图像所使用的宽度。
dirtyHeight 可选。在画布上绘制图像所使用的高度。

4. toDataURL()

这个方法与以上三种方法不同,它是Canvas对象的方法,该方法返回的是一个包含data URI的字符串,该字符串可直接作为图片路径地址填入<img>标签的src属性当中,具体用法如下:

var dataURL = canvas.toDataURL(type, encoderOptions);

以上参数值描述如下表:

参数 描述
type 可选。图片格式,默认为 image/png。
encoderOptions 可选。在指定图片格式为 image/jpeg 或 image/webp的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。其他参数会被忽略。

二、图片处理实例

本实例将通过代码简单介绍如何把彩色图片处理成黑白图片。

<!--HTML-->
<canvas id="canvas" width="600" height="600"></canvas>
<input id="handle" type="button" value="处理图片" />
<input id="create" type="button" value="生成图片" />
<div id="result"></div>
//JavaScript
window.onload = function(){
  var canvas = document.getElementById("canvas"),  //获取Canvas画布对象
    context = canvas.getContext('2d'); //获取2D上下文对象,大多数Canvas API均为此对象方法
  var image = new Image(); //定义一个图片对象
  image.src = 'imgs/img.jpg'; 
  image.onload = function(){ //此处必须注意!后面所有操作均需在图片加载成功后执行,否则图片将处理无效
    context.drawImage(image,0,0); //将图片从Canvas画布的左上角(0,0)位置开始绘制,大小默认为图片实际大小
    var handle = document.getElementById("handle");
    var create = document.getElementById("create");
    handle.onclick = function(){ // 单击“处理图片”按钮,处理图片
      var imgData = context.getImageData(0,0,canvas.width,canvas.height);  //获取图片数据对象
      var data = imgData.data; //获取图片数据数组,该数组中每个像素用4个元素来保存,分别表示红、绿、蓝和透明度值
      var average = 0;
      for (var i = 0; i < data.length; i+=4) {
        average = Math.floor((data[i]+data[i+1]+data[i+2])/3); //将红、绿、蓝色值求平均值后得到灰度值
        data[i] = data[i+1] = data[i+2] = average; 将每个像素点的色值重写
      }
      imgData.data = data;
      context.putImageData(imgData,0,0); //将处理后的图像数据重写至Canvas画布,此时画布中图像变为黑白色
    };
    create.onclick = function(){ // 单击“生成图片”按钮,导出图片
      var imgSrc = canvas.toDataURL(); //获取图片的DataURL
      var newImg = new Image();
      var result = document.getElementById("result");
      newImg.src = imgSrc; //将图片路径赋值给src
      result.innerHTML = '';
      result.appendChild(newImg);
    };
  };
};

可能上面代码写得不是很好,看起来也不是那么好理解,最好自己能够亲自写一写,这样对于自己理解会更加深刻一些。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
js获取提交的字符串的字节数
Feb 09 Javascript
Extjs学习笔记之八 继承和事件基础
Jan 08 Javascript
js中把JSON字符串转换成JSON对象最好的方法
Mar 21 Javascript
用C/C++来实现 Node.js 的模块(二)
Sep 24 Javascript
EasyUI中实现form表单提交的示例分享
Mar 01 Javascript
javascript包装对象实例分析
Mar 27 Javascript
JavaScript与HTML的结合方法详解
Nov 23 Javascript
jQuery简单实现MD5加密的方法
Mar 03 Javascript
JavaScript数据结构学习之数组、栈与队列
May 02 Javascript
ReactNative Image组件使用详解
Aug 07 Javascript
layui富文本编辑器前端无法取值的解决方法
Sep 18 Javascript
完美解决vue 中多个echarts图表自适应的问题
Jul 19 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
Sep 19 #Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
Sep 19 #Javascript
ECMAScript6变量的解构赋值实例详解
Sep 19 #Javascript
vue 粒子特效的示例代码
Sep 19 #Javascript
jQuery实现简单日期格式化功能示例
Sep 19 #jQuery
慕课网题目之js实现抽奖系统功能
Sep 19 #Javascript
使用vue与jquery实时监听用户输入状态的操作代码
Sep 19 #jQuery
You might like
索尼SONY SRF-S83/84电路分析和打磨
2021/03/02 无线电
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
JS 文字符串转换unicode编码函数
2009/05/30 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
如何让页面加载完成后执行js
2013/06/26 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
2017/05/09 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
node.js命令行教程图文详解
2019/05/27 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
2020/06/23 Javascript
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
[02:37]TI8勇士令状不朽珍藏II视频展示
2018/06/23 DOTA
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
项目合作计划书
2014/01/09 职场文书
中学生班主任评语
2014/01/30 职场文书
运动会邀请函范文
2014/01/31 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
英文产品推荐信
2015/03/27 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python