D3.js繪製 顏色:RGB、HSL和插值 (V3版本)

来源:https://www.cnblogs.com/littleSpill/archive/2019/05/10/10847057.html
-Advertisement-
Play Games

顏色和插值 電腦中的顏色,常用的標準有RGB和HSL。 RGB:色彩模式是通過對紅(Red)、綠(Green)、藍(Blue)三個顏色通道相互疊加來得到額各式各樣的顏色。三個通道的值得範圍都是0~255,因此總共能表示16777216(255*255*255)種,即一千六百多萬種顏色。幾乎包括了人 ...


顏色和插值   電腦中的顏色,常用的標準有RGB和HSL。   RGB:色彩模式是通過對紅(Red)綠(Green)藍(Blue)三個顏色通道相互疊加來得到額各式各樣的顏色。三個通道的值得範圍都是0~255,因此總共能表示16777216(255*255*255)種,即一千六百多萬種顏色。幾乎包括了人類所能識別的所有顏色,是應用最廣泛的色彩模式。
HSL:色彩模式是通過色相(Hue)飽和度(Saturation)明度(Lightness)三個通道的相互疊加來得到各種顏色的。其中,色相的範圍為0°~360°,飽和度的範圍為0~1,明度的範圍為0~1.色相的取值是一個角度,每個角度可以代表之中的一種顏色,需要記住的是0°或360°代表紅色,120°代表綠色,240°代表藍色。飽和度的數值越大,顏色越鮮艷,灰色越少。明度值用於控制色彩的明暗變化,值越大,越明亮,越接近於白色。值越小,越暗,越接近黑色。   RGB顏色和HSL顏色可以相互轉換。   一 、D3中提供了RGB顏色的創建、調整明暗、轉換為HSL模式的方法,方法如下:   d3.rgb(r,g,b) //分別輸出r、g、b值來創建顏色,範圍都為[0,255]。   d3.rgb(color) //輸入相應的字元串來創建顏色,例如: (1)RGB的十進位值;"rgb(255,255,255)"。 (2)HSL的十進位值: "hsl(120,0.5,0.5)"。 (3)RGB的十六進位值: "#ffeeaa"。 (4)RGB的十六進位值得縮寫形式:"#fea"。 (5)顏色的名稱: "red","white"。   rgb.brighter([k]) //顏色變得更明亮。RGB各通道的值乘以0.7^-k。如果k省略,k的值為1.只有當某通道的值得範圍在30~255之間時,才會進行相應的計算。   rgb.darker([k]) //顏色變得更暗。RGB各通道的值乘以0.7^k。   rgb.hsl() //返回該顏色對應的HSL值。   rgb.toString() //以字元串形式返回該顏色的值,如"#ffeeaa"。
brighter()darker()返回一個新的顏色對象,不會改變當前顏色對象。hsl()返回當前顏色對應的HSL值,也是一個新的對象。舉個例子:  
 1 //RGB
 2         var color1 = d3.rgb(40,80,0)
 3         var color2 = d3.rgb("red")
 4         var color3 = d3.rgb("rgb(0,255,255)")
 5 
 6         //將color1的顏色變亮
 7         console.log(color1.brighter(2))         //返回值的顏色為{r: 81, g: 163, b: 0}
 8         console.log(color1)                     //原顏色值不變依然返回{r: 40, g: 80, b: 0}
 9 
10         //將color2的顏色變亮
11         console.log(color2.darker(2))           //返回值的顏色為{r: 124, g: 0, b: 0}
12         console.log(color2)                     //原顏色值不變依然返回{r: 255, g: 0, b: 0}
13 
14         //輸出color3顏色的HSL值
15         console.log(color3.hsl())               //返回值{h: 180, s: 1, l: 0.5}
16 
17         console.log(color3.toString())          //返回#00ffff

 

  二 、HSL顏色的創建和使用與d3.rgb幾乎一樣,只是各顏色通道的意義不同。   d3.hsl(h,s,l) //根據h、s、l的值來創建HSL顏色。   d3.hsl(color) //根據字元串來創建HSL顏色。   hsl.beighter([k]) //變得更亮   hsl.darker([k]) //變得更暗   hsl.rgb() //返回對應的RGB顏色。   hsl.toString() //以RGB字元串形式輸出該顏色。   對於HSL顏色來說,brighter()darker()更好理解,因為HSL的"L"就是明亮度。也就是說,應用brighter()darker()後,只有h、s、l中的第三個顏色通道"l"發生變化。舉個例子:  
 1 //HSL
 2         var hsl = d3.hsl(120,1.0,0.5);
 3 
 4         //變得更亮
 5         console.log(hsl.brighter())             //輸出{h: 120, s: 1, l: 0.7142857142857143}
 6 
 7         //變得更暗
 8         console.log(hsl.darker())               //輸出 {h: 120, s: 1, l: 0.35}
 9 
10         //返回對應的rgb值
11         console.log(hsl.rgb())                  //輸出{r: 0, g: 255, b: 0}
12 
13         console.log(hsl.toString())             //輸出#00ff00

 

一般來說,編程人員喜歡使用RGB顏色,比較好理解。美術人員更喜歡使用HSL顏色,方便調整飽和度和亮度。     三 、插值   如果要計算介於兩個顏色之間的顏色,需要用到插值(Interpolation)。D3提供了d3.intrerpolateRgb()來處理RGB顏色之間的插值運算,d3.interpolateHsl()來處理HSL顏色之間的插值運算。更方便的是使用d3.interpolate(),它會自動判斷顏色的類型。d3.interpolate()也可以處理數值、字元串等之間的插值。舉個例子:  
 1 //插值
 2         var a = d3.rgb(255,0,0)                 //紅色
 3         var b = d3.rgb(0,255,0)                 //綠色
 4         var compute = d3.interpolate(a,b)
 5 
 6         console.log(compute(0))                 //輸出#ff0000
 7         console.log(compute(0.2))               //輸出#cc3300
 8         console.log(compute(0.5))               //輸出#808000
 9         console.log(compute(1))                 //輸出#00ff00
10 
11         console.log(compute(2))                 //輸出#00ff00
12         console.log(compute(-1))                //輸出#ff0000

 

這段代碼里,定義了兩個RGB顏色:紅(255,0,0)綠(0,255,0)。然後,以這兩個顏色對象作為d3.interpolate(a,b)的參數。d3.interpolate返回一個函數,保存在變數compute里。於是,compute可當做函數使用,參數是一個數值。 當數值為0時,返回紅色。 當數值為1時,返回綠色。 當數值為0~1之間的值時,返回介於紅色和綠色之間的顏色。 如果數值超過1,則返回綠色:數值小於0,則返回紅色。    
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 先上效果圖 使用註意事項 1:註意在app.json中註冊頁面路徑 2:如果要增加新的Item,可到js中對listService數組進行增加 3:listService參數[ title:分類標題 items:這個分類下的所有Item[ name:這個Item的名字 url:這個Item點擊跳轉路 ...
  • 前言 最近有需求需要實現插卡預設打開Volte功能,順帶研究了下Volte的流程,在此做個記錄 開始 從Settings設置界面入手,網路和互聯網 移動網路 VoLTE高清通話(電信卡)/增強型4G LTE模式(移動卡) 找到網路和互聯網載入對應的Fragment為NetworkDashboardF ...
  • 一、概述 相較於png、jpg等點陣圖通過存儲像素點來記錄圖像,svg (Scalable Vector Graphics)擁有一套自己的語法,通過描述的形式來記錄圖形。Android並不直接使用原始的svg格式圖片,而是將其轉化為VectorDrawable。VectorDrawable是一個xml ...
  • 一、Context概念理解 Google解釋如下: Interface to global information about an application environment. This is an abstract class whose implementation is provided ...
  • csr8670是我們csr86xx藍牙音頻soc系列中的高級快閃記憶體產品,旨在提供高質量的無線音頻性能並支持高差異優質無線音頻產品的開發。 csr8670是csr 86xx系列的一部分,這是一系列用於無線音頻應用的硅平臺,集成了雙模式藍牙收音機、低功耗dsp、一個應用處理器,一個電池充電器,存儲器和各種 ...
  • 背景 在工作過程中,我們常常會從一個項目工程複製代碼到一個新的項目,改項目配置信息、刪除不必要的代碼。 這樣做的效率比較低,也挺繁瑣,更不易於分享協作。 所以,我們可以製作一個cli工具,用來快速創建一個新項目的腳手架。如vue-cli就是一個非常好用的cli工具。 PS:cli 是一個全局安裝的 ...
  • 給背景圖片設置一個預設背景顏色,有以下兩種方法: 轉載 http://www.itxst.com/detail/jnjvv2qu.html ...
  • 3D 在2d的基礎上添加 z 軸的變化 3D 位移:在2d的基礎上添加 translateZ(),或者使用translate3d() translateZ():以方框中心為原點,變大 3D 縮放:在2d的基礎上添加 scaleZ(),或者使用scale3d() scaleZ()和 scale3d() ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...