2016年8月29日 星期一

HTML5 - canvas : drawImage(2)

HTML
<!--Original source http://www.html5canvastutorials.com/tutorials/html5-canvas-image-loader/-->
<canvas id="myCanvas" width="400" height="400"></canvas>

JQuery 1.9.1
$(function(){
  function loadedImg(sources,callback){//sources=圖片素材來源物件,callback=處理圖片載入的callback function
  var imgs={};//建立imgs物件
  var loadedImgs=0;//預設已載入的圖片數為0
  var imgsTotal=0;//預設載入圖片總數為0
  for(var src in sources){//遍歷sources物件,src初始值為0
    imgsTotal++;//每執行一次imgsTotal+1
  };
  for(var src in sources){//遍歷sources物件,src初始值為0
    imgs[src]=new Image();//創建<img>物件
    imgs[src].onload=function(){//當圖片載入後
      if(++loadedImgs>=imgsTotal){//loadedImg先+1,當以載入圖片>=圖片總數時
        callback(imgs);//將imgs物件放入callback function
      };
    };
    imgs[src].src=sources[src];//將sources物件的圖片連結擷取出來給imgs
    };
  };
  var cxt=$('#myCanvas')[0].getContext('2d');
  var imgLink={//存有圖片路徑的物件
    photo1:'https://c2.staticflickr.com/1/437/18634993201_10aa53d5ef_k.jpg',
    photo2:'https://c3.staticflickr.com/1/469/18010094874_0b037901e4_k.jpg'
  };
  loadedImg(imgLink,function(i){//這邊的function(i)等於callback(imgs)
    cxt.drawImage(i.photo1,10,10,200,200);//創建第一張圖,用i.photo來連結使用的<img>
    cxt.drawImage(i.photo2,10,220,200,200);//創建第二張圖,用i.photo來連結使用的<img>
  });
});


主要使用function :
  1. loadedImg() - 此function的作用為,當圖片都載入完成後,才繪製canvas裡的圖片。

Result


JSFiddle
https://jsfiddle.net/MickeyChen/qs6erbqL/

HTML5 - canvas : drawImage(1)

HTML
<canvas id="myCanvas" width="400" height="200"></canvas>
<canvas id="myCanvasCrop" width="400" height="400"></canvas>

JQuery 1.9.1
$(function(){
  var cxt=$('#myCanvas')[0].getContext('2d');
  var imgObj=new Image();
  imgObj.onload=function(){
    var imgWidth=imgObj.width*0.1;//根據原圖大小縮小寬90%
    var imgHeight=imgObj.height*0.1;//根據原圖大小縮小高90%
    cxt.drawImage(imgObj,0,0,imgWidth,imgHeight);
  }
  imgObj.src='https://c1.staticflickr.com/1/359/18606422976_a1fa874e07_k.jpg';//圖片導入
 
  var cxtC=$('#myCanvasCrop')[0].getContext('2d');
  var imgCrop=new Image();
  imgCrop.onload=function(){
    cxtC.drawImage(imgCrop,300,400,300,300,0,0,300,300);
  };
  imgCrop.src=imgObj.src;//兩個<canvas>使用同一張外部相片
});


主要使用function :
  1. drawImage() - 在畫布上繪製圖片,drawImage('要使用的圖像<img>','素材圖片要擷取的x軸','素材圖片要擷取的y軸','素材圖片要擷取的寬','素材圖片要擷取的高','這張圖要放在<canvas>的x軸','這張圖要放在<canvas>的y軸','這張圖要放在<canvas>的寬','這張圖要放在<canvas>的高')。

Result


JSFiddle
https://jsfiddle.net/MickeyChen/Lnhbh3ua/

2016年8月26日 星期五

HTML5 - canvas : gradient & pattern

HTML
<canvas id="myCanvas" width="400" height="400"></canvas>

JQuery 1.9.1
$(function(){
  var cxt=$('#myCanvas')[0].getContext('2d');
  //繪製不規則圖形
  cxt.beginPath();
  cxt.moveTo(100,50);//繪圖開始
  cxt.bezierCurveTo(120,0,140,0,135,50);
  cxt.bezierCurveTo(170,10,180,20,190,50);
  cxt.bezierCurveTo(250,10,300,20,290,70);
  cxt.bezierCurveTo(350,70,360,130,300,130);
  cxt.bezierCurveTo(300,200,250,190,200,150);
  cxt.bezierCurveTo(150,200,100,200,120,130);
  cxt.bezierCurveTo(50,100,0,20,100,50);
  cxt.closePath();//繪圖結束
  var img=new Image();//建立image物件
  img.src='https://c1.staticflickr.com/1/359/18606422976_a1fa874e07_k.jpg';//載入圖片
  var pattern=cxt.createPattern(img,'no-repeat');//設定圖片為pattern並給予cxt物件
  cxt.fillStyle=pattern;//將cxt填滿
  cxt.fill();
  cxt.stroke();
  
  cxt.beginPath();//繪圖開始
  cxt.rect(10,200,300,50);//繪製方形
  var grd=cxt.createLinearGradient(10,200,300,50);//繪製線性漸層並給予cxt物件
  grd.addColorStop(0,'yellow');//漸層起始顏色
  grd.addColorStop(1,'red');//漸層結束顏色
  cxt.fillStyle=grd;//將cxt填滿
  cxt.fill();
  
  cxt.beginPath();//繪圖開始
  cxt.arc(60,330,50,0,Math.PI,true);//繪製半圓
  cxt.closePath();//繪圖結束,缺少這個設定,半圓將因為未關閉,所以缺少下方直線線條
  var rGrd=cxt.createRadialGradient(60,330,0,60,330,50);//繪製圓形漸層並給予cxt物件
  rGrd.addColorStop(0,"yellow");//漸層起始顏色
  rGrd.addColorStop(1,"red");//漸層結束顏色
  cxt.fillStyle=rGrd;//將cxt填滿
  cxt.fill()
  cxt.stroke();
});


主要使用function :
  1. closePath() - 告知程式這邊為繪圖的閉鎖點,結束繪製圖型。
  2. createPattern() - 將外部圖片導入為繪製物件的背景圖片,createPattern('圖片物件','repeat / no-repeat / repeat-x / repeat-y')。
  3. createLinearGradient() - 繪製線性漸層,須先畫好底部的框架物件,才能將漸層填入,createLinearGradient('漸層的起始點x軸', '漸層的起始點y軸', '漸層的寬度', '漸層的高度')。
  4. addColorStop() - 配對createLinearGradient()顯示漸層的顏色區段addColorStop('顏色錨點0~1', '顏色')。
  5. createRadialGradient() - 繪製放射狀漸層,須先畫好底部的框架物件,才能將漸層填入,createRadialGradient('漸層起始x軸', '漸層起始y軸', '起始半徑', '漸層結束x軸', '漸層結束y軸', '結束半徑')。

Result

JSFiddle
https://jsfiddle.net/MickeyChen/0dyg5fp5/

2016年8月25日 星期四

HTML5 - canvas : lineJoin & arcTo

HTML
<canvas id="myCanvas" width="300" height="100"></canvas>
<canvas id="corner" width="300" height="200"></canvas>

JQuery 1.9.1
$(function(){
  var cxt=$('#myCanvas')[0].getContext('2d');
  cxt.beginPath();
  cxt.moveTo(10,90);
  cxt.lineTo(50,10);
  cxt.lineTo(90,90);
  cxt.lineCap='round';
  cxt.lineJoin='round';//圓頭
  cxt.strokeStyle="blue";
  cxt.lineWidth=10;
  cxt.stroke();
  
  cxt.beginPath();
  cxt.moveTo(110,90);
  cxt.lineTo(150,10);
  cxt.lineTo(190,90);
  cxt.lineCap='butt';
  cxt.lineJoin='miter';//尖頭
  cxt.strokeStyle="red";
  cxt.stroke();
  
  cxt.beginPath();
  cxt.moveTo(210,90);
  cxt.lineTo(250,10);
  cxt.lineTo(290,90);
  cxt.lineCap='square';
  cxt.lineJoin='bevel';//平頭
  cxt.strokeStyle="green";
  cxt.stroke();
  
  var corner=$('#corner')[0].getContext('2d');
  var rectWidth=200;
  var rectHeight=100;
  var rectX=10;
  var rectY=10;
  var radius=50;
  
  corner.beginPath();
  corner.moveTo(rectX, rectY);//起始點
  corner.lineTo(rectX + rectWidth - radius, rectY);//上橫線
  corner.arcTo(rectX + rectWidth, rectY, rectX + rectWidth, rectY + radius, radius);//導角
  corner.lineTo(rectX + rectWidth, rectY + rectHeight);//下直線
  corner.lineWidth =10;
  corner.lineCap='round';
  corner.stroke();
});


主要使用function :
  1. lineJoin - 線條線條交界處樣式。
    屬性
    round 圓頭。
    miter 預設值,尖頭。
    bevel 平頭。

  2. arcTo() - 繪製線框導角用,arcTo(起始點x軸, 起始點y軸, 結束點x軸, 結束點y軸, 半徑)。

Result


JSFiddle
https://jsfiddle.net/MickeyChen/1z8j6Lue/

2016年8月24日 星期三

HTML5 - canvas : larc, quadratic & bezier

HTML
<canvas id="myCanvas" width="100" height="400"></canvas>

JQuery 1.9.1
$(function(){
  var cxt=$('#myCanvas')[0].getContext('2d');
  cxt.beginPath();
  cxt.arc(50,50,30,0,2*Math.PI,true);//正圓形
  cxt.stroke();
  
  cxt.beginPath();
  cxt.arc(50,120,30,1.2*Math.PI,1.8*Math.PI,false);//用正圓描繪出來的弧度
  cxt.strokeStyle='#f00';
  cxt.stroke();
  
  cxt.beginPath();
  cxt.moveTo(2,180);
  cxt.quadraticCurveTo(50,100,100,180);//二維曲線
  cxt.strokeStyle='green';
  cxt.stroke();
  
  cxt.beginPath();
  cxt.moveTo(50,250);
  cxt.bezierCurveTo(2,150,50,200,80,250);//三維曲線
  cxt.strokeStyle='blue';
  cxt.stroke();
  
});


主要使用function :
  1. arc() - 用來畫正圓形或以正圓為依據的弧度,arc(正圓的中心x軸, 正圓的中心y軸, 半徑, 起始角度以三點鐘方向為0~1.9*Math.PI, 結束角度0~1.9*MathPI, true=逆時鐘 false=順時鐘)。
    http://www.w3school.com.cn/i/arc.gif

  2. quadraticCurveTo() - 用來繪製二維曲線,需要以moveTo()為開頭,quadraticCurveTo(控制點的x座標, 控制點的y座標, 結束點的x座標, 結束點的y座標)。
    圖片來源:http://www.w3school.com.cn/i/quadraticcurve.gif

  3. bezierCurveTo() - 用來繪製三維曲線,需要以moveTo()為開頭,bezierCurveTo(第一個控制點x座標, 第一個控制點y座標, 第二個控制點x座標, 第二個控制點y座標, 結束點的x座標, 結束點的y座標)。
    圖片來源:http://www.w3school.com.cn/i/beziercurve.gif

Result


JSFiddle
https://jsfiddle.net/MickeyChen/11dy3oqm/

2016年8月23日 星期二

HTML5 - canvas : line & font

Html5的新Tag中,用起來最讓我頭疼的可以算是canvas這個Tag了,所以還是乖乖的來寫學習筆記了.......

因為只需要一個畫布,所以html的部分只需要一個canvas就好。

HTML
<canvas height="300" id="canvas1" width="300"></canvas>

JQuery 1.9.1
$(function(){
  //先把畫布id存入變數中,並且宣告物件為2D類型。
  //使用jQuery時$('#id')後面一定要接[0],如使用JavaScript則不用另加[0]。
  var cxt=$('#canvas1')[0].getContext('2d');
  cxt.beginPath();//繪製第一個物件路徑。
  cxt.moveTo(10,10);//作畫的起始點。moveTo(x,y)
  cxt.lineTo(200,10);//從起始點算起要到下一個點的座標。lineTo(x,y)
  cxt.lineWidth=10;//線的寬度。
  cxt.lineCap='butt';//線頭的樣式,butt為切齊線段結尾點。
  cxt.strokeStyle='red';//設定線的顏色。
  cxt.stroke();//宣告這個圖形有線。
  cxt.font='20px';//設定文字大小
  cxt.fillStyle='blue';//設定繪圖物件內容物顏色,這邊只有文字會用到。
  cxt.fillText('Butt line', 210,15);//設定文字內容與座標。fillText('text',x,y)
  
  cxt.beginPath();//繪製第二個物件路徑。
  cxt.moveTo(10,30);
  cxt.lineTo(200,30);
  cxt.lineCap='round';//線頭的樣式,round為圓頭。
  cxt.stroke();
  cxt.fillText('Round line', 210,35);
  
  cxt.beginPath();//繪製第三個物件路徑。
  cxt.moveTo(10,50);
  cxt.lineTo(200,50);
  cxt.lineCap='square';//線頭的樣式,square為向外包裹的方形樣式。
  cxt.stroke();
  cxt.fillText('Square line', 210,55);
});


主要使用function :
  1. getContext() - 每一個canvas都只能有一個環境設定,目前只支援2D,但未來會擴充到3D。
  2. beginPath() - 開始繪製路徑,之後才可開始使用moveTo(), lineTo(), quadticCurveTo(), bezierCurveTo(), arcTo() 及arc()繪製路徑,後面必須宣告stroke(),路徑才會被繪製出來。
  3. stroke() - 設定完所有繪製路徑與設定後,驅動繪製的function,一定要放在繪製設定的最尾端。
  4. moveTo() - moveTo(起始x軸, 起始y軸),繪製線條時一定要設定的起始點。
  5. lineTo() - lineTo(下一個定位點的x軸, 下一個定位點的y軸)。
  6. fillText() - 把填色文字寫入<canvas>,fillText('要寫入的文案',起始x軸,起始y軸)。

Result


JSFiddle
https://jsfiddle.net/MickeyChen/eu7a82uk/