使ç¨å½±åæ¯<canvas>
å¦ä¸åæè¶£çåè½ï¼éååè½å¯ä»¥ç¨ä¾åæ
çµååçæä½çºèæ¯ççãä»»ä½çè¦½å¨æ¯æ´çå¤é¨åçæ ¼å¼é½å¯ä»¥ä½¿ç¨ï¼ä¾å¦ PNG, GIF, æ JPEGï¼çè³ä¹å¯ä»¥å©ç¨åä¸ä»½é é¢ä¸å
¶ä»ç«å¸å
ç´ ç¢ççå½±å.
è¼å ¥å½±åå°ç«å¸ä¸åºæ¬ä¸éè¦å ©åæ¥é©ï¼
HTMLImageElement
ç©ä»¶æå
¶ä»ç«å¸å
ç´ çåç
§(reference)ä½çºä¾æºï¼ééå®ç´æä¾ URL æåçä½ç½®çæ¹å¼æ¯è¡ä¸éç.æ¥ä¸ä¾ä¾¿ä¾ççè¦æéº¼å.
åå¾å½±åç«å¸ API è½æ¥å以ä¸è³æåæ ä½çºå½±å便º:
HTMLImageElement
ç¨ Image()å»ºæ§æç影忿¯<img>
å
ç´ .
HTMLVideoElement
ç¨HTMLVideoElement
å
ç´ ä½å½±å便ºï¼æåå½±çç®åçå½±åç«æ ¼ç¶ä½å½±å使ç¨.
HTMLCanvasElement
ç¨å¦ä¸åHTMLCanvasElement
å
ç´ ç¶å½±å便º.
ImageBitmap
å¯ä»¥è¢«å¿«é渲æçé»é£å(bitmap)ï¼é»é£åè½ç±ä¸è¿°ææä¾æºç¢ç.
éäºä¾æºçµ±ä¸åç § CanvasImageSource åæ ã
æå¥½å¹¾ç¨®æ¹æ³è½å¤ åå¾å½±åç¨æ¼ç«å¸.
使ç¨åä¸ä»½ç¶²é ä¸çå½±åæåè½ééä¸é¢å¹¾åæ¹æ³åå¾å½±å:
document.images
document.getElementsByTagName()
æ¹æ³document.getElementById()
æ¹æ³Using the crossOrigin
attribute on an éé<HTMLImageElement>
çcrossOrigin
屬æ§, æåå¯ä»¥è¦æ±å¾å¦ä¸åç¶²åè¼å
¥å½±åä¾ä½¿ç¨ï¼è¥æ¯å¯åç¶²å(thehosting domain)å許跨網路åå該影åï¼é£éº¼æå便å¯ä»¥ä½¿ç¨å®èä¸ç¨æ±¡æ(taint)æåçç«å¸ï¼åä¹ï¼ä½¿ç¨è©²å½±åææ±¡æç«å¸(taint the canvas)ã
å¦ååå¾å
¶ä»å½±åï¼æå䏿¨£è½ç¨document.getElementsByTagName()
ædocument.getElementById()
æ¹æ³åå¾å
¶ä»ç«å¸å
ç´ ï¼ä½æ¯å¨ä½¿ç¨ä¹åè«è¨å¾ä¾æºç«å¸ä¸å·²ç¶æç¹ªä¸åäºã
使ç¨å ¶ä»ç«å¸å ç´ ä½çºå½±å便ºæå¾å¤æç¨çæç¨ç¨éï¼å ¶ä¸ä¹ä¸ä¾¿æ¯å»ºç«ç¬¬äºåå°ç«å¸ä½çºå¦ä¸å大ç«å¸ç縮å°å½±å.
åµé å ¨æ°çå½±åç¢çæ°çHTMLImageElement
ç©ä»¶ä¹è½ç¶ä½å½±å便ºï¼ééï¼æåå¯ä»¥ç¨ Image()ä¾å»ºæ§ä¸åæ°å½±åå
ç´ :
var img = new Image(); // Create new img element
img.src = "myImage.png"; // Set source path
ä¸è¿°ç¨å¼ç¢¼å·è¡å¾æè¼å ¥å½±å.
å¨å½±åè¼å ¥å®æåå¼å« drawImage()䏿æä»»ä½ææï¼çè³æäºç覽å¨éææåºä¾å¤çæ³ï¼æä»¥æè©²è¦ééå©ç¨è¼å ¥äºä»¶ä¾é¿å éé¡åé¡:
var img = new Image(); // Create new img element
img.addEventListener(
"load",
function () {
// execute drawImage statements here
},
false,
);
img.src = "myImage.png"; // Set source path
è¥æ¯åªè¦è¼å ¥ä¸ä»½å½±åï¼å¯ä»¥ç¨ä¸é¢çæ¹æ³ï¼ä¸éç¶éè¦è¼å ¥ã追蹤å¤åå½±åæï¼æåå°±éè¦æ´å¥½çæ¹æ³äºï¼éç¶ç®¡çå¤åå½±åè¼å ¥å·²ç¶è¶ åºæ¬æå¸çç¯çï¼ç¶è妿æèè¶£ç話ï¼å¯ä»¥åèJavaScript Image Preloaderé份æä»¶ã
以 data:URL åµå ¥å½±åå¦ä¸åè¼å ¥å½±åçæ¹æ³æ¯å©ç¨ data: urlï¼éé data URL å¯ä»¥ç´æ¥å°å½±åå®ç¾©æ Base64 編碼çå串ï¼ç¶å¾åµå ¥ç¨å¼ç¢¼ä¹ä¸.
var img_src =
"data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw==";
data URL ç好èä¹ä¸æ¯ç«å³ç¢çå½±åèä¸ç¨åå伺æå¨é£ç·ï¼å¦ä¸åå¥½èæ¯éæ¨£ä¾¿è½å¤ å°å½±åå å ¥ä½ çCSS, JavaScript, HTMLä¹ä¸ï¼è®å½±åæ´å ·å¯ææ§.
å£è忝影åå°ä¸æè¢«å¿«åèµ·ä¾ï¼èä¸å°å¤§å½±åä¾èªªç·¨ç¢¼å¾ç URL æå¾é·.
Using frames from a videoæåéè½å¤ 使ç¨<video>
å
ç´ ä¸çå½±ççå½±çç«æ ¼(縱使影ççºé±è)ï¼ä¾å¦ï¼ç¾å¨æåæä¸å ID çºãmyvideoã ç<video>
å
ç´ :
function getMyVideo() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
return document.getElementById("myvideo");
}
}
ä¸é¢çæ¹æ³æåå³ä¸åHTMLVideoElement
çå½±åç©ä»¶ï¼å¦åæè¿°ï¼éåç©ä»¶å¯ä»¥è¢«è¦çº CanvasImageSource é¡å¥çç©ä»¶ä¾ä½¿ç¨ã éæ¼å¦ä½å©ç¨<video>å
ç´ æ¼ç«å¸ä¸çé²é說æï¼å¯ä»¥åè html5Doctor çãvideo + canvas = magicã䏿.
䏿¦æååå¾ä¾æºå½±åç©ä»¶çåç §(reference)ï¼ä¾¿å¯ä»¥ç¨ drawImage()æ¹æ³å°å½±å渲æå°ç«å¸ä¸ï¼drawImage()æ¹æ³æ¯ä¸åå¤è¼(overload)æ¹æ³ï¼ææ¸ååæ ï¼å¾ ææåæçå°éé ç¹æ§ï¼ç¾å¨æåå ä¾ç drawImage()æåºæ¬çåæ :
drawImage(image, x, y)
å¾åº§æ¨é»(x, y)éå§ç«ä¸ image 忏æå®ç便ºå½±å(CanvasImageSource).
éåç¯ä¾æä½¿ç¨å¤é¨å½±åä½çºä¸åå°åç·åçèæ¯ãå©ç¨é å å好çåä½çºèæ¯ç話就ä¸ç¨åé ç¨å¼ä¾ç¢çèæ¯ï¼å¦æ¤ä¸ä¾å¯ä»¥é¡¯èå°æ¸å°ç¨å¼ç¢¼ãä¸é¢èç±å½±åç©ä»¶ç load äºä»¶èçå¨ä¾èç繪å使¥ï¼å ¶ä¸ drawImage()æ¹æ³æèæ¯åçæ¾ç½®å¨ç«å¸å·¦ä¸è§ï¼åº§æ¨é»(0, 0)ä½ç½®.
<html lang="zh">
<body>
<canvas id="canvas" width="180" height="150"></canvas>
</body>
</html>
function draw() {
const ctx = document.getElementById("canvas").getContext("2d");
const img = new Image();
img.onload = () => {
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()ç第äºååæ å¢å äºå ©åæ°åæ¸ï¼è®æåå¨ç«å¸ä¸æ¾ç½®å½±åçåæä¸¦ç¸®æ¾å½±å.
drawImage(image, x, y, width, height)
ç¶æ¾ç½®å½±åæ¼ç«å¸ä¸æï¼ææç §åæ¸ width(寬)ãheight(é«)ä¾ç¸®æ¾å½±å.
æ¬ä¾æåæåä¸å¼µå½±åä½çºæ¡å¸ï¼ç¶å¾ééç°¡å®çè¿´åä¾éè¤ç¸®æ¾ãè²¼ä¸å½±åæ¼ç«å¸ä¸ãå¨ç¨å¼ç¢¼ä¸ï¼ç¬¬ä¸åè¿´åèµ°ä¸éæ¯ä¸åï¼ç¬¬äºåè¿´åèµ°ä¸éæ¯ä¸è¡ï¼å½±ååç¸®å°æåå§å½±åçä¸åä¹ä¸ï¼50 x 38 åç´ .
åè¨»ï¼ é度縮æ¾å½±åå¯è½æé æå½±åæ¨¡ç³æç¢çé¡ç²æï¼æä»¥å¦æå½±å䏿æåéè¦é±è®ï¼æå¥½ä¸è¦ç¸®æ¾å½±å.
<html lang="zh">
<body>
<canvas id="canvas" width="150" height="150"></canvas>
</body>
</html>
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()第ä¸ååæ æ¥å 9 å忏ï¼å ¶ä¸ 8 åè®æåå¾åå§å½±åä¸ååºä¸é¨åå½±åã縮æ¾ä¸¦ç«å°ç«å¸ä¸.
drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
image 忏æ¯ä¾æºå½±åç©ä»¶ï¼(sx, sy)代表å¨ä¾æºå½±åä¸ä»¥(sx, sy)座æ¨é»ä½çºåå²çèµ·å§é»ï¼sWidth å sHeight 代表åå²å¯¬åé«ï¼(dx, dy)代表æ¾å°ç«å¸ä¸ç座æ¨é»ï¼dWidth å dHeight 代表縮æ¾å½±åè³æå®ç寬åé«.
è«åç §å³åï¼ååå忏å®ç¾©äºå¨ä¾æºå½±åä¸åå²çèµ·å§é»ååå²å¤§å°ï¼å¾åå忏å®ç¾©äºç«å°ç«å¸ä¸çä½ç½®åå½±å大å°.
å岿¯ä¸å徿ç¨çå·¥å ·ï¼æåå¯ä»¥æææå½±åæ¾å°ä¸å¼µå½±åä¸ï¼ç¶å¾å©ç¨åå²ä¾çµææçµå®æ´çå½±åï¼æ¯å¦èªªï¼æåå¯ä»¥æææéè¦ç¨ä¾çµæä¸å¼µå表çæåæ¾å°ä¸å¼µ PNG åæªå §ï¼ä¹å¾åªéè¦å®ç´å°åä¾æè³æä¾ç¸®æ¾å表ï¼å¦å¤ï¼æåä¹ä¸ç¨å¤æ¬¡è¼å ¥å¤å¼µå½±åï¼éæ¨£å°æåè¼å ¥å½±åæè½é æå¹«å©.
ç¯ä¾: ç«ä¸åæç«æ¡ç影忬ä¾ç¨ååä¸åç¯ä¾ä¸æ¨£çççåï¼ç¶å¾ååºççé é¨å½±åé¨ååæ¾å ¥ä¸åå½±åç«æ¡ï¼éåå½±åç«æ¡æ¯ä¸åæé°å½±ç 24 ä½å PNG åæªï¼å çº 24 ä½å PNG å½±åå ·å宿´ç 8 ä½å ä¸éæè²ç(alpha channel)ï¼æä»¥ä¸å GIF å½±åå 8 ä½å PNG å½±åï¼å®è½å¤ æ¾ä»»ä½èæ¯ä¹ä¸èç¡é æå¿ç¢çæ¶å è²(matte color).
<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();
鿬¡æåä¸ç¢çæ°çHTMLImageElement
ç©ä»¶ï¼æ¹æ¡ç¨ç´æ¥æå½±åå
å
¥ HTML ç<img>
æ¨ç±¤ï¼ç¶å¾ååå¾å½±åå
ç´ ï¼å
¶ä¸ HTML ä¸çå½±åå·²ç¶ééè¨å® CSS 屬æ§display
çº none ä¾é±èèµ·ä¾äº.
ç¨å¼ç¢¼ç¸ç¶ç°¡å®ï¼æ¯å<img>
æèªå·±ç ID 屬æ§ï¼é樣便å¯ä»¥å©ç¨document.getElementById()
è¼æåå¾ï¼ä¹å¾åç°¡å®å°ç¨ drawImage()æ¹æ³åå²ççå½±åç¶å¾ç¸®æ¾ä¸¦æ¾å°ç«å¸ä¸ï¼æå¾ç¬¬äºå drawImage()åæç«æ¡æ¾å°ä¸é¢.
卿¬ç« çæå¾ä¸åç¯ä¾ï¼æåå°å»ºé ä¸åå°ç«å»ãç¶ç¶²é è¼å
¥å®ææï¼æåæçºæ¯ä¸å¼µå½±åç¢çä¸å<canvas>
å
ç´ ï¼ä¸¦ä¸å ä¸ç«æ¡.
æ¬ç¯ä¾ä¸ï¼æ¯ä¸å¼µå½±åç坬髿¯åºå®çï¼ç«æ¡ä¹æ¯ä¸æ¨£ï¼ä½ å¯ä»¥å試ççæ¹é²ç¨å¼ç¢¼ï¼ä¾æå½±åç寬é«ä¾è¨å®ç«æ¡ï¼ä½¿ç«æ¡è½åå好æ¡ä½å½±å.
å¾ä¸æ¹çç¨å¼ç¢¼ç¯ä¾å¯ä»¥å¾æ¸
æ¥çå°ï¼æåçºdocument.images
容å¨å
§çå½±åï¼ä¸å¼µä¸å¼µå°æ°å»ºç«å¸ï¼å
¶ä¸ï¼å°æ¼ä¸çææä»¶ç©ä»¶æ¨¡å (DOM)ç人ä¾èªªï¼å¤§æ
¨æ¯è¼å¼å¾æ³¨æä¹è卿¼ä½¿ç¨å°Node.insertBefore
æ¹æ³ï¼insertBefore()æ¯å½±åå
ç´ çç¶ç¯é»(亦å³<td>å
ç´ )çä¸åæ¹æ³ï¼éåæ¹æ³æææ°ç«å¸å
ç´ æå
¥æ¼å½±åå
ç´ ä¹å.
<html lang="zh">
<body>
<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>
éäºæ¯ä¸äºè¨å®æ¨£å¼ç CSS:
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() {
// 循ç°éæ·ææå½±å
for (const image of document.images) {
// ä¸è¦çºç«æ¡ååæ·»å ç«å¸
if (image.getAttribute("id") !== "frame") {
// 建ç«ç«å¸å
ç´
const canvas = document.createElement("canvas");
canvas.setAttribute("width", 132);
canvas.setAttribute("height", 150);
// å¨å½±ååæå
¥
image.parentNode.insertBefore(canvas, image);
ctx = canvas.getContext("2d");
// å°å½±å繪製å°ç«å¸ä¸
ctx.drawImage(image, 15, 20);
// æ·»å ç«æ¡
ctx.drawImage(document.getElementById("frame"), 0, 0);
}
}
}
draw();
æ§å¶å½±å縮æ¾è¡çº
å¦åæè¿°ï¼ç¸®æ¾å½±åæå°è´å½±å模ç³åææ¯é¡ç²åï¼ä½ å¯ä»¥å試éé繪åç°å¢ç imageSmoothingEnabled 屬æ§ä¾æ§å¶å½±åå¹³æ»æ¼ç®æ³ç使ç¨ï¼é è¨ä¸éå屬æ§çå¼çº trueï¼ä¹å°±æ¯èªªç¶ç¸®æ¾æï¼å½±åæç¶éå¹³æ»èçã妿è¦éæéååè½ï¼ä½ å¯ä»¥é麼å:
ctx.mozImageSmoothingEnabled = false;
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4