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
    51500
  • 孕妇可以用精华液吗 孕妇可用精华液推荐

    精华液是必不可少的一样护肤产品,精华液有很好的护肤效果,很多人擦脸的时候都会使用精华液,孕妇护肤也是很重要的,孕期肌肤也需要护肤品的滋养。孕妇可以用精华液吗孕妇是可以用精华液的。最后孕妇在选择孕妇在选择精华液时,需要遵守的第一原则就

    2024-04-15
    52400
  • 学生党用什么洗面奶好?

    01:旁氏米粹洗面奶旁氏米粹应该就是学生党的心头爱吧,我第一次用洗面奶也是用的这款,妥妥平价洗面奶中的战斗机,清洁力杠杠的。纯氨基酸的配方,膏体厚实,洗感比较温和,在氨基酸洗面奶中清洁力算高的,基本的防晒和淡妆都可以洗干净,洗完也不会紧

    2024-04-15
    38600
  • 日本好用的护手霜有哪些?哪些日本品牌护手霜好用?

    除了脸部肌肤,手部肌肤也是很多人护肤所关注的,手部肌肤有时候比较粗糙,缺乏水分,需要用些护手的产品,护手霜有很多的品牌,日本有许多好用的护肤产品,适合亚洲人的肌肤使用,那么日本好用的护手霜有哪些?哪些日本品牌护手霜好用?1、日本好用的护手霜

    2024-04-15
    35800
  • 哪些牌子保湿补水的护肤品好?

    秋冬季节,皮肤很容易干燥,保湿尤其重要! 分享一些相对平价一点,大家购买的起的,而且用完只保湿不油腻的护肤品! 走起! 1,科颜氏的高保湿霜,这款高保湿霜特别经典了,保湿照顾很好,尤其是脸皮特别干的时候,晚上厚厚的用上一层,第

    2024-04-15
    30000
  • 妮维雅小蓝罐国产版的所有评价?

    妮维雅小蓝罐国产版评价:1、妮维雅小蓝罐可以作为妆前打底,让妆容更加服帖。2、温和滋润,更易被肌肤吸收,给肌肤深层提供水分和养分的同时还能时刻得保湿肌肤的润泽。3、妮维雅小蓝罐可以用作妆前打底,滋润皮肤减少卡粉的情况。还能用作身体细节部位的

    2024-04-15
    30600
  • 过劳脸色黯沉 精华液打造光采肌

    上班族无论男女都有过劳现象,最近还上了美国有线电视新闻网CNN,也让全球了解台湾劳工超时工作的拼劲。但是,加班过劳的背后却隐藏许多危机,尤其秋冬季节到,对于正值青春年华的女性来说,过劳加上季节变换,两者更是肌肤的杀手,除了脸上缺水、黯沉蜡

    2024-04-15
    27400

发表评论

登录后才能评论
保存