HTML DOM 快速導覽 - CanvasRenderingContext2D 物件的方法 getImageData()

CanvasRenderingContext2D 為 HTML 5 內嵌元素 (embedded content) <canvas> 的 getContext() 方法所回傳的物件 (object) , getImageData() 為 CanvasRenderingContext2D 的方法,回傳 ImageData 物件,用以對圖像進行畫素等級的處理動作。



ImageData 物件有三個屬性
  • width
  • height
  • data


width 為圖像的寬, height 為圖像的高, data 為 Uint8ClampedArray 物件,其逐畫素從第一列自左而右,然後沿列往下再自左而右,記錄每個畫素的紅、綠、藍、透明度,因此一個畫素在陣列中佔據 4 個值,每個值為 0 到 255 的整數。


getImageData() 需要四個參數
getImageData(sx, sy, sw, sh)


sx 為圖像起始的 x 座標, sy 為圖像起始的 y 座標, sw 為圖像的寬, sh 為圖像的高。舉例如下
function run() {
    var d = document.getElementsByTagName("canvas");
    var c = d[0].getContext("2d");
    
    var imgd = c.createImageData(d[0].width, d[0].height);
    for (var i = 0; i < imgd.data.length; i += 4) {
        imgd.data[i] = 255;
        imgd.data[i + 1] = 0;
        imgd.data[i + 2] = 0;
        imgd.data[i + 3] = 255;
    }
    c.putImageData(imgd, 0, 0);
    
    var imgd2 = c.getImageData(40, 40, 100, 100);
    for (var j = 0; j < imgd2.data.length; j += 4) {   
        imgd2.data[j] = 255 - imgd2.data[j];
        imgd2.data[j + 1] = 255 - imgd2.data[j + 1];
        imgd2.data[j + 2] = 255 - imgd2.data[j + 2];
    }   
    c.putImageData(imgd2, 40, 40);
}

/* 《程式語言教學誌》的範例程式
     http://pydoing.blogspot.com/
     檔名:htmldemo094.js
     功能:示範 JavaScript 程式 
     作者:張凱慶
     時間:西元 2011 年 8 月 */


此例用 document 物件的 getElementsByTagName() 方法 (method) ,取得標籤名稱為 canvas 的 HTMLCollection 物件,文件的第一個 <canvas> 元素亦即該 HTMLCollection 索引值為 0 的物件
var d = document.getElementsByTagName("canvas");
var c = d[0].getContext("2d");


然後利用 createImageData() 建立一個紅色正方形
var imgd = c.createImageData(d[0].width, d[0].height);
for (var i = 0; i < imgd.data.length; i += 4) {
    imgd.data[i] = 255;
    imgd.data[i + 1] = 0;
    imgd.data[i + 2] = 0;
    imgd.data[i + 3] = 255;
}
c.putImageData(imgd, 0, 0);


逐畫素指定完顏色後,最後需要利用 putImageData() 把圖像放進 <canvas> 。


再利用 getImageData() 建立一個從紅色反相,也就是青色的正方形
var imgd2 = c.getImageData(40, 40, 100, 100);
for (var j = 0; j < imgd2.data.length; j += 4) {   
    imgd2.data[j] = 255 - imgd2.data[j];
    imgd2.data[j + 1] = 255 - imgd2.data[j + 1];
    imgd2.data[j + 2] = 255 - imgd2.data[j + 2];
}   
c.putImageData(imgd2, 40, 40);


同樣的,逐畫素指定完顏色後,最後需要利用 putImageData() 把圖像放進 <canvas> 。


我們以下面的 HTML 文件載入
<!DOCTYPE html>
<html>
<head>
<title>HTML DOM DEMO</title>
<script src="htmldemo094.js" type="text/javascript"></script>
</head>
<body onload="run();">
<canvas id="demo" width="180" height="180"></canvas>
</html>

<!-- 《程式語言教學誌》的範例程式
     http://pydoing.blogspot.com/
     檔名:htmldemo094.html
     功能:示範 JavaScript 程式 
     作者:張凱慶
     時間:西元 2011 年 8 月 -->


瀏覽器 (browser) 開啟如下



中英文術語對照
內嵌元素embedded content
物件object
屬性attribute
方法method
瀏覽器browser


您可以繼續參考
HTML 5 範例

HTML 元素物件


相關目錄
HTML DOM 快速導覽
JavaScript 教材
首頁


參考資料
https://developer.mozilla.org/en/DOM/HTMLCanvasElement
https://developer.mozilla.org/en/HTML/Element/canvas
http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#the-canvas-element

沒有留言: