实现方式:使用getImageData获取图像数据,然后遍历每个像素,将每个像素的RGB值取反,再使用putImageData将修改后的数据绘制回Canvas。 实现方式:使用getImageData获取图像数据,然后遍历每个像素,调整每个像素的亮度值,再使用putImageData将修改后的数据绘制回Canvas。 实现方式:使用getImageData获取图像数据,然后遍历每个像素,调整每个像素的色调、饱和度和亮度,再使用putImageData将修改后的数据绘制回Canvas。 实现方式:使用getImageData获取图像数据,然后遍历每个像素,增加或减少每个像素的红色、绿色、蓝色分量的值,再使用putImageData将修改后的数据绘制回Canvas。 实现方式:使用getImageData获取图像数据,然后遍历每个像素,调整每个像素的透明度值,再使用putImageData将修改后的数据绘制回Canvas。
; data[i + 1] = 255 - data[i + 1]; data[i + 2] = 255 - data[i + 2]; } cxt.putImageData let a = 50; data[i] += a; data[i + 1] += a; data[i + 2] += a; } cxt.putImageData r * 0.35 + g * 0.68 + b * 0.16; data[i + 2] = r * 0.27 + g * 0.53 + b * 0.13; } cxt.putImageData (imgData, 150, 10); } 示例效果: 2.8 透明处理 对于透明处理,我们都是在得到像素数组后,将该数组中每一个像素的透明度乘以n,然后保存像素数组,最后使用putImageData ()配合使用是对一张图片进行像素操作,createImageData()和putImageData()配合使用是对一个区域进行像素操作。
将处理后的ImageData设置到canvas中 由于是覆盖了canvas其中部分区域 // 所以用的是put而不是set(并没有setImageData,put全部覆盖就可以相当于set) context.putImageData (imagedata, dx, dy); // 该方法还有可选参数 context.putImageData(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, data[i + 1] = 255 - data[i + 1]; data[i + 2] = 255 - data[i + 2]; } // 设置像素数据 context.putImageData 你或许会问为什么putImageData没有传入图片的宽度和高度呢,其实ImageData对象中本来就有高度和宽度,所以就无需传入了。 创建ImageData 上面我们一直在玩getImageData和putImageData,至于createImageData都没有说过,其实这个用的也并不多,这里给一个例子结束本章吧: var imageData
然后通过putImageData把处理好的内容重新描绘到画图上。 实现方式:使用getImageData获取图像数据,然后遍历每个像素,将每个像素的 RGB 值取反,再使用putImageData将修改后的数据绘制回 Canvas。 实现方式:使用getImageData获取图像数据,然后遍历每个像素,调整每个像素的亮度值,再使用putImageData将修改后的数据绘制回 Canvas。 实现方式:使用getImageData获取图像数据,然后遍历每个像素,调整每个像素的色调、饱和度和亮度,再使用putImageData将修改后的数据绘制回 Canvas。 实现方式:使用getImageData获取图像数据,然后遍历每个像素,调整每个像素的透明度值,再使用putImageData将修改后的数据绘制回 Canvas。
ctx.getImageData(left,top,width,height),坐标点形成坐标空间元素 注意:任何在画布以外的元素都会被返回成一个透明黑的ImageData对象 在场景中写入像素数据 你可以用putImageData ()方法去对场景进行像素数据的写入 ctx.putImageData(myImageData,dx,dy) 图片灰度和反相颜色 这下面这个例子里,我们遍历所有像素以改变他们的数值,然后我们将被修改的像素数组通过 putImageData()放回到画布中去 完整的反相颜色与图片灰度的例子: <body > <canvas id="canvas" width="600" height="300" style=" data[i]=255-data[i]; data[i+1] = 255-data[i+1]; data[i+2] = 255-data[i+1] } ctx.<em>putImageData</em> data[i]+data[i+1]+data[i+2])/3; data[i] = avg; data[i+1] = avg; data[i+2] = avg } ctx.<em>putImageData</em>
比如想把图片的透明度设为 50%,只需要遍历一遍 data ,把 下标 + 1 能被4整除的元素的值改成 128 ,然后通过 putImageData() 方法将图片数据输出到画布上就行了。 \n\n \n\n## putImageData()\n\nputImageData() 可以将 ImageData 对象的数据(图片像素数据)绘制到画布上。 \n\n语法:\n\njs\nputImageData(imageData, x, y)\n\n// 或者\ncontext.putImageData(imgData,x,y,dirtyX,dirtyY \n\n \n\n当把所有像素都操作完成后,再使用 putImageData() 方法把数据渲染到指定位置上。 255 : 0\n }\n\n ctx.putImageData(imgData, 340, 10)\n }\n</script>\n\n\n \n\n \n\n# 亮度调节\n\n如果需要调亮
幸运的是 canvas 2D 原生提供了获取快照和通过快照恢复画布的 API ——getImageData/putImageData。 此外,在绘制图片过于复杂时,getImageData 和 putImageData 这两个方法会产生比较严重的性能问题。 stackoverflow 上有详细的讨论: Why is putImageData so slow?。我们还可以从 jsperf 上这个测试用例的数据来验证这一点。 淘宝 FED 在 Canvas 最佳实践中也提到了尽量“不在动画中使用putImageData 方法”。另外,文章里还提到一点,“尽可能调用那些渲染开销较低的 API”。 可行性方面,首先这样可以减少保存到内存的数据量,其次还避免了使用渲染开销较高的 putImageData。
putImageData() 方法 该方法可以将 imageData 对象绘制到 canvas 上。 我们可以用 getImageData 将获取到的 imageData 数据处理后再使用 putImageData 方法重新绘制到 canvas 中。 ,这里不做介绍,可以参考 MDN 文档: https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/putImageData 参考资料 [1] https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/putImageData: https ://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/putImageData [2] 参考 MDN 文档: https
canvas的 getImageData 方法获取图片的像素信息,可以很方便的通过方法导入到把网络图片或者本地的图片导入至canvas中并获取图片的像素信息,可以修改像素信息后通过另外一个重要的方法putImageData drawImage(hiddenImage, 0, 0, width, height); hiddenImage .onload=function(){ context.putImageData function getBrightness(r,g,b){ return 0.3*r + 0.59*g + 0.11*b; } 4、导出处理过的图片 context.putImageData
主要用于临时性的绘图操作,比如用手指拖出一个方形时,首先要在touchstart事件里储存拖动开始时的绘制表面(getImageData),touchmove的事件函数中,首先要先恢复touch开始时的绘图表面(putImageData / 储存画布状态 ctx.lineWidth = this.width ctx.strokeStyle = this.color } draw (loc) { ctx.putImageData () ctx.rect(rect.x, rect.y, rect.width, rect.height) ctx.stroke() } end (loc) { ctx.putImageData drawCalculate (loc) { ctx.save() ctx.lineWidth = this.width ctx.strokeStyle = this.color ctx.putImageData document.getElementById("cancel").addEventListener('click', () => { if(lastImageData.length < 1) return false ctx.putImageData
调用context对象的getImageData()方法,得到像素颜色数组,参数:x坐标,y坐标,x宽度,y宽度 调用context对象的putImageData ()方法,设置图片颜色,参数:ImageData //green imagedata.data[i + 2] = 255 - imagedata.data[i + 2]; } context.putImageData
canvas的 getImageData 方法获取图片的像素信息,可以很方便的通过方法导入到把网络图片或者本地的图片导入至canvas中并获取图片的像素信息,可以修改像素信息后通过另外一个重要的方法putImageData drawImage(hiddenImage, 0, 0, width, height); hiddenImage .onload=function(){ context.putImageData } function getBrightness(r,g,b){ return 0.3*r + 0.59*g + 0.11*b; } 4、导出处理过的图片 context.putImageData
在场景中写入像素数据 我们可以使用putImageData()方法修改像素数据后,对画布场景数据进行重置。 ctx.putImageData(myImageData, dx, dy); 图片灰度和反相颜色 下面的例子,我们遍历所有像素以改变他们的数值。 然后将被修改的像素数组通过putImageData()放回到画布中去。invert函数仅仅是去减掉颜色的最大色值255.grayscale函数仅仅是用红绿和蓝的平均值。 i + 1] = 255 - data[i + 1]; // green data[i + 2] = 255 - data[i + 2]; // blue } ctx.putImageData = avg; // red data[i + 1] = avg; // green data[i + 2] = avg; // blue } ctx.putImageData
canvas的 getImageData 方法获取图片的像素信息,可以很方便的通过方法导入到把网络图片或者本地的图片导入至canvas中并获取图片的像素信息,可以修改像素信息后通过另外一个重要的方法putImageData drawImage(hiddenImage, 0, 0, width, height); hiddenImage .onload=function(){ context.putImageData } function getBrightness(r,g,b){ return 0.3*r + 0.59*g + 0.11*b; } 4、导出处理过的图片 context.putImageData
gfilter.colorInvertProcess(binaryData, len); // Copying back canvas data to canvas tempContext.putImageData gfilter.colorAdjustProcess(binaryData, len); // Copying back canvas data to canvas tempContext.putImageData gfilter.blurProcess(tempContext, canvasData); // Copying back canvas data to canvas tempContext.putImageData gfilter.reliefProcess(tempContext, canvasData); // Copying back canvas data to canvas tempContext.putImageData gfilter.diaokeProcess(tempContext, canvasData); // Copying back canvas data to canvas tempContext.putImageData
clearInterval(i);},false); 三、像素级操作 常见的像素级的操作有三种: getImageData() - 获取画布像素数据 createImageData() - 创建新的、空白像素 putImageData 100,100) imageData.data[0] = 255 imageData.data[1] = 0 imageData.data[2] = 0 imageData.data[3] = 255 3.1、putImageData 使用语法: putImageData( imgData , x , y , dirtyX , dirtyY , dirtyWidth ,dirtyHeight ); 参数及意义: 参数 描述 imgData 通过 getImageData 复制的指定矩形像素数据,编辑之后,通过 putImageData 方法将图像数据放回画布上。 imageData.data[(r*w+c)*4+2 ] = 0 // 把蓝色设置成0 imageData.data[(r*w+c)*4+1] = 0 // 把蓝色设置成0 } } ctx.putImageData
clearInterval(i);},false); 三、像素级操作 常见的像素级的操作有三种: getImageData() - 获取画布像素数据 createImageData() - 创建新的、空白像素 putImageData 100,100) imageData.data[0] = 255 imageData.data[1] = 0 imageData.data[2] = 0 imageData.data[3] = 255 3.1、putImageData 使用语法: putImageData( imgData , x , y , dirtyX , dirtyY , dirtyWidth ,dirtyHeight ); 参数及意义: 参数 描述 imgData 通过 getImageData 复制的指定矩形像素数据,编辑之后,通过 putImageData 方法将图像数据放回画布上。 imageData.data[(r*w+c)*4+2 ] = 0 // 把蓝色设置成0 imageData.data[(r*w+c)*4+1] = 0 // 把蓝色设置成0 } } ctx.putImageData
drawImage(img,sx,sy,swidth,sheight,x,y,width,height) 获取图像数据: getImageData(x,y,width,height) 重写图像数据: putImageData imgData.data[i * 4 + 1] = gray; imgData.data[i * 4 + 2] = gray; } ctx.putImageData imgData.data[i * 4 + 2] = 255 - imgData.data[i * 4 + 2]; } ctx.putImageData
然后再将这个处理后的像素数据,重新通过putImageData放回到canvas上。 像素数据,对于每个像素都有四个方面的信息,分别是Red,Green,Blue,Alpha。 ctx.getImageData(0, 0, canvasSize.width * ratio, canvasSize.height * ratio); getGrayscaleData(imgData); ctx.putImageData y 通过getImageData得到ImageData,并判断是否需要灰度处理 然后重新修改上面创建的canvas的width/height为选中图片部分的putW putH 将ImageData通过putImageData getGrayscaleData(imgData); }; canvas.width = putW; canvas.height = putH; ctx.putImageData
canvas.getContext('2d'); _ctx.drawImage(img, 0, 0) imgData = _ctx.getImageData(0, 0, w, h) ctx.putImageData + 1] = color[1]; data[i + 2] = color[2]; data[i + 3] = 255; } // 展示img ctx.putImageData + 1] = color[1]; data[i + 2] = color[2]; data[i + 3] = 150; } // 展示img _ctx.putImageData