使ç¨å¾å
canvas æ´æææçä¸é¡¹ç¹æ§å°±æ¯å¾åæä½è½åãå¯ä»¥ç¨äºå¨æçå¾ååææè ä½ä¸ºå¾å½¢çèæ¯ï¼ä»¥å游æçé¢ï¼Spritesï¼ççãæµè§å¨æ¯æçä»»ææ ¼å¼çå¤é¨å¾çé½å¯ä»¥ä½¿ç¨ï¼æ¯å¦ PNGãGIF æè JPEGãä½ çè³å¯ä»¥å°åä¸ä¸ªé¡µé¢ä¸å ¶ä» canvas å ç´ çæçå¾çä½ä¸ºå¾çæºã
å¼å ¥å¾åå° canvas ééè¦ä»¥ä¸ä¸¤æ¥åºæ¬æä½ï¼
- è·å¾ä¸ä¸ªæå
HTMLImageElementç对象æè å¦ä¸ä¸ª canvas å ç´ çå¼ç¨ä½ä¸ºæºï¼ä¹å¯ä»¥éè¿æä¾ä¸ä¸ª URL çæ¹å¼æ¥ä½¿ç¨å¾çï¼åè§ä¾åï¼ - 使ç¨
drawImage()彿°å°å¾çç»å¶å°ç»å¸ä¸
æä»¬æ¥ççå ·ä½æ¯æä¹åçã
è·å¾éè¦ç»å¶çå¾ç
canvas ç API å¯ä»¥ä½¿ç¨ä¸é¢è¿äºç±»åä¸çä¸ç§ä½ä¸ºå¾ççæºï¼
HTMLImageElement-
è¿äºå¾çæ¯ç±
Image()彿°æé åºæ¥çï¼æè ä»»ä½ç<img>å ç´ HTMLVideoElement-
ç¨ä¸ä¸ª HTML ç
<video>å ç´ ä½ä¸ºä½ çå¾çæºï¼å¯ä»¥ä»è§é¢ä¸æåå½å帧ä½ä¸ºä¸ä¸ªå¾å HTMLCanvasElement-
å¯ä»¥ä½¿ç¨å¦ä¸ä¸ª
<canvas>å ç´ ä½ä¸ºä½ çå¾çæºã ImageBitmap-
è¿æ¯ä¸ä¸ªé«æ§è½çä½å¾ï¼å¯ä»¥ä½å»¶è¿å°ç»å¶ï¼å®å¯ä»¥ä»ä¸è¿°çæææºä»¥åå ¶ä»å ç§æºä¸çæã
è¿äºæºç»ä¸ç± CanvasImageSourceç±»åæ¥å¼ç¨ã
æå ç§æ¹å¼å¯ä»¥è·å尿们éè¦å¨ canvas ä¸ä½¿ç¨çå¾çã
使ç¨ç¸å页é¢å çå¾ç
æä»¬å¯ä»¥éè¿ä¸åæ¹æ³çä¸ç§æ¥è·å¾ä¸ canvas ç¸å页é¢å çå¾ççå¼ç¨ï¼
document.imageséådocument.getElementsByTagName()æ¹æ³- å¦æä½ ç¥éä½ æ³ä½¿ç¨çæå®å¾çç IDï¼ä½ å¯ä»¥ç¨
document.getElementById()è·å¾è¿ä¸ªå¾ç
使ç¨å ¶ä»ååä¸çå¾ç
å¨ HTMLImageElementä¸ä½¿ç¨crossOrigin屿§ï¼ä½ å¯ä»¥è¯·æ±å è½½å
¶ä»ååä¸çå¾çã妿å¾ççæå¡å¨å
许跨å访é®è¿ä¸ªå¾çï¼é£ä¹ä½ å¯ä»¥ä½¿ç¨è¿ä¸ªå¾çè䏿±¡æ canvasï¼å¦åï¼ä½¿ç¨è¿ä¸ªå¾çå°ä¼æ±¡æ canvasã
使ç¨å ¶ä» canvas å ç´
åå¼ç¨é¡µé¢å
çå¾ç类似å°ï¼ç¨ document.getElementsByTagName æ document.getElementById æ¹æ³æ¥è·åå
¶ä» canvas å
ç´ ãä½ä½ å¼å
¥çåºè¯¥æ¯å·²ç»åå¤å¥½ç canvasã
ä¸ä¸ªå¸¸ç¨çåºç¨å°±æ¯å°ç¬¬äºä¸ª canvas ä½ä¸ºå¦ä¸ä¸ªå¤§ç canvas ç缩ç¥å¾ã
ç±é¶å¼å§å建å¾å
æè
æä»¬å¯ä»¥ç¨èæ¬å建ä¸ä¸ªæ°ç HTMLImageElement 对象ãè¦å®ç°è¿ä¸ªæ¹æ³ï¼æä»¬å¯ä»¥ä½¿ç¨å¾æ¹ä¾¿ç Image() æé 彿°ã
var img = new Image(); // å建ä¸ä¸ª<img>å
ç´
img.src = "myImage.png"; // 设置å¾çæºå°å
å½èæ¬æ§è¡åï¼å¾çå¼å§è£ è½½ã
è¥è°ç¨ drawImage æ¶ï¼å¾ç没è£
è½½å®ï¼é£ä»ä¹é½ä¸ä¼åçï¼å¨ä¸äºæ§çæµè§å¨ä¸å¯è½ä¼æåºå¼å¸¸ï¼ãå æ¤ä½ åºè¯¥ç¨ load äºä»¶æ¥ä¿è¯ä¸ä¼å¨å è½½å®æ¯ä¹å使ç¨è¿ä¸ªå¾çï¼
var img = new Image(); // å建 img å
ç´
img.onload = function () {
// æ§è¡ drawImage è¯å¥
};
img.src = "myImage.png"; // 设置å¾çæºå°å
å¦æä½ åªç¨å°ä¸å¼ å¾ççè¯ï¼è¿å·²ç»å¤äºãä½ä¸æ¦éè¦ä¸æ¢ä¸å¼ å¾çï¼é£å°±éè¦æ´å 夿çå¤çæ¹æ³ï¼ä½å¾çé¢å è½½çç¥è¶ åºæ¬æç¨çèå´ã
éè¿ data: url æ¹å¼åµå ¥å¾å
æä»¬è¿å¯ä»¥éè¿ data:url æ¹å¼æ¥å¼ç¨å¾åãData urls å 许ç¨ä¸ä¸² Base64 ç¼ç çåç¬¦ä¸²çæ¹å¼æ¥å®ä¹ä¸ä¸ªå¾çã
img.src =
"data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw==";
å ¶ä¼ç¹å°±æ¯å¾çå 容峿¶å¯ç¨ï¼æ é¡»åå°æå¡å¨å ä¸åãï¼è¿æä¸ä¸ªä¼ç¹æ¯ï¼å¯ä»¥å° CSSï¼JavaScriptï¼HTML å å¾çå ¨é¨å°è£ å¨ä¸èµ·ï¼è¿ç§»èµ·æ¥ååæ¹ä¾¿ãï¼ç¼ºç¹å°±æ¯å¾å没æ³ç¼åï¼å¾ç大çè¯å åµç url æ°æ®ä¼ç¸å½çé¿ï¼
使ç¨è§é¢å¸§
ä½ è¿å¯ä»¥ä½¿ç¨<video> ä¸çè§é¢å¸§ï¼å³ä¾¿è§é¢æ¯ä¸å¯è§çï¼ãä¾å¦ï¼å¦æä½ æä¸ä¸ª ID 为âmyvideoâç<video> å
ç´ ï¼ä½ å¯ä»¥è¿æ ·åï¼
function getMyVideo() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
return document.getElementById("myvideo");
}
}
å®å°ä¸ºè¿ä¸ªè§é¢è¿åHTMLVideoElementå¯¹è±¡ï¼æ£å¦æä»¬å颿å°çï¼å®å¯ä»¥ä½ä¸ºæä»¬ç Canvas å¾çæºã
ç»å¶å¾ç
䏿¦è·å¾äºæºå¾å¯¹è±¡ï¼æä»¬å°±å¯ä»¥ä½¿ç¨ drawImage æ¹æ³å°å®æ¸²æå° canvas éãdrawImage æ¹æ³æä¸ç§å½¢æï¼ä¸é¢æ¯æåºç¡çä¸ç§ã
drawImage(image, x, y)-
å ¶ä¸
imageæ¯imageæècanvas对象ï¼xåyæ¯å ¶å¨ç®æ canvaséçèµ·å§åæ ã
夿³¨ï¼SVG å¾åå¿ é¡»å¨ <svg> æ ¹æå®å ç´ ç宽度åé«åº¦ã
示ä¾ï¼ä¸ä¸ªç®åç线å¾
ä¸é¢ä¸ä¸ªä¾åæç¨ä¸ä¸ªå¤é¨å¾åä½ä¸ºä¸çº¿æ§å¾çèæ¯ãç¨èæ¯å¾æä»¬å°±ä¸éè¦ç»å¶å¤æçèæ¯ï¼çä¸ä¸å°ä»£ç ãè¿éåªç¨å°ä¸ä¸ª image 对象ï¼äºæ¯å°±å¨å®ç onload äºä»¶ååºå½æ°ä¸è§¦åç»å¶å¨ä½ãdrawImage æ¹æ³å°èæ¯å¾æ¾ç½®å¨ canvas çå·¦ä¸è§ (0,0) å¤ã
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
var img = new Image();
img.onload = function () {
ctx.drawImage(img, 0, 0);
ctx.beginPath();
ctx.moveTo(30, 96);
ctx.lineTo(70, 66);
ctx.lineTo(103, 76);
ctx.lineTo(170, 15);
ctx.stroke();
};
img.src = "backdrop.png";
}
ç»æçèµ·æ¥æ¯è¿æ ·çï¼
缩æ¾
drawImage æ¹æ³çåä¸åç§æ¯å¢å äºä¸¤ä¸ªç¨äºæ§å¶å¾åå¨ canvas ä¸ç¼©æ¾çåæ°ã
drawImage(image, x, y, width, height)-
è¿ä¸ªæ¹æ³å¤äº 2 ä¸ªåæ°ï¼
widthåheightï¼è¿ä¸¤ä¸ªåæ°ç¨æ¥æ§å¶ å½å canvas ç»å ¥æ¶åºè¯¥ç¼©æ¾ç大å°
示ä¾ï¼å¹³éºå¾å
å¨è¿ä¸ªä¾åéï¼æä¼ç¨ä¸å¼ å¾çåèæ¯ä¸æ ·å¨ canvas ä¸ä»¥éå¤å¹³éºå¼æ¥ãå®ç°èµ·æ¥ä¹å¾ç®åï¼åªéè¦å¾ªç¯éºå¼ç»è¿ç¼©æ¾çå¾çå³å¯ãè§ä¸é¢ç代ç ï¼ç¬¬ä¸å± for å¾ªç¯æ¯åè¡éå¤ï¼ç¬¬äºå±æ¯ååéå¤çãå¾å大å°è¢«ç¼©æ¾è³åæ¥çä¸åä¹ä¸ï¼50x38 pxãè¿ç§æ¹æ³å¯ä»¥ç¨æ¥å¾å¥½çè¾¾å°èæ¯å¾æ¡çææï¼å¨ä¸é¢çæç¨ä¸ä¼çå°ã
夿³¨ï¼å¾åå¯è½ä¼å ä¸ºå¤§å¹ åº¦ç缩æ¾èåå¾èµ·æç¹æè 模ç³ãå¦æä½ çå¾åé颿æåï¼é£ä¹æå¥½è¿æ¯ä¸è¦è¿è¡ç¼©æ¾ï¼å ä¸ºé£æ ·å¤çä¹åå¾å¯è½å¾åéçæåå°±ä¼å徿 æ³è¾¨è®¤äºã
function draw() {
const ctx = document.getElementById("canvas").getContext("2d");
const img = new Image();
img.onload = () => {
for (let i = 0; i < 4; i++) {
for (let j = 0; j < 3; j++) {
ctx.drawImage(img, j * 50, i * 38, 50, 38);
}
}
};
img.src = "https://mdn.github.io/shared-assets/images/examples/rhino.jpg";
}
draw();
ç»æçèµ·æ¥åè¿æ ·ï¼
åç
drawImage æ¹æ³ç第ä¸ä¸ªä¹æ¯æåä¸ä¸ªåç§æ 8 个æ°åæ°ï¼ç¨äºæ§å¶ååçæ¾ç¤ºçã
drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)-
第ä¸ä¸ªåæ°åå ¶ä»çæ¯ç¸åçï¼é½æ¯ä¸ä¸ªå¾åæè å¦ä¸ä¸ª canvas çå¼ç¨ãå ¶ä» 8 ä¸ªåæ°æå¥½æ¯åç §å³è¾¹çå¾è§£ï¼å 4 个æ¯å®ä¹å¾åæºçåçä½ç½®å大å°ï¼å 4 ä¸ªåæ¯å®ä¹åççç®æ æ¾ç¤ºä½ç½®å大å°ã

åçæ¯ä¸ªåå¾ååæçå¼ºå¤§å·¥å ·ãå设æä¸å¼ å å«äºææå ç´ çå¾åï¼é£ä¹ä½ å¯ä»¥ç¨è¿ä¸ªæ¹æ³æ¥åæä¸ä¸ªå®æ´å¾åãä¾å¦ï¼ä½ æ³ç»ä¸å¼ å¾è¡¨ï¼èæä¸æä¸ä¸ªå 嫿æå¿ éçæåç PNG æä»¶ï¼é£ä¹ä½ å¯ä»¥å¾è½»æçæ ¹æ®å®é æ°æ®çéè¦æ¥æ¹åæç»æ¾ç¤ºçå¾è¡¨ãè¿æ¹æ³çå¦ä¸ä¸ªå¥½å¤å°±æ¯ä½ ä¸éè¦åç¬è£ è½½æ¯ä¸ä¸ªå¾åã
示ä¾ï¼ç¸æ¡
å¨è¿ä¸ªä¾åé颿ç¨å°ä¸é¢å·²ç»ç¨è¿çççå¾åï¼ä¸è¿è¿æ¬¡æè¦ç»çç头å个åçç¹åï¼ç¶ååæå°ä¸ä¸ªç¸æ¡éé¢å»ãç¸æ¡å¸¦æé´å½±ææï¼æ¯ä¸ä¸ªä»¥ 24-bit PNG æ ¼å¼ä¿åçå¾åãå 为 24-bit PNG å¾å带æä¸ä¸ªå®æ´ç 8-bit alpha ééï¼ä¸ GIF å 8-bit PNG ä¸åï¼æå¯ä»¥å°å®æ¾æèæ¯èä¸å¿ æ å¿åºè²çé®é¢ã
æç¨ä¸ä¸ªä¸ä¸é¢ç¨å°çä¸åçæ¹æ³æ¥è£
è½½å¾åï¼ç´æ¥å°å¾åæå
¥å° HTML éé¢ï¼ç¶åéè¿ CSS éèï¼display:noneï¼å®ã两个å¾åæé½èµäº id ï¼æ¹ä¾¿åé¢ä½¿ç¨ãçä¸é¢çèæ¬ï¼ç¸å½ç®åï¼é¦å
对çç头å好åçï¼ç¬¬ä¸æ¬¡drawImageï¼æ¾å¨ canvas ä¸ï¼ç¶ååä¸é¢å¥ä¸ªç¸æ¡ï¼ç¬¬äºæ¬¡drawImageï¼ã
<canvas id="canvas" width="150" height="150"></canvas>
<div style="display: none;">
<img
id="source"
src="https://mdn.github.io/shared-assets/images/examples/rhino.jpg"
width="300"
height="227" />
<img id="frame" src="canvas_picture_frame.png" width="132" height="150" />
</div>
async function draw() {
// çå¾
ææå¾ççå è½½ã
await Promise.all(
Array.from(document.images).map(
(image) =>
new Promise((resolve) => image.addEventListener("load", resolve)),
),
);
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
// ç»å¶åç
ctx.drawImage(
document.getElementById("source"),
33,
71,
104,
124,
21,
20,
87,
104,
);
// ç»å¶ç¸æ¡
ctx.drawImage(document.getElementById("frame"), 0, 0);
}
draw();
ç»å»ç¤ºä¾
æè¿ä¸ç« æåçç¤ºä¾æ¯å¼ä¸ä¸ªå°ç»å»ãç»å»ç±æçå å¼ ç»ä½çæ ¼åç»æãå½é¡µé¢è£ 载好ä¹åï¼ä¸ºæ¯å¼ ç»å建ä¸ä¸ª canvas å ç´ å¹¶ç¨å ä¸ç»æ¡ç¶åæå ¥å°ç»å»ä¸å»ã
卿è¿ä¸ªä¾åéé¢ï¼ææâç»â齿¯åºå®å®½é«çï¼ç»æ¡ä¹æ¯ãä½ å¯ä»¥åäºæ¹è¿ï¼éè¿èæ¬ç¨ç»ç宽髿¥åç¡®æ§å¶å´ç»å®çç»æ¡ç大å°ã
ä¸é¢ç代ç åºè¯¥æ¯è®ç®åææçäºãå°±æ¯éåå¾å对象æ°ç»ï¼ä¾æ¬¡å建æ°ç canvas å
ç´ å¹¶æ·»å è¿å»ãå¯è½å¯ä¸éè¦æ³¨æçï¼å¯¹äºé£äºå¹¶ä¸çæ DOM çæåæ¥è¯´ï¼æ¯ Node.insertBefore æ¹æ³çç¨æ³ãinsertBefore æ¯ç¶èç¹ï¼åå
æ ¼ï¼çæ¹æ³ï¼ç¨äºå°æ°èç¹ï¼canvas å
ç´ ï¼æå
¥å°æä»¬æ³è¦æå
¥çèç¹ä¹åã
<html>
<body onload="draw();">
<table>
<tr>
<td><img src="gallery_1.jpg" /></td>
<td><img src="gallery_2.jpg" /></td>
<td><img src="gallery_3.jpg" /></td>
<td><img src="gallery_4.jpg" /></td>
</tr>
<tr>
<td><img src="gallery_5.jpg" /></td>
<td><img src="gallery_6.jpg" /></td>
<td><img src="gallery_7.jpg" /></td>
<td><img src="gallery_8.jpg" /></td>
</tr>
</table>
<img id="frame" src="canvas_picture_frame.png" width="132" height="150" />
</body>
</html>
body {
background: 0 -100px repeat-x url(bg_gallery.png) #4f191a;
margin: 10px;
}
img {
display: none;
}
table {
margin: 0 auto;
}
td {
padding: 15px;
}
function draw() {
// Loop through all images
for (i = 0; i < document.images.length; i++) {
// Don't add a canvas for the frame image
if (document.images[i].getAttribute("id") != "frame") {
// Create canvas element
canvas = document.createElement("CANVAS");
canvas.setAttribute("width", 132);
canvas.setAttribute("height", 150);
// Insert before the image
document.images[i].parentNode.insertBefore(canvas, document.images[i]);
ctx = canvas.getContext("2d");
// Draw image to canvas
ctx.drawImage(document.images[i], 15, 20);
// Add frame
ctx.drawImage(document.getElementById("frame"), 0, 0);
}
}
}
æ§å¶å¾åç缩æ¾è¡ä¸º
å¦ååææè¿°ï¼è¿åº¦ç¼©æ¾å¾åå¯è½ä¼å¯¼è´å¾åæ¨¡ç³æåç´ åãä½ å¯ä»¥éè¿ä½¿ç¨ç»å¾ç¯å¢çimageSmoothingEnabled屿§æ¥æ§å¶æ¯å¦å¨ç¼©æ¾å¾åæ¶ä½¿ç¨å¹³æ»ç®æ³ãé»è®¤å¼ä¸ºtrueï¼å³å¯ç¨å¹³æ»ç¼©æ¾ãä½ ä¹å¯ä»¥åè¿æ ·ç¦ç¨æ¤åè½ï¼
ctx.mozImageSmoothingEnabled = false;
ctx.webkitImageSmoothingEnabled = false;
ctx.msImageSmoothingEnabled = false;
ctx.imageSmoothingEnabled = false;