--- 内嵌图像
- drawImage可以绘制图像
context.drawImage(image,dx,dy)
context.drawImage(image,dx,dy,dw,dh)
context.drawImage(image,sx,sy,sw,sh,dx,dy,dw,dh)
- 基本绘制 图片根据尺寸自动截取左上角
image.onload = function(){
context.drawImage(image,0,0)
}
- 自动调整 调整图片加载尺寸
image.onload = function(){
context.drawImage(image,0,0,600,400);
}
- 选择一部分区域贴到目标区域
image.onload = function(){
context.drawImage(image,0,0);
context.drawImage(image,620,300,300,375,390,10,200,250);
}
---- 绘制像素
- getImageData() // 获取一个Canvas的像素数组
- putImageData() // 将ImageData写入到Canvas中
- createImageData() // 创建一个ImageData
- ImageData对象
context.filStyle = 'navy'; context.fillRect(0,0,1,1); context.fillStyle = 'teal'; context.fillRect(1,0,1,1); context.fillStyle = 'lime'; context.fillRect(0,1,1,1); context.fillStyle = 'yellow'; context.fillRect(1,1,1,1); ImageData = context.getImageData(0,0,canvas.width,canvas.heigt);
- ImageData.width // 图像宽度 - ImageData.heigth // 图像高度 - ImageData.data // 图像信息
for(var i=0; i<ImageData.data.length; i+= 4) { var r = ImageData.data[i]; var g = ImageData.data[i+1]; var b = ImageData.data[i+2]; var a = ImageData.data[i+3]; alert(r+" "+g+" "+b+" "+a); }
---- 修改像素
- 使用putImageData回写
for (var i=0; i<ImageData.data.length; i+=4) { ImageData.data[i] = parseInt(Math.random()*255); ImageData.data[i+1] = parseInt(Math.random()*255); ImageData.data[i+2] = parseInt(Math.random()*255); } context.putImageData(ImageData,dx,dy,[dirtyX,dirtY,dirtyWidth,dirtyHeight])
---- 创建ImageData
var imagedata = context.createImageData(2,2); for(var i=0; i<ImageData.data.length; i+=4){ imagedata.data[i] = parseInt(Math.random()*255); imagedata.data[i+1] = parseInt(Math.random()*255); imagedata.data[i+2] = parseInt(Math.random()*255); } context.putImageData(imagedata,0,0);
---- 操作像素
var image = new Image(); image.src = 'images/yosemite.jpg'; image.onload = function() { context.drawImage(image,0,0,360,240); var modified = context.createImag eData(360,240); var imagedata = context.getImageData(0,0,360,240); for (var i=0; i<imagedata.data.length; i+=4) { var rgba = grayLuminosity( imagedata.data[i+0], imagedata.data[i+1], imagedata.data[i+2], imagedata.data[i+3] ); modified.data[i+0] = rgba[0]; modified.data[i+1] = rgba[1]; modified.data[i+2] = rgba[2]; modified.data[i+3] = rgba[3]; } context.putImageDa ta(modified,0,0); };
----- 滤镜效果代码
var grayLightness = function(r,g,b,a) { var val = parseInt( (Math.max(r,g,b)+Math.min(r,g,b))*0.5 ); return [val,val,val,a]; }; var grayLuminosity = function(r,g,b,a) { var val = parseInt( (r*0.21)+(g*0.71)+(b*0.07) ); return [val,val,val,a]; }; var grayAverage = function(r,g,b,a) { var val = parseInt((r+g+b)/3.0 ); return [val,val,val,a]; }; var sepiaTone = function(r,g,b,a) { var rS = (r*0.393)+(g*0.769)+(b*0.189); var gS = (r*0.349)+(g*0.686)+(b*0.168); var bS = (r*0.272)+(g*0.534)+(b*0.131); return [ (rS>255) ? 255 : parseInt(rS), (gS>255) ? 255 : parseInt(gS), (bS>255) ? 255 : parseInt(bS),a]; }; var invertColor = function(r,g,b,a) { return [ (255‐r), (255‐g), (255‐b),a]; }; var swapChannels = function(r,g,b,a,order) { var rgba = [r,g,b,a]; return [ rgba[order[0]], rgba[order[1]], rgba[order[2]], rgba[order[3]]]; }; var monoColor = function(r,g,b,a,color) { return [ color[0], color[1], color[2], 255 ‐(parseInt((r+g+b)/3.0))]; };
----- 合成影像
- 当图形重叠时的绘制方法
context.globalCompositeOperation = 'source-over';
属性:
source-over/source-in/source-out/source-atop
destination-over/destination-in/destination-out/destination-atop
lighter/copy/xor
----- Patterns 复用模式
- createPattern()类似于drawImage()
context.createPattern(image,repetition)
- 复用模式
var cvs = document.createElement("CANVAS"); cvs.width = 20; cvs.height = 20; var ctx = cvs.getContext('2d'); ctx.fillStyle = 'lime'; ctx.fillRect(0,0,10,10); ctx.fillRect(10,10,10,10); ctx.fillStyle = 'green'; ctx.fillRect(10,0,10,10); ctx.fillRect(0,10,10,10); context.fillStyle = context.createPattern(cvs,'repeat'); context.fillRect(0,0,220,220);