canvas的ImageData怎么使用

canvas的ImageData怎么使用,第1张

在我们之前有很多关于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

欢迎分享,转载请注明来源:品搜搜测评网

原文地址:https://pinsoso.cn/meirong/3191728.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2024-02-08
下一篇2024-02-08

随机推荐

  • 妮维雅630可以和祛绉提拉紧致的一起用吗

    可以一起使用。妮维雅630是一款保湿滋润的面霜,而祛绉提拉紧致产品则是一种抗衰老的紧致霜。两者成分不冲突,可以同时使用。但需要注意的是,使用时应按照产品说明书的指导进行,避免过度使用或者混合使用其他化妆品,以免对皮肤造成不必要的刺激和负担。

    2024-04-15
    65200
  • 精华霜和精华露的顺序

    对于精华霜和精华露来说,二者的功效大致相同。最大的区别是精华霜的质地要比精华露的质地更加黏稠,在使用的时候要先使用精华露,然后在使用精华霜。因为精华露的质地比较轻薄,在前面使用更容易被肌肤所吸收。如果肌肤状态比较稳定的话,最好不要使用过多的

    2024-04-15
    65400
  • 欧诗漫珍珠白套装适合什么年纪_适合肤质

    你只知道自己黑,却不知道为何会黑,都说一白遮百丑,一黑毁所有。珍珠白系列产品,均持有国家特证,有美白特证才敢说美白。下面我带大家来看一下欧诗漫珍珠白套装适合什么年纪_适合肤质。欧诗漫珍珠白套装适合什么年纪欧诗漫OSM新珍珠白补水美白

    2024-04-15
    62900
  • 兰芝化妆品 生产日期 用手指就可以涂掉,会是假货吗?

    额,,,我敢肯定是假的,,,因为刚看了下我的那个东西,还是不会涂掉的,我买的眼霜和面膜是同学从韩国带回来的,它说假几赔几,,又没地方鉴定又没地方说理,而且还挺麻烦,它肯定说,你用了不过敏就是真货,,,像兰芝,the face shop之类的

    2024-04-15
    51300
  • 精华液有什么作用和功效?

    01精华液,是护肤品中之极品,成分精致、功效强大、效果显著,始终保持着它拥有的高贵和神秘。含有较珍贵的功效成分,如植物提取物、神经酰胺、角鲨烷等,它的作用有防衰老、抗皱、保湿、美白、去斑等等。精华液分水剂,油剂两种,所提取的是高营养

    2024-04-15
    53500
  • 蓝曜石控油细毛孔精华露好不好

    好。1、蓝曜石控油细毛孔精华露添加乳酸糖、冰川水等成分,可改善毛孔粗大、粗糙起皮等问题,帮助肌肤补水保湿,提亮肤色,同时调节水油平衡,使肌肤维持清爽状态。2、采用按压设计,方便使用和取量。想要双眼有神,平时就要注意眼部的护理,不要等到眼部肌

    2024-04-15
    47100
  • 美甲上面装饰金色会显的比较贵气吗?

    可以说现在很多女孩子都是比较爱美的,通常会在自己的身上可劲儿的捯饬,也喜欢做美甲。甚至有的小女孩自己家里都配备了美甲工具,时不常就会给自己做一个漂亮的美甲,出入重要场合的时候也能自信心美满。做美甲的过程中,千万不要小看在指甲上的一些小点缀,

    2024-04-15
    42400

发表评论

登录后才能评论
保存