在我们之前有很多关于canvas的文章,大家感兴趣的可以看一下,其中有一篇是关于canvas绘制video,其实canvas的功能还有许多,今天就来介绍一下camvas的ImageDate对象的应用。
canvas的ImageData 对象
ImageData对象中存储着canvas对象真实的像素数据,它包含以下几个只读属性:
width
宽度,单位是像素
height
高度,单位是像素
data
Uint8ClampedArray类型的一维数组,包含着RGBA格式的整型数据,范围在0至255之间(包括255)。
创建一个ImageData对象
去创建一个新的,空白的ImageData对象,你应该会使用createImageData() 方法。
var myImageData = ctxcreateImageData(width, height);上面代码创建了一个新的具体特定尺寸的ImageData对象。所有像素被预设为透明黑。
得到场景像素数据
为了获得一个包含画布场景像素数据的ImageData对像,你可以用getImageData()方法:
var myImageData = ctxgetImageData(left, top, width, height);这个方法会返回一个ImageData对象,它代表了画布区域的对象数据,此画布的四个角落分别表示为(left, top), (left + width, top), (left, top + height), 以及(left + width, top + height)四个点。这些坐标点被设定为画布坐标空间元素。
在场景中写入像素数据
你可以用putImageData()方法去对场景进行像素数据的写入。
ctxputImageData(myImageData, dx, dy);dx和dy参数表示你希望在场景内左上角绘制的像素数据所得到的设备坐标。
例如,为了在场景内左上角绘制myImageData代表的,你可以写如下的代码:
ctxputImageData(myImageData, 0, 0);
toDataURL 将canvas转为 data URI格式
有如下< canvas>元素
<canvas id="canvas" width="5" height="5"></canvas>
var canvas = documentgetElementById("canvas");
var dataURL = canvastoDataURL();
consolelog(dataURL);
// "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNby
// blAAAADElEQVQImWNgoBMAAABpAAFEI8ARAAAAAElFTkSuQmCC"
var fullQuality = canvastoDataURL("image/jpeg", 10);
// data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ9oADAMBAAIRAxEAPwD/AD/6AP/Z"
var mediumQuality = canvastoDataURL("image/jpeg", 05);
var lowQuality = canvastoDataURL("image/jpeg", 01);
应用一:颜色选择器
var img = new Image();
imgsrc = 'haoroomsjpg';
var canvas = documentgetElementById('canvas');
var ctx = canvasgetContext('2d');
imgonload = function() {
ctxdrawImage(img, 0, 0);
imgstyledisplay = 'none';
};
var color = documentgetElementById('color');
function pick(event) {
var x = eventlayerX;
var y = eventlayerY;
var pixel = ctxgetImageData(x, y, 1, 1);
var data = pixeldata;
consolelog(data);
var rgba = 'rgba(' + data[0] + ',' + data[1] +
',' + data[2] + ',' + (data[3] / 255) + ')';
colorstylebackground = rgba;
colortextContent = rgba;
}
canvasaddEventListener('mousemove', pick);应用二:视频纯色背景过滤
今天,我们用getImageData过滤掉纯色背景。
let processor = {
timerCallback: function() {
if (thisvideopaused || thisvideoended) {
return;
}
thiscomputeFrame();
let self = this;
setTimeout(function () {
selftimerCallback();
}, 0);
},
doLoad: function() {
thisvideo = documentgetElementById("video");
thisc1 = documentgetElementById("c1");
thisctx1 = thisc1getContext("2d");
thisc2 = documentgetElementById("c2");
thisctx2 = thisc2getContext("2d");
let self = this;
thisvideoaddEventListener("play", function() {
selfwidth = selfvideovideoWidth / 2;
selfheight = selfvideovideoHeight / 2;
selftimerCallback();
}, false);
},
computeFrame: function() {
thisctx1drawImage(thisvideo, 0, 0, thiswidth, thisheight);
let frame = thisctx1getImageData(0, 0, thiswidth, thisheight);
let l = framedatalength / 4;
for (let i = 0; i < l; i++) {
let r = framedata[i 4 + 0];
let g = framedata[i 4 + 1];
let b = framedata[i 4 + 2];
if (g > 100 && r > 100 && b < 43)
framedata[i 4 + 3] = 0;
}
thisctx2putImageData(frame, 0, 0);
return;
}
};应用三:灰度和反相颜色
在这个例子里,我们遍历所有像素以改变他们的数值。然后我们将被修改的像素数组通过putImageData()放回到画布中去。invert函数仅仅是去减掉颜色的最大色值255grayscale函数仅仅是用红绿和蓝的平均值。你也可以用加权平均,例如x = 0299r + 0587g + 0114b这个公式。
var img = new Image();
imgsrc = 'rhinojpg';
imgonload = function() {
draw(this);
};
function draw(img) {
var canvas = documentgetElementById('canvas');
var ctx = canvasgetContext('2d');
ctxdrawImage(img, 0, 0);
imgstyledisplay = 'none';
var imageData = ctxgetImageData(0,0,canvaswidth, canvasheight);
var data = imageDatadata;
var invert = function() {
for (var i = 0; i < datalength; i += 4) {
data[i] = 225 - data[i]; // red
data[i + 1] = 225 - data[i + 1]; // green
data[i + 2] = 225 - data[i + 2]; // blue
}
ctxputImageData(imageData, 0, 0);
};
var grayscale = function() {
for (var i = 0; i < datalength; 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
}
ctxputImageData(imageData, 0, 0);
};
var invertbtn = documentgetElementById('invertbtn');
invertbtnaddEventListener('click', invert);
var grayscalebtn = documentgetElementById('grayscalebtn');
grayscalebtnaddEventListener('click', grayscale);
}
应用四-缩放和反锯齿
var img = new Image();
imgsrc = 'haoroomsjpg';
imgonload = function() {
draw(this);
};
function draw(img) {
var canvas = documentgetElementById('canvas');
var ctx = canvasgetContext('2d');
ctxdrawImage(img, 0, 0);
imgstyledisplay = 'none';
var zoomctx = documentgetElementById('zoom')getContext('2d');
var smoothbtn = documentgetElementById('smoothbtn');
var toggleSmoothing = function(event) {
zoomctximageSmoothingEnabled = thischecked;
zoomctxmozImageSmoothingEnabled = thischecked;
zoomctxwebkitImageSmoothingEnabled = thischecked;
zoomctxmsImageSmoothingEnabled = thischecked;
};
smoothbtnaddEventListener('change', toggleSmoothing);
var zoom = function(event) {
var x = eventlayerX;
var y = eventlayerY;
zoomctxdrawImage(canvas,
Mathabs(x - 5),
Mathabs(y - 5),
10, 10,
0, 0,
200, 200);
};
canvasaddEventListener('mousemove', zoom);
}应用五-canvas手绘并下载
windowaddEventListener('load', function(ev) {
var sourceimage = documentquerySelector('img');
var canvas = documentquerySelector('canvas');
var link = documentquerySelector('a');
var context = canvasgetContext('2d');
var mouseX = 0, mouseY = 0,
width = 300, height = 300,
mousedown = false;
canvaswidth = width;
canvasheight = height;
contextfillStyle = 'hotpink';
function draw(ev) {
if (mousedown) {
var x = evlayerX;
var y = evlayerY;
x = (Mathceil(x / 10) 10) - 10;
y = (Mathceil(y / 5) 5) - 5;
contextfillRect(x, y, 10, 5);
}
}
var link = documentcreateElement('a');
linkinnerHTML = '下载';
linkhref = "#";
linkdownload = "haoroomspng";
documentbodyinsertBefore(link, canvas);
canvasaddEventListener('mouseover', function(ev) {
documentbodyclassListadd('painted');
}, false);
canvasaddEventListener('mousemove', draw, false);
canvasaddEventListener('mousedown', function(ev) {
mousedown = true;
}, false );
canvasaddEventListener('mouseup', function(ev) {
linkhref = canvastoDataURL();
mousedown = false;
}, false );
} ,false);相信看了这些案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!
相关阅读:
CSS3的loading特效怎么制作
怎样用css3做出图标效果
CSS的编码怎么转换
胶原蛋白霜是常规抗衰老霜的升级版,因为胶原蛋白自然存在于您的皮肤中并保持其弹性。巴黎欧莱雅胶原蛋白保湿霜是该类别中最好的产品之一,因为它可以滋润和强化肌肤,使其具有明显的弹性。它对细纹、皱纹和鱼尾纹有奇效,含有乳木果油,滋养你的皮肤,改善整体皮肤质地,锁住水分。
血清是护肤游戏的重要组成部分,因为它们将活性成分注入皮肤深处。这款来自欧莱雅的保湿精华素是一个不错的选择,因为它含有 15% 的透明质酸,可以均匀地调理皮肤并刺激新皮肤的生长。随后使用基于胶原蛋白的抗衰老保湿霜,以获得最佳效果。不含对羟基苯甲酸酯或合成染料,减少细纹和皱纹,改善整体皮肤质地。巴黎欧莱雅 Revitalift Moisturizer 紧致肌肤,使其紧致,它含有纯视黄醇原 A,可改善皱纹和弹性蛋白,可改善皮肤弹性。它采用全新的 Dermalift 技术,可刺激皮肤的天然提拉剂,重新收紧并显着丰盈您的皮肤,让你的皮肤更紧致。
使用奢华的巴黎欧莱雅Hydra-Nutrition晚霜呵护您的睡眠,这款润唇膏对您的皮肤温和,几乎立即融化,让您的皮肤感觉如婴儿般柔软。它含有麦卢卡蜂蜜提取物,有助于在最长时间内保持皮肤水分,而滋养油则可保持皮肤水分整夜。巴黎欧莱雅青春密码暗斑修护日霜针对因老化、晒伤和色素沉着过度引起的黑斑和变色。它还提供广谱保护,免受有害的阳光照射,可以改善皮肤质地并均匀肤色,恢复年轻的光泽和光泽,这个日霜不油腻,含有 SPF 30,适合所有肤质。
巴黎欧莱雅 RevitaLift Radiant Smoothing Cream Cleanser 可滋养您的皮肤并增强其光泽,因为它可以轻柔地去除死皮细胞、污垢和杂质。将它与油性清洁剂一起使用以获得最佳效果,温柔呵护你的肌肤,软化你的皮肤。木炭面膜在化妆品行业掀起波澜,木炭可以去除皮肤上的杂质、灰尘和污垢,而不会吸收太多水分。这款来自欧莱雅的奢华排毒面膜效果出色,让您拥有天鹅绒般光滑的肌肤。
你可以先去绘学霸网站找“zbursh建模”板块的免费视频教程-点击进入完整入门到精通视频教程列表: wwwhuixuebanet/web/AppWebClient/AllCourseAndResourcePagetype=1&tagid=307&zdhhr-11y04r-1498291070947092899
想要系统的学习可以考虑报一个网络直播课,推荐CGWANG的网络课。老师讲得细,上完还可以回看,还有同类型录播课可以免费学(赠送终身VIP)。
自制能力相对较弱的话,建议还是去好点的培训机构,实力和规模在国内排名前几的大机构,推荐行业龙头:王氏教育。
王氏教育全国直营校区面授课程试听复制后面链接在浏览器也可打开: wwwhuixuebacomcn/school/3dmodeltype=4&zdhhr-11y04r-1498291070947092899
在“zbursh建模”领域的培训机构里,王氏教育是国内的老大,且没有加盟分校,都是总部直营的连锁校区。跟很多其它同类型大机构不一样的是:王氏教育每个校区都是实体面授,老师是手把手教,而且有专门的班主任从早盯到晚,爆肝式的学习模式,提升会很快,特别适合基础差的学生。
大家可以先把绘学霸APP下载到自己手机,方便碎片时间学习——绘学霸APP下载: wwwhuixuebacomcn/Scripts/downloadhtml
欢迎分享,转载请注明来源:品搜搜测评网