ããã¾ã§ããã£ã³ãã¹ã®å®éã®ãã¯ã»ã«ã¯è¦ã¦ãã¾ããã§ããã ImageData
ãªãã¸ã§ã¯ãã使ç¨ãã¦ããã¯ã»ã«ãã¼ã¿ãæä½ããããã«ãã¼ã¿é
åã¸ç´æ¥èªã¿åããæ¸ãè¾¼ã¿ãè¡ããã¨ãå¯è½ã§ããã¾ããç»åã®ã¹ã ã¼ã¸ã³ã°ï¼ã¢ã³ãã¨ã¤ãªã¢ã·ã³ã°ï¼ã®å¶å¾¡æ¹æ³ããã£ã³ãã¹ã®ç»åãä¿åããæ¹æ³ãè¦ã¦ããã¾ãã
ImageData
ãªãã¸ã§ã¯ãã¯ããã£ã³ãã¹ãªãã¸ã§ã¯ãã®é åã«ãããã¯ã»ã«ãã¼ã¿ã表ãã¾ããããã«ã¯ä»¥ä¸ã®èªã¿åãå°ç¨ããããã£ãããã¾ãã
width
ç»åã®å¹ ããã¯ã»ã«æ°ã§è¡¨ãã¾ãã
height
ç»åã®é«ãããã¯ã»ã«æ°ã§è¡¨ãã¾ãã
data
0
ãã 255
ã®éã® (両端ã®å¤ãå«ã) æ´æ°ãã¼ã¿ã RGBA ã®é ã§åãã䏿¬¡å
é
åã表ã Uint8ClampedArray
ã§ãã
data
ããããã£ã¯ãçã®ãã¯ã»ã«ãã¼ã¿ãåç
§ããããã«ã¢ã¯ã»ã¹å¯è½ãª Uint8ClampedArray
ãè¿ãã¾ããããããã®ãã¯ã»ã«ã¯ 4 ã¤ã® 1 ãã¤ãå¤ï¼èµ¤ãç·ãéãã¢ã«ãã¡ã®é ãããªãã¡ "RGBA" å½¢å¼ï¼ã§è¡¨ããã¾ããã¾ããããããã®è²æå㯠0 ãã 255 ã®éã®æ´æ°ã§è¡¨ãã¾ããããã«ãããããã®æåã¯é
åå
ã§é£ç¶ããæ·»åãå²ãå½ã¦ããã¦ãããå·¦ä¸ã®ãã¯ã»ã«ã®èµ¤è²æåãé
åã®æ·»å 0 ã«ãªãã¾ããé
åã®ä¸ã§ãã¯ã»ã«ã¯å·¦ããå³ã¸é²ã¿ãããã«ä¸ã¸ã¨é²ãã§ããã¾ãã
Uint8ClampedArray
㯠height
à width
à 4 ãã¤ãã®ãã¼ã¿ããããæ·»åã®ç¯å²ã¯ 0 ãã (height
Ãwidth
Ã4)-1 ã«ãªãã¾ãã
ä¾ãã°ç»åã® 50 è¡ç®ã® 200 åç®ã«ãããã¯ã»ã«ããéè²æåã®å¤ãèªã¿åãã«ã¯ã以ä¸ã®ããã«ãã¾ãã
const blueComponent = imageData.data[50 * (imageData.width * 4) + 200 * 4 + 2];
æå®ãããåº§æ¨ (X 㨠Y) ãè¨å®ããã¨ã次ã®ããã«ãªãã¾ãã
const xCoord = 50;
const yCoord = 100;
const canvasWidth = 1024;
const getColorIndicesForCoord = (x, y, width) => {
const red = y * (width * 4) + x * 4;
return [red, red + 1, red + 2, red + 3];
};
const colorIndices = getColorIndicesForCoord(xCoord, yCoord, canvasWidth);
const [redIndex, greenIndex, blueIndex, alphaIndex] = colorIndices;
Uint8ClampedArray.length
屿§ãèªã¿åãã¨ããã¯ã»ã«é
åã®ãµã¤ãºããã¤ãæ°ã§ç¥ããã¨ãã§ãã¾ãã
const numBytes = imageData.data.length;
ImageData ãªãã¸ã§ã¯ãã®ä½æ
æ°ãã«ç©ºã® ImageData
ãªãã¸ã§ã¯ãã使ããã«ã¯ãcreateImageData()
ã¡ã½ããã使ç¨ãã¾ããcreateImageData()
ã¡ã½ãã㯠2 種é¡ã®å½¢å¼ãããã¾ãã
const myImageData = ctx.createImageData(width, height);
ããã¯ãç¹å®ã®å¯¸æ³ã®æ°ã㪠ImageData
ãªãã¸ã§ã¯ãã使ãã¾ãããã¹ã¦ã®ãã¯ã»ã«ã¯éæãªé»è²ï¼ãã¹ã¦ãã¼ããããªãã¡ rgb(0 0 0 / 0%)ï¼ã«è¨å®ããã¾ãã
æ°ã㪠ImageData
ãªãã¸ã§ã¯ããããanotherImageData
ã§æå®ãããªãã¸ã§ã¯ãã¨åã寸æ³ã§ä½æãããã¨ãã§ãã¾ããæ°ãããªãã¸ã§ã¯ãã®ãã¯ã»ã«ã¯ããã¹ã¦éæãªé»è²ã«è¨å®ããã¾ããç»åãã¼ã¿ã¯ã³ãã¼ããã¾ãã!
const myImageData = ctx.createImageData(anotherImageData);
ã³ã³ããã¹ãã®ãã¯ã»ã«ãã¼ã¿ã®åå¾
ãã£ã³ãã¹ã®ã³ã³ããã¹ãã®ãã¯ã»ã«ãã¼ã¿ã®è¤è£½ãæã¤ ImageData
ãªãã¸ã§ã¯ããåå¾ããã«ã¯ãgetImageData()
ã¡ã½ããã使ç¨ãã¾ãã
const myImageData = ctx.getImageData(left, top, width, height);
ãã®ã¡ã½ãã㯠(left
,top
)ã(left+width
, top
)ã(left
, top+height
)ã(left+width
, top+height
) ã®ç¹ã§åé
ã表ãããã£ã³ãã¹ã®é åã®ãã¯ã»ã«ãã¼ã¿ã表ã ImageData
ãªãã¸ã§ã¯ããè¿ãã¾ããç¹ã®åº§æ¨ã¯ããã£ã³ãã¹ã®åº§æ¨ç©ºéã®åä½ã§æå®ãã¾ãã
ã¡ã¢: è¿ããã ImageData
ãªãã¸ã§ã¯ãã§ããã£ã³ãã¹ã®å¤é¨ã«ãããã¯ã»ã«ã¯ãã¹ã¦éæãªé»è²ã«ãªãã¾ãã
ãã®ã¡ã½ããã¯ããã£ã³ãã¹ã使ç¨ããåç»ã®æä½ã®è¨äºã§ã説æãã¦ãã¾ãã
ã«ã©ã¼ããã«ã¼ãã®ä¾ã§ã¯ããã¦ã¹ã«ã¼ã½ã«ã®ä¸ã«ããè²ã表示ããããã« getImageData()
ã¡ã½ããã使ç¨ãã¦ãã¾ããããã§ã¯ç¾å¨ã®ãã¦ã¹ã«ã¼ã½ã«ã®ä½ç½®ãæ±ãã¦ãgetImageData()
ãæä¾ãããã¯ã»ã«é
åã§è©²å½ä½ç½®ã®ãã¯ã»ã«ãã¼ã¿ãæ¢ãã¾ããæå¾ã«ãè²ã表示ããããã® <div>
ã§èæ¯è²ã¨ããã¹ããè¨å®ããããã«ãé
åãã¼ã¿ã使ç¨ãã¾ãã
const img = new Image();
img.crossOrigin = "anonymous";
img.src = "./assets/rhino.jpg";
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
img.addEventListener("load", () => {
ctx.drawImage(img, 0, 0);
img.style.display = "none";
});
const hoveredColor = document.getElementById("hovered-color");
const selectedColor = document.getElementById("selected-color");
function pick(event, destination) {
const bounding = canvas.getBoundingClientRect();
const x = event.clientX - bounding.left;
const y = event.clientY - bounding.top;
const pixel = ctx.getImageData(x, y, 1, 1);
const data = pixel.data;
const rgbColor = `rgb(${data[0]} ${data[1]} ${data[2]} / ${data[3] / 255})`;
destination.style.background = rgbColor;
destination.textContent = rgbColor;
return rgbColor;
}
canvas.addEventListener("mousemove", (event) => pick(event, hoveredColor));
canvas.addEventListener("click", (event) => pick(event, selectedColor));
ãã®ã³ã¼ãã®ä½¿ãæ¹ã¯ã次ã®ã©ã¤ãä¾ã§ç´¹ä»ãã¾ãã
ã½ã¼ã¹ã³ã¼ããã覧ãã ããã HTML, JavaScript ã§ãã
ã³ã³ããã¹ãã¸ã®ãã¯ã»ã«ãã¼ã¿ã®æç»putImageData() ã¡ã½ããã使ç¨ãã¦ãã³ã³ããã¹ãã«ãã¯ã»ã«ãã¼ã¿ãæããã¨ãã§ãã¾ãã
ctx.putImageData(myImageData, dx, dy);
弿° dx
㨠dy
ã¯ãæç»ããããã¯ã»ã«ãã¼ã¿ã®å·¦ä¸ã®é
ãæãä½ç½®ããã³ã³ããã¹ãã®ããã¤ã¹åº§æ¨ã§ç¤ºãã¾ãã
ä¾ãã° myImageData
ã表ãç»åå
¨ä½ãã³ã³ããã¹ãã®å·¦ä¸ã®é
ããæãã«ã¯ãåç´ã«ä»¥ä¸ã®ããã«ãã¾ãã
ctx.putImageData(myImageData, 0, 0);
è²ã®ã°ã¬ã¼ã¹ã±ã¼ã«åã¨å転
ãã®ä¾ã§ã¯ããã¹ã¦ã®ãã¯ã»ã«ã«å¯¾ãã¦ç¹°ãè¿ãå¦çãè¡ããå¤ã夿´ãããã¯ã»ã«é
åã putImageData()
ã使ã£ã¦ãã£ã³ãã¹ã«æ»ãã¦ãã¾ããå転æ©è½ã¯ãæå¤§å¤ 255 ããåè²ãæ¸ç®ãã¾ããã°ã¬ã¼ã¹ã±ã¼ã«é¢æ°ã¯ã赤ãç·ãéã®å¹³åå¤ã使ç¨ãã¾ããã¾ããä¾ãã° x = 0.299r + 0.587g + 0.114b
ã¨ããå¼ã§ä¸ããããå éå¹³åã使ç¨ãããã¨ãã§ãã¾ãã詳ãã㯠Wikipedia ã®ã°ã¬ã¼ã¹ã±ã¼ã«ãã覧ãã ããã
const img = new Image();
img.crossOrigin = "anonymous";
img.src = "./assets/rhino.jpg";
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
img.onload = () => {
ctx.drawImage(img, 0, 0);
};
const original = () => {
ctx.drawImage(img, 0, 0);
};
const invert = () => {
ctx.drawImage(img, 0, 0);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const data = imageData.data;
for (let i = 0; i < data.length; i += 4) {
data[i] = 255 - data[i]; // red
data[i + 1] = 255 - data[i + 1]; // green
data[i + 2] = 255 - data[i + 2]; // blue
}
ctx.putImageData(imageData, 0, 0);
};
const grayscale = () => {
ctx.drawImage(img, 0, 0);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const data = imageData.data;
for (let i = 0; i < data.length; i += 4) {
const avg = (data[i] + data[i + 1] + data[i + 2]) / 3;
data[i] = avg; // red
data[i + 1] = avg; // green
data[i + 2] = avg; // blue
}
ctx.putImageData(imageData, 0, 0);
};
const inputs = document.querySelectorAll("[name=color]");
for (const input of inputs) {
input.addEventListener("change", (evt) => {
switch (evt.target.value) {
case "inverted":
return invert();
case "grayscale":
return grayscale();
default:
return original();
}
});
}
ãã®ã³ã¼ãã®ä½¿ãæ¹ã¯ã次ã®ã©ã¤ãä¾ã§ç´¹ä»ãã¾ãã
ã½ã¼ã¹ã³ã¼ããå©ç¨ã§ãã¾ãã â HTML, JavaScript
ãºã¼ã ã¨ã¢ã³ãã¨ã¤ãªã¢ã¹drawImage()
ã¡ã½ããã第 2 ã® canvasãimageSmoothingEnabled
ããããã£ã®åãåãã¦ãç»åããºã¼ã ã¢ãããã¦è©³ããè¦ããã¨ãã§ãã¾ããã¾ããimageSmoothingEnabled
ã®ãªã 3 çªç®ã®ãã£ã³ãã¹ãæç»ããå·¦å³ã«ä¸¦ã¹ã¦æ¯è¼ã§ããããã«ãã¾ãã
ãã¦ã¹ã«ã¼ã½ã«ã®ä½ç½®ãåå¾ãã¦ãããããä¸ä¸å·¦å³ã« 5 ãã¯ã»ã«ã®ç¯å²ã®ç»åãåãåãã¾ããããã¦åãåã£ãç»åãå¥ã®ãã£ã³ãã¹ã«ã³ãã¼ãã¦ãæããµã¤ãºã«ãªãµã¤ãºãã¾ãããºã¼ã ç¨ã®ãã£ã³ãã¹ã§ã¯ãå ã®ãã£ã³ãã¹ããåãåã£ã 10Ã10 ãã¯ã»ã«ã®ç»åã 200Ã200 ãã¯ã»ã«ã«ãªãµã¤ãºãã¦ãã¾ãã
zoomctx.drawImage(
canvas,
Math.min(Math.max(0, x - 5), img.width - 10),
Math.min(Math.max(0, y - 5), img.height - 10),
10,
10,
0,
0,
200,
200,
);
ãºã¼ã ã®ä¾ã§ãã
const img = new Image();
img.crossOrigin = "anonymous";
img.src = "./assets/rhino.jpg";
img.onload = () => {
draw(this);
};
function draw(img) {
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
const smoothedZoomCtx = document
.getElementById("smoothed-zoom")
.getContext("2d");
smoothedZoomCtx.imageSmoothingEnabled = true;
const pixelatedZoomCtx = document
.getElementById("pixelated-zoom")
.getContext("2d");
pixelatedZoomCtx.imageSmoothingEnabled = false;
const zoom = (ctx, x, y) => {
ctx.drawImage(
canvas,
Math.min(Math.max(0, x - 5), img.width - 10),
Math.min(Math.max(0, y - 5), img.height - 10),
10,
10,
0,
0,
200,
200,
);
};
canvas.addEventListener("mousemove", (event) => {
const x = event.layerX;
const y = event.layerY;
zoom(smoothedZoomCtx, x, y);
zoom(pixelatedZoomCtx, x, y);
});
}
ãã®ã³ã¼ãã®ä½¿ãæ¹ã¯ã次ã®ã©ã¤ãä¾ã§ç´¹ä»ãã¾ãã
ã½ã¼ã¹ã³ã¼ããè¦ããã¨ãã§ãã¾ãã â HTML, JavaScript
ç»åã®ä¿åHTMLCanvasElement
ã¯ãç»åãä¿åããéã«å½¹ã«ç«ã¤ toDataURL()
ã¡ã½ãããæä¾ãã¾ããããã¯ããã¼ã¿ URL ã¨ãã¦å¼æ° type
ã§æå®ããå½¢å¼ï¼æ¢å®å¤ã¯ PNGï¼ã§è¡¨ããç»åãè¿ãã¾ããè¿ãããç»åã®è§£å度㯠96 dpi ã§ãã
ã¡ã¢: CORS ã使ç¨ããã«ä»ã® origin ããåå¾ãããã¯ã»ã«ããã£ã³ãã¹ã«å«ã¾ãã¦ããå ´åããã£ã³ãã¹ã¯æ±æããããã®å 容ãèªã¿åã£ããä¿åãããã§ããªããªããã¨ã«æ³¨æãã¦ãã ããã ã»ãã¥ãªãã£ã¨æ±æããããã£ã³ãã¹ãåç §ãã¦ãã ããã
canvas.toDataURL('image/png')
æ¢å®ã®è¨å®ãPNG ç»åã使ãã¾ãã
canvas.toDataURL('image/jpeg', quality)
JPG ç»åã使ãã¾ãããªãã·ã§ã³ã§ãå質ã 0 ãã 1 ã®ç¯å²ã§æå®ã§ãã¾ãã1 ã¯æé«å質ã0 ã¯ã»ã¨ãã©è¦åããã¤ããªããªãã¾ãããã¡ã¤ã«ãµã¤ãºãå°ããã§ãã¾ãã
ãã£ã³ãã¹ããçæãããã¼ã¿ URL ã¯ãä¾ãã°ä»»æã® <img>
ã®ã½ã¼ã¹ã¨ãã¦ä½¿ç¨ãããããã£ã¹ã¯ã«ä¿åããããã« download 屿§ãæã¤ãã¤ãã¼ãªã³ã¯ã«æå
¥ããããããã¨ãã§ãã¾ãã
ã¾ãããã£ã³ãã¹ãã Blob
ãçæãããã¨ãã§ãã¾ãã
canvas.toBlob(_callback_, _type_, _encoderOptions_)
ãã£ã³ãã¹ã«å«ã¾ããç»åã表ã Blob
ãªãã¸ã§ã¯ãã使ãã¾ãã
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