À̹ÌÁö´Â ¼ö¸¹Àº Çȼ¿·Î ±¸¼ºµÇ¾î ÀÖ´Ù. À̹ÌÁö¸¦ ±¸¼ºÇÏ´Â Çȼ¿ Á¤º¸¸¦
·¡½ºÅÍ(Raster)¶ó°í Çϸç À̹ÌÁö Ç¥¸é¿¡ ¾î¶² ±×¸²ÀÌ ±×·ÁÁ® ÀÖ´ÂÁö¸¦ ÀúÀåÇÑ´Ù. ·¡½ºÅÍ µ¥ÀÌÅ͸¦ Á÷Á¢ Á¶ÀÛÇÏ¸é ±×¸®±â ¸Þ¼µå·Î´Â ºÒ°¡´ÉÇÑ ¼¶¼¼ÇÑ È¿°ú¸¦ ³¾ ¼ö ÀÖ´Ù. ´ÙÀ½ ¸Þ¼µå·Î ĵ¹ö½º¿¡ ±×·ÁÁø À̹ÌÁöÀÇ ·¡½ºÅÍ µ¥ÀÌÅ͸¦ ¾ò´Â´Ù.
getImageData(x, y, w, h)
ÁÂÇ¥¿Í Æø, ³ôÀ̸¦ ÁÖ¸é ÀÌ ¿µ¿ªÀÇ À̹ÌÁö Á¤º¸¸¦ °¡Áö´Â ImageData °´Ã¼°¡ ¸®ÅϵȴÙ. À̹ÌÁö Á¤º¸¸¦ Á¶ÀÛÇÏ·Á¸é ¸®ÅÏ°ªÀ»
¹Ýµå½Ã ´ëÀÔ¹Þ¾Æ¾ß ÇÑ´Ù. ImageData°´Ã¼ÀÇ width,
height ¼Ó¼ºÀº ³Êºñ¿Í ³ôÀÌ°ªÀ» °¡Áö¸ç data´Â ·¡½ºÅÍ Á¤º¸ÀÌ´Ù. ·¡½ºÅÍ Á¤º¸´Â ÇÑ Á¡´ç R,G,B,A ¿ä¼Ò °¢°¢¿¡ ´ëÇØ 4¹ÙÀÌÆ®¾¿ÀÇ °ªÀ» °¡Áö¸ç ÀÌ·± Çȼ¿ Á¤º¸°¡ Á¿¡¼ ¿ì·Î, À§¿¡¼ ¾Æ·¡·Î
³ª¿µÈ´Ù. À̹ÌÁö ÀÚü´Â 2Â÷¿øÀÇ Çȼ¿ ¹è¿ÀÌÁö¸¸ ·¡½ºÅÍ
µ¥ÀÌÅÍ´Â 1Â÷¿øÀÇ Çȼ¿ ¹è¿ÀÌ´Ù.
ÀÌ·¸°Ô 1Â÷¿øÀ¸·Î Çȼ¿À» ³ª¿ÇØ ³õ¾Æµµ ImageData °´Ã¼¿¡ Æø°ú ³ôÀÌ¿¡ ´ëÇÑ Á¤º¸°¡ ÀÖÀ¸¹Ç·Î ¾îµðÂë¿¡¼ ´ÙÀ½ÁÙ·Î °³»ýµÇ´ÂÁö ¾Ë ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ÆøÀÌ 80À̸é 0~79±îÁö´Â 1ÇàÀÌ°í 80 ÀÌÈĺÎÅÍ´Â 2ÇàÀÌ´Ù. ¾îÂ÷ÇÇ ·¡½ºÅÍ µ¥ÀÌÅÍ´Â °ª ÀÚü¸¦ Á÷Á¢ Á¶ÀÛÇϹǷΠÁÂÇ¥°¡ ºñÁ÷°üÀûÀ̾ »ó°ü¾ø´Ù.
·¡½ºÅÍ Á¤º¸´Â ĵ¹ö½ºÀÇ Ãâ·Â¹°¿¡ ´ëÇÑ »çº»À» ¶á °ÍÀ̸ç ÀÌÈÄ È¸é°ú´Â »ó°ü¾øÀÌ µ¶¸³ÀûÀ¸·Î Á¶ÀÛÇÒ ¼ö ÀÖ´Ù. °³º° »ö»ó ¿ä¼ÒÀÇ °ªÀ» ¹Ù²Ù°Å³ª ±³È¯ÇÒ ¼ö ÀÖ°í ÁÖº¯ Çȼ¿°ª±îÁö °í·ÁÇÏ¿© Á¶ÀÛÇϱ⵵ ÇÑ´Ù. ´Ù Á¶Á¤ÇÑ ÈÄ ´ÙÀ½ ¸Þ¼µå·Î ´Ù½Ã ĵ¹ö½º¿¡ ½á ³Ö´Â´Ù.
putImageData(imgData, x, y, [dx, dy, dw, dh] )
imgData Àüü¸¦ x, y À§Ä¡¿¡
½á ³Ö´Â´Ù. imgData ÀÚü¿¡ Æø°ú ³ôÀÌ¿¡ ´ëÇÑ Á¤º¸°¡ ÀÖÀ¸¹Ç·Î Á»ó´Ü ÁÂÇ¥¸¸ Àü´ÞÇÏ¸é µÈ´Ù. ·¡½ºÅÍ µ¥ÀÌÅÍÀÇ ÀϺθ¸ º¹»çÇÏ·Á¸é 4¹ø° ÀÌÈÄÀÇ dx, dy, dw, dh °ªÀ¸·Î ¿øº»ÀÇ ¾î´À ºÎºÐÀ» º¹»çÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤ÇÑ´Ù.
ÀÌ Àμö ¾Õ¿¡ d´Â dirty¶ó´Â ¶æÀε¥ ¿øº»¿¡¼
´Þ¶óÁø ºÎºÐ, Áï °»½ÅÀÌ ÇÊ¿äÇÑ ºÎºÐÀ» ÀǹÌÇÑ´Ù.
ĵ¹ö½ºÀÇ À̹ÌÁö¸¦ Á¶ÀÛÇÏ´Â ÀýÂ÷´Â °£´ÜÇÏ´Ù. getImageData·Î
»çº»À» ¶ß°í ÀÌ »çº»À» Âɹ°µü°Å·Á ¿øÇϴ´ë·Î ¹Ù²Û ÈÄ ´Ù½Ã putImageData·Î ¹Ð¾î ³Ö´Â °ÍÀÌ´Ù. Çȼ¿ µ¥ÀÌÅ͸¦ Á÷Á¢ Á¶ÀÛÇϹǷΠ¾î¶°ÇÑ º¯Çüµµ °¡´ÉÇÏ´Ù. ´ÙÀ½Àº °¡Àå
°£´ÜÇÑ ¿¹ÀÎ ¹ÝÀü Á¶ÀÛÀ» ÇØ º»´Ù.
revert.html
function draw() {
var
img = new Image();
img.src="hodori.jpg"
img.onload
= function() {
ctx.drawImage(img,
0, 0);
var
imgData=ctx.getImageData(0, 0, canvas.width, canvas.height);
var
raster = imgData.data;
for
(var i=0;i<raster.length;i++) {
if
(i % 4 != 3) {
raster[i]
= 255 - raster[i];
}
}
ctx.putImageData(imgData,0,
0);
}
}
È£µ¹ÀÌ ¸ð¾çÀÇ À̹ÌÁö¸¦ Àоî ĵ¹ö½ºÀÇ ¿øÁ¡¿¡ Ãâ·ÂÇß´Ù. ÀÌ »óÅ¿¡¼ getImageData ¸Þ¼µå·Î ĵ¹ö½º ÀüüÀÇ À̹ÌÁö µ¥ÀÌÅ͸¦ ÀÐ¾î µéÀδÙ. Á¶ÀÛ
´ë»óÀº data ¸â¹ö¿¡ µé¾îÀÖ´Â Çȼ¿ Á¤º¸ÀÌ´Ù. Àüü ·¡½ºÅÍ
µ¥ÀÌÅÍ¿¡ ´ëÇØ ·çÇÁ¸¦ µ¹¸ç ´ÙÀ½ °ø½Ä´ë·Î »ö»ó ¿ä¼Ò°ªÀ» Á¶ÀÛÇÑ´Ù.
a' = 255 - a;
255¿¡¼ ¿ø·¡ÀÇ »ö»ó¿ä¼Ò°ªÀ» »© ¹ÝÀü°ªÀ» ´Ù½Ã ±â·ÏÇÑ´Ù. °ËÁ¤»öÀº Èò»öÀÌ µÇ°í Èò»öÀº °ËÁ¤»öÀÌ µÇ¸ç Áß°£»öÀº º¸»öÀ¸·Î ¹Ù²ï´Ù. ´Ü, Åõ¸íµµÀÎ ¾ËÆÄ°ªÀº ±×´ë·Î À¯ÁöÇÑ´Ù.
ÀÌ ¿¹Á¦´Â IE¿Í ÆÄÀ̾îÆø½º¿¡¼´Â Àß ½ÇÇàµÇÁö¸¸ Å©·Ò¿¡¼´Â ¾ÆÁ÷ Á¦´ë·Î
½ÇÇàµÇÁö ¾ÊÀ¸¸ç ÀÌÈÄÀÇ ¿¹Á¦ ¸î °³µµ ¸¶Âù°¡ÁöÀÌ´Ù. Á¶¸¸°£ ÇØ°áµÇ°ÚÁö¸¸ ´çºÐ°£Àº ºê¶ó¿ìÀú¿¡ µû¶ó ½ÇÇàµÇÁö
¾Ê´Â ¿¹Á¦°¡ ²Ï ÀÖÀ¸¹Ç·Î ¿øÇÏ´Â °á°ú°¡ ³ª¿ÀÁö ¾ÊÀ¸¸é ºê¶ó¿ìÀú¸¦ ¹Ù²ã¼ Å×½ºÆ®ÇØ ºÁ¾ß ÇÑ´Ù.
È£µ¹ÀÌ ¿À¸¥ÂÊÀÇ Èò»öÀº ¹ÝÀüµÇÁö ¾Ê´Âµ¥ À̴ ĵ¹ö½ºÀÇ ¿ø·¡ »ö»óÀÌ Åõ¸íÇÑ °ËÁ¤»öÀÎ rgba(0, 0, 0, 0)À̱⠶§¹®ÀÌ´Ù. Åõ¸í»öÀº ¹ÝÀü½ÃÄѺÁ¾ß
¿©ÀüÈ÷ Åõ¸íÇÏ´Ù. »çº»À» ¶ß´Â À§Ä¡¸¦ ¹Ù²Ù¸é ÀϺκи¸ °¡Á®¿Í ÀÛ¾÷ÇÒ ¼öµµ ÀÖ´Ù.
revert2.html
function draw() {
var
img = new Image();
img.src="hodori.jpg"
img.onload
= function() {
ctx.drawImage(img,
0, 0);
var
imgData=ctx.getImageData(0, 80, canvas.width, 50);
var
raster = imgData.data;
for
(var i=0;i<raster.length;i++) {
if
(i % 4 != 3) {
raster[i]
= 255 - raster[i];
}
}
ctx.putImageData(imgData,0,
80);
}
}
(0, 80)¿¡¼ºÎÅÍ ³ôÀÌ 50¸¸Å¸¸
°¡Á®¿Í ¹ÝÀü½ÃÄ×´Ù. ¹ÝÀü½ÃŲ ·¡½ºÅÍ µ¥ÀÌÅ͸¦ ¿øº»°ú °°Àº À§Ä¡ÀÎ
(0, 80)¿¡ ±â·ÏÇß´Ù. ¿øº»°ú °°Àº À§Ä¡¿¡ ½á¾ß ÇÒ ÇÊ¿äµµ ¾ø´Ù. ´Ù¸¥ À§Ä¡¿¡ ¾²´Â °Íµµ °¡´ÉÇÏ´Ù. ¿À¸¥ÂÊ ±×¸²Àº (0, 80)¿¡¼ ÀÐÀº °ªÀ» (200, 80)¿¡ Ãâ·ÂÇÑ °ÍÀÌ´Ù.
·çÇÁ¿¡¼ ·¡½ºÅÍ µ¥ÀÌÅ͸¦ ¾î¶»°Ô Á¶ÀÛÇϴ°¡¿¡ µû¶ó ¿øº» ±×¸²ÀÌ ¾î¶»°Ô º¯ÇüµÉ °ÍÀΰ¡°¡ ´Þ¶óÁø´Ù. ´ÙÀ½ ¿¹´Â Ä÷¯ À̹ÌÁö¸¦ ±×·¹À̽ºÄÉÀÏ·Î º¯ÇüÇÑ´Ù.
grayscale.html
function draw() {
var
img = new Image();
img.src="hodori.jpg"
img.onload
= function() {
ctx.drawImage(img,
0, 0);
var
imgData=ctx.getImageData(0, 0, canvas.width, canvas.height);
var
raster = imgData.data;
for
(var i=0;i<raster.length;i+=4) {
var
gray = raster[i] * 0.299 + raster[i+1] * 0.587 + raster[i+2] * 0.114;
raster[i]
= raster[i+1] = raster[i+2] = gray;
}
ctx.putImageData(imgData,0,
0);
}
}
°¢ Çȼ¿ÀÇ ¹à±â¸¸ Á¶»çÇÏ¿© R, G, B »ö»ó ¿ä¼Ò¸¦ ±ÕÀÏÇÏ°Ô ¸¸µé¸é
ȸ»öÀÌ µÈ´Ù. R, G, B °¢ ¿ä¼Ò°¡ ¹à±â¿¡ ¹ÌÄ¡´Â ¿µÇâÀº
29:58:11·Î Àü¹®°¡¿¡ ÀÇÇØ °è»êµÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ ºñÀ²´ë·Î ¹à±â¸¦ °è»êÇÏ¸é µÈ´Ù. Èæ¹éÀÇ
Áö¸é¿¡¼´Â ¶È°°¾Æ º¸ÀÏ °ÍÀÌ´Ù.
´ÙÀ½ ¿¹Á¦´Â À̹ÌÁö¸¦ ¾Æ¿¹ Èæ¹éÀ¸·Î ¸¸µé¾î ¹ö¸°´Ù.
monoimage.html
function draw() {
var
img = new Image();
img.src="hodori.jpg"
img.onload
= function() {
ctx.drawImage(img,
0, 0);
var
imgData=ctx.getImageData(0, 0, canvas.width, canvas.height);
var
raster = imgData.data;
for
(var i=0;i<raster.length;i+=4) {
var
gray = raster[i] * 0.299 + raster[i+1] * 0.587 + raster[i+2] * 0.114;
if
(gray > 128) {
gray
= 255;
}
else {
gray
= 0;
}
raster[i]
= raster[i+1] = raster[i+2] = gray;
}
ctx.putImageData(imgData,0,
0);
}
}
±×·¹À̽ºÄÉÀÏÀº »ö»ó Á¤º¸¸¸ ¾ø¾Ö°í 0~255 ´Ü°èÀÇ È¸»öÀ¸·Î ¸¸µå´Âµ¥
ºñÇØ À§ ¿¹Á¦´Â 128 ÀÌ»óÀº Èò»öÀ¸·Î, 128 ÀÌÇÏ´Â °ËÁ¤»öÀ¸·Î
¸¸µé¾î ¹ö¸²À¸·Î½á Èò»ö°ú °ËÁ¤»ö µÎ °¡Áö¸¸ ³²±ä´Ù. °æ°è°ªÀÎ 128À»
Á¶Á¤ÇÏ¸é ¹à±â°¡ ´Þ¶óÁø´Ù.
ÀÌ ¿Ü¿¡µµ ¿©·¯ °¡Áö ÇÊÅ͸¦ ¸¸µé¾î Àû¿ëÇÒ ¼ö ÀÖ´Ù. ¹à±â Á¶Á¤, ´ëºñ Á¶Á¤, ¼¼ÇÇ¾Æ È¿°ú, »ö»ó
±³Ã¼ µîÀÇ ±â¹ýÀÌ ÀÖÀ¸¸ç ÀÎÁ¢ Çȼ¿±îÁö °è»ê¿¡ Æ÷ÇÔÇÏ¸é ¿Ü°û¼± ÃßÃâ, ¸ðÀÚÀÌÅ© È¿°ú µîµµ °¡´ÉÇÏ´Ù. Æ÷Åä¼¥ ¸¹ÀÌ ½á º» »ç¶÷µéÀº ÀÌ·± È¿°ú¿¡ Àͼ÷ÇÒ °ÍÀÌ´Ù.
¸Þ¸ð¸®¿¡¼ ·¡½ºÅÍ µ¥ÀÌÅ͸¦ Á÷Á¢ »ý¼ºÇÒ ¼öµµ ÀÖ´Ù. ´ÙÀ½ ¸Þ¼µå´Â
·¡½ºÅÍ µ¥ÀÌÅ͸¦ ¿øÇÏ´Â Å©±â·Î Á÷Á¢ »ý¼ºÇϰųª ´Ù¸¥ ·¡½ºÅÍ µ¥ÀÌÅÍÀÇ »çº»À» º¹»çÇÑ´Ù.
createImageData(width, height)
createImageData(raster)
»õ·Î »ý¼ºµÈ ·¡½ºÅÍ µ¥ÀÌÅÍ´Â rgba(0, 0, 0, 0)ÀÎ Åõ¸íÇÑ
°ËÁ¤À¸·Î ÃʱâȵǴµ¥ ¿©±â¿¡ ¿øÇÏ´Â ±×¸²À» Á÷Á¢ ±×¸°´Ù. ¹°·Ð ±×¸®±â ¸Þ¼µå¸¦ ¾²´Â °ÍÀÌ ¾Æ´Ï¶ó Çȼ¿
µ¥ÀÌÅ͸¦ Á÷Á¢ Á¶ÀÛÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â ĵ¹ö½º Å©±â¿Í µ¿ÀÏÇÑ À̹ÌÁö µ¥ÀÌÅ͸¦ »ý¼ºÇÑ ÈÄ ¹«ÀÛÀ§ À§Ä¡¿¡
¹«ÀÛÀ§ »ö»óÀ¸·Î 10000°³ÀÇ Á¡À» Âï´Â´Ù.
randompixel.html
function draw() {
var
imgData = ctx.createImageData(canvas.width, canvas.height);
var
raster = imgData.data;
for
(var i=0; i < 10000; i++) {
var
p = Math.floor(Math.random() * raster.length / 4) * 4;
raster[p]
= Math.floor(Math.random() * 256);
raster[p+1]
= Math.floor(Math.random() * 256);
raster[p+2]
= Math.floor(Math.random() * 256);
raster[p+3]
= 255;
}
ctx.putImageData(imgData,
0, 0);
}
·¡½ºÅÍ ¹è¿ÀÇ ÀÓÀÇ À§Ä¡¸¦ ³¼ö·Î ¼±ÅÃÇ쵂 argb ¿ä¼ÒÀÇ ¼±µÎ¿¡
¸ÂÃß±â À§ÇØ ¹Ýµå½Ã 4ÀÇ ¹è¼ö À§Ä¡¸¦ ã¾Æ¾ß ÇÑ´Ù. ³¼ö·Î
¼±ÅÃÇÑ °÷¿¡ r, g, b ¿ä¼Ò¸¦ ¿ª½Ã ³¼ö·Î ½á ³Ö°í ¾ËÆÄ°ªÀº ºÒÅõ¸íÀÎ 255·Î ÁöÁ¤ÇÑ´Ù. ÀÌ·¸°Ô ÇÏ¸é ¹«ÀÛÀ§ À§Ä¡¿¡ ÀÓÀÇÀÇ »ö»óÀ¸·Î Á¡ÀÌ
ÂïÈù´Ù.
»õ·Î°íħÀ» ÇÒ ¶§¸¶´Ù Á¡ ¹èÄ¡°¡ ¿ÏÀüÈ÷ ´Ù½Ã ¹Ù²ð °ÍÀÌ´Ù. ·¡½ºÅÍ
µ¥ÀÌÅÍ´Â ¸Þ¸ð¸® µ¢¾î¸®ÀÏ »ÓÀÌ¾î¼ Á÷Á¢ Á¶ÀÛÀº °¡´ÉÇÏÁö¸¸ ±×¸®±â ¸Þ¼µå¸¦ ¾µ ¼ö ¾øÀ¸¹Ç·Î ¸Þ¸ð¸®¿¡¼ ÀÓÀÇÀÇ ±×¸²À» ±×¸®±â´Â ¾î·Æ´Ù.
·ÎÄÿ¡¼´Â À̹ÌÁö µ¥ÀÌÅ͸¦ Å©·Î½º µµ¸ÞÀÎ ±ÝÁö¿¡ ÀÇÇØ Á¶ÀÛÇÒ ¼ö ¾ø´Â °æ¿ìµµ ÀÖ´Ù. file://À¸·ÎºÎÅÍ ÀÐÀº ÆäÀÌÁö´Â ºê¶ó¿ìÀúÀÇ ½ÇÇà ȯ°æ°ú ´Ù¸¥ µµ¸ÞÀÎÀ¸·Î Ãë±ÞµÈ´Ù. ÀÌ·² °æ¿ì´Â À¥ ¼¹ö¿¡ ¿Ã·Á¼ Å×½ºÆ®ÇØ¾ß ÇÑ´Ù.