canvas.width = newImg.width; canvas.height = newImg.height; ctx.drawImage(newImg, 0, 0); 4,根据鼠标点击的位置,进行用getImageData size.x / imgWidth; let y = newImg.height * size.y / imhHeight; //获取(x,y,1,1)的像素数据对象 let imgData = ctx.getImageData
于是乎我开始考虑有没有一种计算方式,只要循环判断每个怪物是否被子弹碰撞就好了,就这样,getImageData()函数引起了我的注意。 ? 图示-1 使用getImageData()函数计算碰撞的思路是: 1.在Canvas绘制当前帧的时候,先绘制好子弹路径,然后将怪物的位置坐标以及宽高参数传递给getImageData()函数,即context.getImageData 顺着这个问题,那么解决思路就是重置画布状态,让它失忆,忘了之前调用过drawImage()函数,这样就可以使用getImageData()函数而不出错了。 脚本的运行结果正如我预料的那样,在调用drawImage()函数之后,重置画布,再调用getImageData()是不会出错的。于是通过使用getImageData()函数的碰撞检测思路就成功了。 不,还有一个问题,这样实现的碰撞检测运行内存消耗很大,原因就是getImageData()的区域越大,数据量就越大,因此最后还要改变一下getImageData()的获取区域。
检测点一 CanvasRenderingContext2D.prototype.getImageData.length !== 4 || ! CanvasRenderingContext2D.prototype.getImageData.toString().match(/^\s*function getImageData\s*\(\)\s* == "getImageData" && ! , this);\n return getImageData.apply(this, arguments);\n }" CanvasRenderingContext2D.prototype.getImageData.name (CanvasRenderingContext2D.prototype.getImageData, "name", { "value": "getImageData" }); }
获取ImageDate 参数是左上角的左边(sx, sy)以及获取像素的宽度sw 和 高度sh // 他返回一个ImageData对象 context.getImageData(sx, sy, sw, function (){ context.drawImage(image, 0, 0,image.width / 2, image.height / 2); var imageData = context.getImageData 另外还有一点需要注意,如果你在getImageData的时候控制台报这样的错误说明你跨域了: Uncaught DOMException: Failed to execute ‘getImageData getImageData不允许访问非本域的图片,解决办法是自己启动一个服务,比如是用anywhere,使用方法就是在你的index.html所在的目录下的,使用终端输入下面两行命令,这样就可以使用服务打开了 创建ImageData 上面我们一直在玩getImageData和putImageData,至于createImageData都没有说过,其实这个用的也并不多,这里给一个例子结束本章吧: var imageData
今天我们来说说在开发中比较常谈及的问题,那就是跨域问题,我们就来说说在:“html5中如何解决canvas图片getImageData,toDataURL跨域问题?”这个问题吧! 而主页面所在域名往往不一样,当需要需要对 canvas 图片进行 getImageData() 或toDataURL()操作的时候,跨域问题就出来了,而且跨域问题还不止一层。 二、canvas图片getImageData cross-origin跨域问题 对于跨域的图片,只要能够在网页中正常显示出来,就可以使用 canvas 的drawImage() API绘制出来。 但是如果你想更进一步,通过getImageData()方法获取图片的完整的像素信息,则多半会出错。 六、结束语 那么这就是有关于:“html5中如何解决canvas图片getImageData,toDataURL跨域问题?”
像素操作 2.1 获取一张图片的像素数据 语法: //x、y表示所选图片区域的坐标 //width、height表示所选图片区域的宽度和高度 let imgData = cxt.getImageData (x, y, width, height); let data = imgData.data; getImageData()方法返回一个canvasPixelArray对象,该对象有个data属性,是用来保存一张图片像素数据的数组 2.2 输出一张图片的像素数据 语法: //image:表示重新绘制的图形,也就是用getImageData()方法获取的canvasPixelArray对象 //x、y:表示重新绘制图形左上角饿横坐标和纵坐标 示例代码: //反转效果 reversePixel(cxt){ cxt.drawImage(this.imgObj, 10, 10, 120, 80); let imgData = cxt.getImageData //亮度效果 brightnessPixel(cxt){ cxt.drawImage(this.imgObj, 10, 10, 120, 80); let imgData = cxt.getImageData
实现思路 我们知道图片是由多个像素点组成的,通过canvas的getImageData方法,我们可以得到画布指定矩形的像素数据 getImageData() 方法返回 ImageData 对象,该对象拷贝了画布指定矩形的像素数据 ; context.textBaseline = 'Middle'; context.fillText(content, 100, 100) console.log(context.getImageData ctx = myCanvas.getContext("2d") const bit = 0 const offset = 3 const oImageData = getImageData (rawImageSrc) const oData = oImageData.data const newData = getImageData(watermarkImageSrc const myContext = myCanvas.getContext("2d") myContext.drawImage(img, 0, 0); return myContext.getImageData
在画布上嵌入一个图片,鼠标在图像上移动的时候显示鼠标所在位置颜色信息 实现方法: (1)创建一个图片对象 (2)图片对象加载完成时,执行获取颜色信息的函数 (3)颜色信息的函数主要包括,获取鼠标所在点的位置,通过getImageData color"); function pick(event) { var x = event.layerX; var y = event.layerY; var pixel = ctx.getImageData rgba } canvas.addEventListener("mousemove",pick) </script> </body> 查看选择器效果 注意: (1)图片的路径不能跨域,否则getImageData 不执行,会报错显示Uncaught DOMException: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas
这里通过 canvas 的getImageData方法快速获取 ImageData 数据。然后通过putImageData把处理好的内容重新描绘到画图上。 实现方式:使用getImageData获取图像数据,然后遍历每个像素,将每个像素的 RGB 值取反,再使用putImageData将修改后的数据绘制回 Canvas。 实现方式:使用getImageData获取图像数据,然后遍历每个像素,调整每个像素的亮度值,再使用putImageData将修改后的数据绘制回 Canvas。 实现方式:使用getImageData获取图像数据,然后遍历每个像素,调整每个像素的色调、饱和度和亮度,再使用putImageData将修改后的数据绘制回 Canvas。 实现方式:使用getImageData获取图像数据,然后遍历每个像素,调整每个像素的透明度值,再使用putImageData将修改后的数据绘制回 Canvas。
什么是 ImageData 回答这个问题之前,我先来介绍一个 Canvas 的 API getImageData, 这个 方法会返回一个 ImageData,它用来描述"canvas"元素的一个隐含像素数据的区域 使用 ImageData() 构造函数创建或者使用和 canvas 在一起的 CanvasRenderingContext2D 对象的创建方法:createImageData() 和 getImageData 我们这次就使用getImageData(). 我们来实际测试一下 先说结果,结果是一个像素的 Canvas 占内存是4Byte。 我做了一个实验,具体是怎么做的呢?我们一起来看一下。 () { var imgData = ctx.getImageData(10, 10, 1, 1); console.log(imgData); return imgData; } </script> <button onclick="<em>getImageData</em>()">获取1像素信息</button> </body> </html
插值计算出插值颜色所在的位置,通过canvas的getImageData方法获取。 grd; ctx.fillRect(0, 0, 100, 1); var x = parseInt(r * 100); var colorData = ctx.getImageData g: colorData[1], b: colorData[2], a: colorData[3] }; } 上面代码使用了getImageData 方法,有关getImageData的说明,可以参考:https://xiaozhuanlan.com/topic/5473801692
看了下代码,依然是 在一个canvas里嵌入
List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>(); errorCode = faceEngine.detectFaces(imageInfo.getImageData 特征提取 FaceFeature faceFeature = new FaceFeature(); errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData <FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>(); errorCode = faceEngine.detectFaces(imageInfo2.getImageData FaceFeature faceFeature2 = new FaceFeature(); errorCode = faceEngine.extractFaceFeature(imageInfo2.getImageData
将图片绘制上去后,还可以使用 context.getImageData(sx, sy, sw, sh) 方法获取 canvas 区域隐含的像素数据,该方法返回一个 ImageData 对象,里面包含的是 getImageData 函数参数 这个函数有四个参数,都是必选的。 格式:context.getImageData(sx, sy, sw, sh)。 图片加载好后在获得像素,不然获得不了 image.onload = function(){ ctx.drawImage(image,0,0); var imageData = ctx.getImageData (0,0,cvs.width,cvs.height); console.log(imageData); } 报错信息: Failed to execute 'getImageData' on 我们可以用 getImageData 将获取到的 imageData 数据处理后再使用 putImageData 方法重新绘制到 canvas 中。
\n\n它们分别是:\n\n- getImageData()\n- putImageData()\n- createImageData()\n\n \n\n## getImageData()\n\ngetImageData \n\n语法:\n\njs\ncontext.getImageData(x, y, width, height)\n\n\n- x: 开始复制的左上角位置的 x 坐标。 然后使用 getImageData() 方法获取该图片的数据(为了展示方便,我在开发中使用的猫图是压缩过尺寸的)。 不重要~\n- height: 图片高度\n- width: 图片宽度\n\n \n\n通过 getImageData() 获取到的信息中,需要重点关注的是 data ,它是一个一维数组,仔细观察发现里面的值没一个是大于 /cat.jpg'\n\n img.onload = () => {\n ctx.drawImage(img, 0, 0)\n\n const imgData = ctx.getImageData
绘制图像: drawImage(img,x,y,width,height) 或 drawImage(img,sx,sy,swidth,sheight,x,y,width,height) 获取图像数据: getImageData 0, 0, canvas.width, canvas.height); }; }; script> 如下图所示,图片被画入了 canvas: 实现滤镜 这里我们主要借用getImageData ctx.drawImage(img, 0, 0, canvas.width, canvas.height); // 开始滤镜处理 var imgData = ctx.getImageData 而 getImageData 获得的 RGB 中的数值理论最大值是:255。 ctx.drawImage(img, 0, 0, canvas.width, canvas.height); // 开始滤镜处理 var imgData = ctx.getImageData
04 禁用取色 可以从上面看到 getImageData 耗时非常多,那为什么滚动的时候会用到 getImageData 呢?这就不得不说到 Canvas 的事件系统了。 事件触发时通过 hitCanvas 的 getImageData 方法拿到 colorKey,进一步拿到对应的 Shape。 我们在自己电脑本地执行了 1000 次 getImageData,发现耗时非常多。在滚动的时候,很容易触发大量调用 getImageData。 Navigated to file xx getImageData 1000次: 250.051025390625 ms Navigated to file xx getImageData to file xx getImageData 1000次: 254.847900390625 ms 怎么避免调用 getImageData 呢?
为了不让大家失望,先强调一句:下列效果需调用getImageData(),而这个方法会被某些浏览器阻止,如chrome。 或者可以将图片写入PHP,具体可参照 解决getImageData跨域
第一个效果:灰度图
插入html如下:
c1.getContext(“2d”);
ctx.drawImage(img1,0,0,c1.width,c1.height);//将image绘制到canvas上
var imgData=ctx.getImageData height;
var ctx=c1.getContext(“2d”);
ctx.drawImage(img1,0,0,c1.width,c1.height);
var imgData=ctx.getImageData
QString data = QString("<FindFeature FaceID=\"%1\">%2</FindFeature>").arg(faceID).arg(DeviceFun::getImageData ); list.append(QString("<FaceImage1 FaceID=\"%1\">%2</FaceImage1>").arg(faceID1).arg(DeviceFun::getImageData ); list.append(QString("<FaceImage2 FaceID=\"%1\">%2</FaceImage2>").arg(faceID2).arg(DeviceFun::getImageData QString data = QString("<AppendFace FaceID=\"%1\">%2</AppendFace>").arg(faceID).arg(DeviceFun::getImageData QString data = QString("<FindByImage FaceID=\"%1\">%2</FindByImage>").arg(faceID).arg(DeviceFun::getImageData
我们实现的功能主要有: 文本点状绘制 点与点之间连线 鼠标移动,点线进行规避 在进行这三个主要功能讲解之前,我们得先了解 canvas 中的一个方法 getImageData(),这很重要,这是本效果最重要的 getImageData() 方法 getImageData() 返回一个代表二维画布像素数据的 ImageData 对象。这个对象包含属性有: ImageData.data:只读属性。 textCoordinates = null; const textMaxWidth = 100; let textMaxHeight = 34; textCoordinates = context.getImageData 读者如果感兴趣,可以根据自己的灵感进行扩展创作,比如对图片进行像素化,绘制天空星座图,模拟玻璃破碎效果等等 参考 Franks laboratory CanvasRenderingContext2D.getImageData