3-2-2.À̹ÌÁö µ¥ÀÌÅÍ

À̹ÌÁö´Â ¼ö¸¹Àº Çȼ¿·Î ±¸¼ºµÇ¾î ÀÖ´Ù. À̹ÌÁö¸¦ ±¸¼ºÇÏ´Â Çȼ¿ Á¤º¸¸¦ ·¡½ºÅÍ(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://À¸·ÎºÎÅÍ ÀÐÀº ÆäÀÌÁö´Â ºê¶ó¿ìÀúÀÇ ½ÇÇà ȯ°æ°ú ´Ù¸¥ µµ¸ÞÀÎÀ¸·Î Ãë±ÞµÈ´Ù. ÀÌ·² °æ¿ì´Â À¥ ¼­¹ö¿¡ ¿Ã·Á¼­ Å×½ºÆ®ÇØ¾ß ÇÑ´Ù.