一、繪制圖片的方法
| drawImage(image,x,y) | 在canvas中(x,y)處繪制圖片 |
|---|---|
| drawImage(image,x,y,width,height) | 在canvas中(x,y)處繪制圖片,并將其縮放到指定的寬度和高度 |
| drawImage(image,sourceX,sourceY,sourceWidth,sourceHeight,x,y,width,height) | 從圖片中切割出一個(gè)矩形區(qū)域(sourceX,sourceY,sourceWidth,sourceHeight),縮放到指定的寬度和高度,并在canvas中(x,y)繪制出來。 |
canvas繪制圖像有幾個(gè)需要注意的地方
1、需要先實(shí)例化一個(gè)img對象,
2、通過img對象的src屬性來引入外部圖片
3、繪制圖片語句必須在圖片預(yù)加載完成后進(jìn)行,不然有時(shí)候畫不上去
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>繪制圖片</title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="500">您的瀏覽器不支持canvas</canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
var img= new Image();
img.src = "caomei-003.jpg";
img.onload = function(){
//一、控制在畫布上的位置
context.drawImage(img,0,0);
//二、控制在畫布上位置+大小
// context.drawImage(img,0,0,400,200);
//三、裁剪(原圖起點(diǎn),寬高,目標(biāo)圖起點(diǎn),寬高)
// context.drawImage(img,0,0,100,100,20,20,100,100);
}
</script>
</html>
二、像素
我們將圖片畫上去之后,可以利用上下文的getImageData()來獲取指定區(qū)域的像素值,得到一個(gè)對象ImageData,ImageData有三個(gè)屬性:width,height,data
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>繪制圖片</title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="500">您的瀏覽器不支持canvas</canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
var img= new Image();
img.src = "gui.jpg";
img.onload = function(){
context.drawImage(img,0,0);
//獲取畫布上所有像素點(diǎn)
var imageData = context.getImageData(0,0,800,500);
console.log(imageData)
context.putImageData(imageData,100,100);
}
</script>
</html>

width和height表示訪問像素區(qū)域大小
data是一個(gè)包含訪問區(qū)域所有像素信息的屬性
我們不僅可以獲取像素,還可以繪制像素
繪制像素我們用putImageData(imageData,x,y);
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>繪制圖片</title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="500">您的瀏覽器不支持canvas</canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
var img= new Image();
img.src = "gui.jpg";
img.onload = function(){
context.drawImage(img,0,0);
//獲取畫布上所有像素點(diǎn)
var imageData = context.getImageData(0,0,800,500);
console.log(imageData)
//把獲取的像素點(diǎn)重新放到畫布上context.putImageData(imageData,100,100);
}
</script>
</html>

三、灰度處理
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>繪制圖片</title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="500">您的瀏覽器不支持canvas</canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
var img= new Image();
img.src = "gui.jpg";
img.onload = function(){
context.drawImage(img,0,0);
//獲取畫布上所有像素點(diǎn)
var imageData = context.getImageData(0,0,800,500);
console.log(imageData)
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 gray = (r+g+b)/3;
imageData.data[i] = gray;
imageData.data[i+1] =gray;
imageData.data[i+2] = gray;
}
//把改完的像素點(diǎn)重新放到畫布上
context.putImageData(imageData,100,100);
}
</script>
</html>

imageData.data.length是獲取到的像素點(diǎn)的個(gè)數(shù),根據(jù)我們的rgba取值,imageData.data[i]表示紅色r,imageData.data[i+1]表示綠色g,imageData[i+2]表示藍(lán)色b,imageData.data[i+3]表示透明度a,我們?nèi)、g、b三者的平均值來得到灰色。
正如上面代碼中的寫法
我們再補(bǔ)充一個(gè),大家知道怎么取顏色的反色嗎?
反色就是將255-原來的rgb值,得到新的rgb值,就能得到反色,利用這種方法沒我們也可以將圖片進(jìn)行反色處理
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>繪制圖片</title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="800" height="500">您的瀏覽器不支持canvas</canvas>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
var context = canvas.getContext("2d");
var img= new Image();
img.src = "caomei-003.jpg";
img.onload = function(){
context.drawImage(img,0,0);
//獲取畫布上所有像素點(diǎn)
var imageData = context.getImageData(0,0,800,500);
console.log(imageData)
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];
imageData.data[i] = 255-r;
imageData.data[i+1] =255-g;
imageData.data[i+2] = 255-b;
}
// //把改完的像素點(diǎn)重新放到畫布上
context.putImageData(imageData,100,100);
}
</script>
</html>
得到效果如圖

四、canvas 對圖形的存儲(chǔ)
1、canvas.toDataURL()方>法返回一個(gè)包含圖片展示的所有信息,參數(shù)可忽略
2、如果畫布的寬度或高度為0,那么返回字符串“data:,”
3、返回值以“data:image/png,base64”開頭,說明該方法已經(jīng)將圖片轉(zhuǎn)化為base64格式,返回值類型是string類型。
下面我寫個(gè)測試,在點(diǎn)擊按鈕時(shí)會(huì)在畫布上畫一個(gè)一模一樣的圖形
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
canvas{
border:1px solid red;
}
</style>
</head>
<body>
<canvas id="mycanvas" width="=400" height="400"></canvas>
<button onclick="sub()">點(diǎn)擊</button>
</body>
<script type="text/javascript">
var canvas = document.getElementById("mycanvas");
context = canvas.getContext("2d");
context.beginPath();
context.fillStyle = "red";
context.fillRect(100,100,100,100);
console.log(canvas.toDataURL())
function sub(){
//將矩形變成圖片
var base64 = canvas.toDataURL();
var img = new Image();
img.src = base64;
document.getElementsByTagName("body")[0].appendChild(img);
}
</script>
</html>

打印出來的圖片信息如下

我們可以直接將該data信息復(fù)制到瀏覽器的地址欄打開
