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

随机推荐

  • 完美玛丽艳的美白精华露用过的人说下效果如何…谢谢

    使用完美玛丽艳的美白精华露的人对其效果的反馈是正面的。有人认为使用后皮肤变得更加明亮透亮,斑点有所减轻,同时肌肤补水和滋润的效果也很好,皮肤变得更加柔软细嫩。另外,这款产品的质地轻盈易吸收,味道好闻,使用时感觉很愉悦。在价格方面,相比其他品

    2024-04-15
    57500
  • deepbio水光焕颜套盒适合多大年龄咋那么便宜

    适合20-30岁,容量方面和知名度方面。1、容量方面。deepbio水光焕颜5件套容量较少,每瓶含量仅有300ml,故价格便宜。2、知名度方面。deepbio品牌的知名度虽然不是很高,需降低价格提高售卖量,提高知名度。deepbio水光焕颜

    2024-04-15
    70400
  • 精华液的作用及用法

    精华液的作用及用法  精华液的作用及用法,精华液是所有护肤品里面非常出名的一款护肤品,生活中很多爱美的女性都会买精华液来护理自己的肌肤,那么下面一起来看看精华液的作用及用法。精华液的作用及用法1  精华

    2024-04-15
    57100
  • 精华露是水还是乳液精华露是水还是精华液

    精华露不是水,也不是乳,它属于精华的一种。精华露属于精华素的一种剂型,富含营养成分,具有高效的保湿、美白、抗衰等效果。一般30岁以上的人群更适合选用精华露产品,因为这时候女性肌肤开始走向衰老状态,必须使用和补充更多的营养护肤品,才能维持皮肤

    2024-04-15
    58100
  • 妮维雅的产品简介

    唇部护理系列脸部保养系列男士护肤系列专业防晒系列身体护理系列爽身香体系列润肤霜系列 精华爽身系列精华爽身系列整天干爽,修护脱毛损伤腋下频繁脱毛会损伤表层肌肤,使原本脆弱的腋下肌肤变得毛孔粗大、干燥、不平滑,有时甚至会伴随发痒、泛红等不适症

    2024-04-15
    41200
  • 美容院套盒拆了用了一次能退钱吗

    美容院的套盒拆开使用后,通常情况下是不能退钱的。这是因为已经拆封使用的套盒会影响二次销售,且由于其属于化妆品类型,所以可能会影响退换货。如果存在质量问题,您可以与美容院协商退换。如果套盒没有质量问题,那么可能就没有理由要求退货了。不过,具体

    2024-04-15
    39100
  • 精华液和精华乳的区别

    精华液和精华乳的区别在于性质不同、功效不同等。1、性质不同:一般情况下精华液的性质属于高保湿型的护肤品。精华乳的性质一般情况下密度相对于精华液的要稍高一些,是一种功能性质的高营养护肤品。2、功效不同:一般情况下精华液的功效可以改善肌肤暗沉,

    2024-04-15
    47200

发表评论

登录后才能评论
保存