【canvas學習筆記八】像素操作

来源:http://www.cnblogs.com/-867259206/archive/2017/08/29/7448270.html
-Advertisement-
Play Games

ImageData對象 ImageData對象包含了一個區域內的canvas的像素信息。它包含以下可讀屬性: width canvas的寬度,單位是像素。 height canvas的高度,單位是像素。 data 一個Uint8ClampedArray的一維數組,包含了每個像素的RGBA值。 什麼是 ...


ImageData對象

ImageData對象包含了一個區域內的canvas的像素信息。它包含以下可讀屬性:

width
canvas的寬度,單位是像素。
height
canvas的高度,單位是像素。
data
一個Uint8ClampedArray的一維數組,包含了每個像素的RGBA值。

什麼是Uint8ClampedArray?這個數組裡的數值是8位的整型,而且值得範圍在0和255之間。任何不在[0, 255]之間的數都會變成[0, 255]之間最接近的那個整型數。
0到255之間,那記錄的自然是RGBA顏色數值啦。這個data數組是這樣排列的,data[0]是第一排第一列的像素R通道的數值,data[1]第一排第一列的像素G通道的數值,data[3]是第一排第一列的像素的Alpha通道的數值。而data[4]是第一排第二列的像素的R通道數值,以此類推。
比如說,第50排第200列的像素的藍色通道的值:

blueComponent = imageData.data[((50 * (imageData.width * 4)) + (200 * 4)) + 2];

另外,data也有length屬性,就是data數組的長度。

創建ImageData對象

有兩種方法創建ImageData:

var myImageData = ctx.createImageData(width, height);

var myImageData = ctx.createImageData(anotherImageData);

註意啦,方法二是不會把data屬性複製過去的,僅僅是複製了寬度和高度,data數組裡的像素信息都是透明黑的,也就是都是0。

獲取像素信息

可以用getImageData()方法獲取像素信息。

var myImageData = ctx.getImageData(left, top, width, height);

top和left就是所截取的畫布部分的左上角坐標。

Tip:
超過畫布區域返回的像素信息都是透明黑,也就是都是0。

例子

var img = new Image();
img.src = 'https://mdn.mozillademos.org/files/5397/rhino.jpg';
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
img.onload = function() {
  ctx.drawImage(img, 0, 0);
  img.style.display = 'none';
};
var color = document.getElementById('color');
function pick(event) {
  var x = event.layerX;
  var y = event.layerY;
  var pixel = ctx.getImageData(x, y, 1, 1);
  var data = pixel.data;
  var rgba = 'rgba(' + data[0] + ', ' + data[1] +
             ', ' + data[2] + ', ' + (data[3] / 255) + ')';
  color.style.background =  rgba;
  color.textContent = rgba;
}
canvas.addEventListener('mousemove', pick);

結果

image
滑鼠滑過就會顯示rgba值。

繪製像素

ctx.putImageData(myImageData, dx, dy);

這個方法可以傳入一個ImageData對象,然後把ImageData對象中的像素信息都畫出來。dx, dy是繪製的左上角坐標。
比如我們可以逐一改變ImageData對象中的值,從而改變了整個圖象的顏色,再把它畫出來。
這有什麼用呢?對於要對像素進行的操作來說,這很方便。比如反色、去色等操作。

例子

var img = new Image();
img.src = 'https://mdn.mozillademos.org/files/5397/rhino.jpg';
img.onload = function() {
  draw(this);
};

function draw(img) {
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  ctx.drawImage(img, 0, 0);
  img.style.display = 'none';
  var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  var data = imageData.data;
    
  var invert = function() {
    for (var 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);
  };

  var grayscale = function() {
    for (var i = 0; i < data.length; i += 4) {
      var 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);
  };

  var invertbtn = document.getElementById('invertbtn');
  invertbtn.addEventListener('click', invert);
  var grayscalebtn = document.getElementById('grayscalebtn');
  grayscalebtn.addEventListener('click', grayscale);
}

invert()反色函數將RGB通道的值用255減去,grayscale()去色函數將RGB通道的值進行平均,從而使顏色變成灰色。

結果

image

點擊grayscale按鈕圖片會變成灰色,點擊invert按鈕圖片會反色。
可以把代碼放進codepen里看看效果如何。

保存圖片

canvas可以將畫布保存成圖片鏈接,圖片鏈接可以用於標簽或者下載。

canvas.toDataURL('image/png')
預設轉換成的格式是png。
canvas.toDataURL('image/jpeg', quality)
也可以是別的圖片格式。quality是圖片品質,數值是0~1。0是最差的品質,1是最佳的品質。

也可以生成二進位對象:

canvas.toBlob(callback, type, encoderOptions)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目前,不管是前端開發人員還是個人站長,經常需要一些代碼處理類的工具,比如:代碼對比、代碼格式化、圖標製作等。有時就是一時急用可電腦上又沒有安裝相關的軟體,這裡為大家收集了一些我們經常會用到的線上工具。 代碼對比/歸併: http://www.matools.com/compare 正則表達式: ht ...
  • location對象其實就是window.location,其中頂級對象window可以省略 主要的屬性 location.host 主機 location.hostname 主機名 location.port 埠 location.protocol 協議 location.pathname 路徑 ...
  • 在jquery中,插件開發常見的有: 一種是為$函數本身擴展一個方法,這種是靜態擴展(也叫類擴展),這種插件一般是工具方法, 還有一種是擴展在原型對象$.fn上面的,開發出來的插件是用在dom元素上面的 一、類級別的擴展 註意要提前引入jquery庫, 上例在$函數上面添加了一個方法showMsg, ...
  • ES6引入了Class(類)這個概念,作為對象的模板,通過class關鍵字,可以定義類。基本上,ES6的class可以看作只是一個語法糖,它的絕大部分功能,ES5都可以做到,新的class寫法只是讓對象原型的寫法更加清晰、更像面向對象編程的語法而已。 那麼如何掌握類這項技能,讓我來陪大家一起學習: ...
  • 今天做項目時,做到註冊頁面,有一個需求是:要求用戶設置的密碼不包含全部或部分用戶名(任意連續3個字元)。 無奈js薄弱的很,研究了好久才寫出來,汗顏。。。。 //截取字元串中相鄰的三個字元,並放到新建的數組中 function subStr (str) { var arr = []; for(var ...
  • DIV+CSS clear both清除產生浮動 我們知道有時使用了css float浮動會產生css浮動,這個時候就需要清理清除浮動,我們就用clear樣式屬性即可實現。 接下來我們來認識與學習css clear知識與用法。 一、clear語法與結構 - TOP 1、clear語法:clear : ...
  • spectre.css是一個輕量級的css框架,只要使用過bootstrap,那麼這個使用起來就不是問題,不過現在網路上的文檔大都是英文,而且寫的比較概括,所以查閱起來不是很方便,今天是我第一天學習這個框架,把所學到的知識點記錄下來。 使用步驟: 1.引用方法 下載spectre.css,地址:ht ...
  • 網上關於閉包的文章一搜一大堆,但是我還是要來說一下我的理解。 我理解的閉包,其實就是 訪問了外部變數的函數 : 可能和同學們平常看到的理解不太一樣,但 "維基百科" )的確是這樣描述的: a closure is a record storing a function together with a ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...