HTMLì ì´ë¯¸ì§ ì²ë¦¬ë¥¼ ìí´ CORS header를 í¬í¨íê³ ìë crossorigin
ìì±ì ì ê³µí©ëë¤. ì´ë <img>
ìììì ì ìë, ì¸ë¶ originì¼ë¡ ë¶í° ê°ì ¸ì¤ë ì´ë¯¸ì§ê° <canvas>
ìì ì¬ì©í ì ìëë¡ í´ì¤ëë¤. ë§ì¹ íì¬ originìì ê°ì ¸ì¨ ê²ì²ë¼ ë§ì
ëë¤
crossorigin
ìì±ì´ ì´ë»ê² ì¬ì©ëëì§ ìì¸í ìê³ ì¶ë¤ë©´, CORS settings attributes 를 ì°¸ê³ íì¸ì.
ë¤ë¥¸ í¸ì¤í¸ë¤ì ìë ì´ë¯¸ì§ë ë¹ëì¤ë¥¼ í¬í¨í canvas ë¹í¸ë§µì í½ì ë¤ì ë¤ìí ì¶ì²ë¡ ë¶í° ê°ì ¸ì¤ê¸° ë문ì, ë³´ìê³¼ ê´ë ¨ë 문ì 를 í¼í ì ììµëë¤.
CORS를 íµíì§ ìê³ , ë¤ë¥¸ originì¼ë¡ ë¶í° ê°ì ¸ì¨ ë°ì´í°ë¤ì canvasì ê·¸ë ¤ì§ë ì¦ì canvasë ì¤ì¼ë©ëë¤. ì¤ì¼ë canvasë ë ì´ì ìì íì§ ìì ê²ì¼ë¡ ì¬ê²¨ì§ê³ , canvas ì´ë¯¸ì§ìì ë°ì´í°ë¥¼ ê°ì ¸ì¤ë ¤ë ì´ë¤ ìëë exceptionì´ ë°ìí©ëë¤.
ë§ì½ ì¸ë¶ ì¶ì² ì½í
ì¸ ê° HTML <img>
ëë SVG <svg>
ììë¼ë©´, canvasì ì½í
ì¸ ë¥¼ ê°ì ¸ì¤ë ¤ë ìëë íì©ëì§ ììµëë¤.
ë§ì½ ì¸ë¶ ì¶ì² ì½í
ì¸ ê° HTMLCanvasElement
ëë ImageBitMap
ë¡ë¶í° ì¤ë ì´ë¯¸ì§ì´ê³ , ì´ë¯¸ì§ì sourceê° ëì¼ ì¶ì² ìì¹ê³¼ ë§ì§ ìëë¤ë©´ canvasì ì½í
ì¸ ë¥¼ ì½ì¼ë ¤ë ìëë ë§íëë¤.
ì¤ì¼ë ìºë²ì¤ìì ë¤ì ì¤ íë를 í¸ì¶íë©´ ì¤ë¥ê° ë°ìí©ëë¤:
getImageData()
를 í¸ì¶<canvas>
ìì ìì²´ìì toBlob()
, toDataURL()
ëë captureStream()
를 í¸ì¶canvasê° ì¤ì¼ë ìíìì ì´ë¬í ìì
ì ìëí´ë³´ë©´ SecurityError
ê° ë°ìí©ëë¤. ì´ë ê² íë©´ ì¬ì©ìê° ì´ë¯¸ì§ë¥¼ ì¬ì©íì¬ ì격 ì¹ ì¬ì´í¸ìì 무ë¨ì¼ë¡ ì 보를 ê°ì ¸ì ê°ì¸ ë°ì´í°ê° ë
¸ì¶ëë ê²ì ë°©ì§í ì ììµëë¤.
ì´ ìì ë ì¸ë¶ ì¶ì²ì ì´ë¯¸ì§ë¥¼ ê²ìíì¬ ë¡ì»¬ ì¤í 리ì§ì ì ì¥í ì ìëë¡ íì©íê³ ì í©ëë¤. ì´ë¥¼ 구ííë ¤ë©´ ìë²ë¥¼ 구ì±íê³ ì¹ì¬ì´í¸ ìì²´ì ëí ì½ë를 ìì±í´ì¼ í©ëë¤.
ì¹ ìë² êµ¬ì±ê°ì¥ 먼ì íìíê²ì êµì°¨ ì¶ì² ì ê·¼ì íì©íëë¡ Access-Control-Allow-Origin
í¤ëê° ìë ì´ë¯¸ì§ íì¼ì í¸ì¤í
íëë¡ êµ¬ì±ë ìë²ì
ëë¤.
Apache를 ì¬ì©íì¬ ì¬ì´í¸ë¥¼ ìë¹ì¤íë¤ê³ ê°ì í´ë³´ê² ìµëë¤. ìëìê°ì´ HTML5 ë³´ì¼ë¬íë ì´í¸ CORS ì´ë¯¸ì§ì ëí Apache ìë² êµ¬ì± íì¼ì ì´í´ë´ ìë¤.
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
<FilesMatch "\.(bmp|cur|gif|ico|jpe?g|png|svgz?|webp)$">
SetEnvIf Origin ":" IS_CORS
Header set Access-Control-Allow-Origin "*" env=IS_CORS
</FilesMatch>
</IfModule>
</IfModule>
ê°ë¨í ë§í´ ì´ ì¤ì ì ì¸í°ë· ì´ëììë ê·¸ëí½ íì¼(".bmp", ".cur", ".gif", ".ico", ".jpg", ".jpeg", ".png", ".svg", ".svgz" ë° ".webp" íì¥ì를 ê°ì§)ì êµì°¨ ì¶ì²ë¡ ì ê·¼í ì ìëë¡ ìë²ë¥¼ 구ì±í©ëë¤.
ì ì¥ ê¸°ë¥ êµ¬íí기ì´ì ìë²ê° ì´ë¯¸ì§ êµì°¨ ì¶ì² ê²ìì íì©íëë¡ êµ¬ì±ëìì¼ë¯ë¡ ì½ëê° ì¤íì¤ì¸ ëì¼í ëë©ì¸ìì ì´ë¯¸ì§ë¥¼ ì ê³µíë ê²ì²ë¼ ì¬ì©ìê° ì´ë¯¸ì§ë¥¼ ë¡ì»¬ ì¤í 리ì§ì ì ì¥í ì ìëë¡ íë ì½ë를 ìì±í ì ììµëë¤.
íµì¬ì ë¡ëë HTMLImageElement
ì crossOrigin
ì ì¤ì íì¬ crossorigin
ìì±ì ì¬ì©íë ê²ì
ëë¤. ì´ë ê² íë©´ ì´ë¯¸ì§ ë°ì´í°ë¥¼ ë¤ì´ë¡ë íë ¤ê³ í ë ë¸ë¼ì°ì ê° êµì°¨ ì¶ì² ì ê·¼ì ìì²íëë¡ ì§ìí©ëë¤.
ë¤ì´ë¡ë를 ììíë ì½ë (ì: ì¬ì©ìê° "Download" ë²í¼ì í´ë¦í ë ì¤íí ì½ë)ë ë¤ìê³¼ ê°ìµëë¤.
function startDownload() {
let imageURL =
"https://cdn.glitch.com/4c9ebeb9-8b9a-4adc-ad0a-238d9ae00bb5%2Fmdn_logo-only_color.svg?1535749917189";
downloadedImg = new Image();
downloadedImg.crossOrigin = "Anonymous";
downloadedImg.addEventListener("load", imageReceived, false);
downloadedImg.src = imageURL;
}
ì¬ê¸°ìë íëì½ë©ë URL(imageURL
)ì ì¬ì©íê³ ìì§ë§ ì´ëììë ì½ê² ì°¾ì ì ììµëë¤. ë¤ì´ë¡ë를 ììíë ¤ë©´ Image()
ìì±ì를 ì¬ì©íì¬ ìë¡ì´ HTMLImageElement
ê°ì²´ë¥¼ ìì±í©ëë¤. ê·¸ë°ë¤ì crossOrigin
ìì±ì "Anonymous"
ì¼ë¡ ì¤ì íì¬ êµì°¨ ì¶ì² ë¤ì´ë¡ë를 íì©íëë¡ ì´ë¯¸ì§ë¥¼ 구ì±í©ëë¤. (ì´ë¯¸ì§ êµì°¨ ì¶ì²ì ì¸ì¦ì´ ëì§ ìì ë¤ì´ë¡ë를 íì©). ì´ë¯¸ì§ ìììì ë°ìíë load
ì´ë²¤í¸ì ëí ì´ë²¤í¸ ìì ê¸°ê° ì¶ê°ëë©° ì´ë ì´ë¯¸ì§ ë°ì´í°ê° ìì ëììì ì미 í©ëë¤.
ë§ì§ë§ì¼ë¡ ì´ë¯¸ì§ì src
ìì±ì ë¤ì´ë¡ëí ì´ë¯¸ì§ì URLë¡ ì¤ì íë©´ ë¤ì´ë¡ëê° ììë©ëë¤.
ìë¡ ë¤ì´ë¡ëí ì´ë¯¸ì§ë¥¼ ì²ë¦¬íë ì½ëë imageReceived()
ë©ìëìì ì°¾ì ì ììµëë¤.
function imageReceived() {
let canvas = document.createElement("canvas");
let context = canvas.getContext("2d");
canvas.width = downloadedImg.width;
canvas.height = downloadedImg.height;
context.drawImage(downloadedImg, 0, 0);
imageBox.appendChild(canvas);
try {
localStorage.setItem("saved-image-example", canvas.toDataURL("image/png"));
} catch (err) {
console.log("Error: " + err);
}
}
imageReceived()
ê° í¸ì¶ëì´ ë¤ì´ë¡ëí ì´ë¯¸ì§ë¥¼ ìì íë HTMLImageElement
ì "load"
ì´ë²¤í¸ë¥¼ ì²ë¦¬í©ëë¤. ì´ ì´ë²¤í¸ë ë¤ì´ë¡ëí ë°ì´í°ë¥¼ 모ë ì¬ì©í ì ìê² ëë©´ í¸ë¦¬ê±° ë©ëë¤. ì´ë¯¸ì§ë¥¼ ë°ì´í° URLë¡ ë³ííë ë° ì¬ì©í ì <canvas>
ìì를 ìì±íê³ ë³ì context
ìì ìºë²ì¤ì 2D ëë¡ì 컨í
ì¤í¸(CanvasRenderingContext2D
)ì ì ê·¼íë ê²ì¼ë¡ ììë©ëë¤.
ìºë²ì¤ í¬ê¸°ê° ìì ë ì´ë¤ì§ì ì¼ì¹íëë¡ ì¡°ì ë ë¤ì drawImage()
를 ì¬ì©íì¬ ì´ë¯¸ì§ë¥¼ ìºë²ì¤ì 그립ëë¤. ê·¸ë° ë¤ì ìºë²ì¤ê° 문ìì ì½ì
ëì´ ì´ë¯¸ì§ê° íìë©ëë¤.
ì´ì ì´ë¯¸ì§ë¥¼ ì¤ì ë¡ ë¡ì»¬ì ì ì¥í ì°¨ë¡ì
ëë¤. ì´ë¥¼ ìí´ localStorage
ì ì ê°ì²´ì íµí´ ì¡ì¸ì¤ëë ì¹ ì¤í ë¦¬ì§ APIì ë¡ì»¬ ì¤í ë¦¬ì§ ë§¤ì»¤ëì¦ì ì¬ì©í©ëë¤. ìºë²ì¤ ë©ìë toDataURL()
ì ì¬ì©íì¬ ì´ë¯¸ì§ë¥¼ PNG ì´ë¯¸ì§ë¥¼ ëíë´ë data:// URL ë¡ ë³íí ë¤ì setItem()
ì ì¬ì©íì¬ ë¡ì»¬ ì¤í 리ì§ì ì ì¥í©ëë¤.
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