canvas的imagedata 对象
imagedata对象中存储着canvas对象真实的像素数据,它包含以下几个只读属性:
width
图片宽度,单位是像素
height
图片高度,单位是像素
data
uint8clampedarray类型的一维数组,包含着rgba格式的整型数据,范围在0至255之间(包括255)。
创建一个imagedata对象
去创建一个新的,空白的imagedata对象,你应该会使用createimagedata() 方法。
var myimagedata = ctx.createimagedata(width, height);
上面代码创建了一个新的具体特定尺寸的imagedata对象。所有像素被预设为透明黑。
得到场景像素数据
为了获得一个包含画布场景像素数据的imagedata对像,你可以用getimagedata()方法:
var myimagedata = ctx.getimagedata(left, top, width, height);
这个方法会返回一个imagedata对象,它代表了画布区域的对象数据,此画布的四个角落分别表示为(left, top), (left + width, top), (left, top + height), 以及(left + width, top + height)四个点。这些坐标点被设定为画布坐标空间元素。
在场景中写入像素数据
你可以用putimagedata()方法去对场景进行像素数据的写入。
ctx.putimagedata(myimagedata, dx, dy);
dx和dy参数表示你希望在场景内左上角绘制的像素数据所得到的设备坐标。
例如,为了在场景内左上角绘制myimagedata代表的图片,你可以写如下的代码:
ctx.putimagedata(myimagedata, 0, 0); todataurl 将canvas转为 data uri格式
有如下< canvas>元素
<canvas id="canvas" width="5" height="5"></canvas> var canvas = document.getelementbyid("canvas"); var dataurl = canvas.todataurl(); console.log(dataurl); // "data:image/png;base64,ivborw0kggoaaaansuheugaaaauaaaafcayaaacnby // blaaaadeleqvqimwngobmaaabpaafei8araaaaaelftksuqmcc" var fullquality = canvas.todataurl("image/jpeg", 1.0); // data:image/jpeg;base64,/9j/4aaqskzjrgabaq...9oadambaairaxeapwd/ad/6ap/z" var mediumquality = canvas.todataurl("image/jpeg", 0.5); var lowquality = canvas.todataurl("image/jpeg", 0.1); 应用一:颜色选择器 var img = new image(); img.src = 'haorooms.jpg'; var canvas = document.getelementbyid('canvas'); var ctx = canvas.getcontext('2d'); img.onload = function() { ctx.drawimage(img, 0, 0); img.style.display = 'none'; }; var color = document.getelementbyid('color'); function pick(event) { var x = event.layerx; var y = event.layery; var pixel = ctx.getimagedata(x, y, 1, 1); var data = pixel.data; console.log(data); var rgba = 'rgba(' + data[0] + ',' + data[1] + ',' + data[2] + ',' + (data[3] / 255) + ')'; color.style.background = rgba; color.textcontent = rgba; } canvas.addeventlistener('mousemove', pick);
应用二:视频纯色背景过滤
今天,我们用getimagedata过滤掉纯色背景。
let processor = { timercallback: function() { if (this.video.paused || this.video.ended) { return; } this.computeframe(); let self = this; settimeout(function () { self.timercallback(); }, 0); }, doload: function() { this.video = document.getelementbyid("video"); this.c1 = document.getelementbyid("c1"); this.ctx1 = this.c1.getcontext("2d"); this.c2 = document.getelementbyid("c2"); this.ctx2 = this.c2.getcontext("2d"); let self = this; this.video.addeventlistener("play", function() { self.width = self.video.videowidth / 2; self.height = self.video.videoheight / 2; self.timercallback(); }, false); }, computeframe: function() { this.ctx1.drawimage(this.video, 0, 0, this.width, this.height); let frame = this.ctx1.getimagedata(0, 0, this.width, this.height); let l = frame.data.length / 4; for (let i = 0; i < l; i++) { let r = frame.data[i * 4 + 0]; let g = frame.data[i * 4 + 1]; let b = frame.data[i * 4 + 2]; if (g > 100 && r > 100 && b < 43) frame.data[i * 4 + 3] = 0; } this.ctx2.putimagedata(frame, 0, 0); return; } };
应用三:图片灰度和反相颜色
在这个例子里,我们遍历所有像素以改变他们的数值。然后我们将被修改的像素数组通过putimagedata()放回到画布中去。invert函数仅仅是去减掉颜色的最大色值255.grayscale函数仅仅是用红绿和蓝的平均值。你也可以用加权平均,例如x = 0.299r + 0.587g + 0.114b这个公式。
var img = new image(); img.src = 'rhino.jpg'; img.onload = function() { draw(this); }; function draw(img) { var canvas = document.getelementbyid('canvas'); var ctx = canvas.getcontext('2d'); ctx.drawimage(img, 0, 0); img.style.display = 'none'; var imagedata = ctx.getimagedata(0,0,canvas.width, canvas.height); var data = imagedata.data; var invert = function() { for (var i = 0; i < data.length; i += 4) { data[i] = 225 - data[i]; // red data[i + 1] = 225 - data[i + 1]; // green data[i + 2] = 225 - data[i + 2]; // blue } ctx.putimagedata(imagedata, 0, 0); }; var grayscale = function() { 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); }; var invertbtn = document.getelementbyid('invertbtn'); invertbtn.addeventlistener('click', invert); var grayscalebtn = document.getelementbyid('grayscalebtn'); grayscalebtn.addeventlistener('click', grayscale); }
应用四-缩放和反锯齿
var img = new image(); img.src = 'haorooms.jpg'; img.onload = function() { draw(this); }; function draw(img) { var canvas = document.getelementbyid('canvas'); var ctx = canvas.getcontext('2d'); ctx.drawimage(img, 0, 0); img.style.display = 'none'; var zoomctx = document.getelementbyid('zoom').getcontext('2d'); var smoothbtn = document.getelementbyid('smoothbtn'); var togglesmoothing = function(event) { zoomctx.imagesmoothingenabled = this.checked; zoomctx.mozimagesmoothingenabled = this.checked; zoomctx.webkitimagesmoothingenabled = this.checked; zoomctx.msimagesmoothingenabled = this.checked; }; smoothbtn.addeventlistener('change', togglesmoothing); var zoom = function(event) { var x = event.layerx; var y = event.layery; zoomctx.drawimage(canvas, math.abs(x - 5), math.abs(y - 5), 10, 10, 0, 0, 200, 200); }; canvas.addeventlistener('mousemove', zoom); }
应用五-canvas手绘并下载图片
window.addeventlistener('load', function(ev) { var sourceimage = document.queryselector('img'); var canvas = document.queryselector('canvas'); var link = document.queryselector('a'); var context = canvas.getcontext('2d'); var mousex = 0, mousey = 0, width = 300, height = 300, mousedown = false; canvas.width = width; canvas.height = height; context.fillstyle = 'hotpink'; function draw(ev) { if (mousedown) { var x = ev.layerx; var y = ev.layery; x = (math.ceil(x / 10) * 10) - 10; y = (math.ceil(y / 5) * 5) - 5; context.fillrect(x, y, 10, 5); } } var link = document.createelement('a'); link.innerhtml = '下载图片'; link.href = "#"; link.download = "haorooms.png"; document.body.insertbefore(link, canvas); canvas.addeventlistener('mouseover', function(ev) { document.body.classlist.add('painted'); }, false); canvas.addeventlistener('mousemove', draw, false); canvas.addeventlistener('mousedown', function(ev) { mousedown = true; }, false ); canvas.addeventlistener('mouseup', function(ev) { link.href = canvas.todataurl(); mousedown = false; }, false ); } ,false);
相信看了这些案例你已经掌握了方法,更多精彩请关注其它相关文章!
相关阅读:
css3的loading特效怎么制作
怎样用css3做出图标效果
css的编码怎么转换
以上就是canvas的imagedata怎么使用的详细内容。