1. 程式人生 > >在 html 中用加色法混合顏色

在 html 中用加色法混合顏色

概要

本文通過解決一個假想的問題介紹了 css screen 混合模式,並介紹瞭如何用 svg 濾鏡、canvas 2d、canvas webgl 實現相同的效果。

問題

下面的圖片演示三種顏色光疊加的效果,請在 html 中實現這種效果。

三個不同顏色的光斑,重疊的部分符合加色法

約定

詞語 指代
混合 blend
加色 additive color - 名詞
特性 attribute,比如 <a id=1>,說 id 是元素 a 的特性
透明度 α、alpha
偽輸入影象 pseudo input image
著色器 shader
著色器程式 shader program
xml 應用程式 XML application
chrome google chrome 41
firefox firefox developer edition 40
ie internet explorer 11
3 個瀏覽器 上面 3 個版本的瀏覽器


opera 已經基於 webkit 了,所以未測試 opera,若在 chrome 中可用那我就認為在 opera 中也可用。

分析

當然可以用 photoshop 製作圖片,html 用 <img>

引用該圖片,本文不討論這種方法。

觀察重疊部分發現該部分的顏色不僅受自己的影響、還受它下面背景顏色的影響,重疊部分的顏色是自己的顏色和背景顏色混合的結果。換句話說,一個畫素繪製出來的顏色等於畫素顏色和背景畫素顏色的混合,即

C=B(Cb,Cs),其中,
C 是繪製的顏色
B 是混合函式
Cb 是背景顏色
Cs 是前景顏色,即畫素的顏色

這裡面 C 的 r、g、b 顏色分量都是 [0, 1] 的小數而不是 [0, 255] 的整數。顯然,對同一個畫素來說不同的 B 得到不同的 C。紅綠藍分別是 rgb(1, 0, 0)rgb(0, 1, 0)rgb(0, 0, 1)B 如果滿足 B(Cb,

Cs)=min(Cs+Cb,1) 就能合成白色。

重點:不同的 B 得到不同的 C

不可行的方法

html 中經常用到下面 3 個方法,

  • css opacity 屬性
  • css rgba()/hsla() 顏色
  • <img> 引用帶 alpha 通道的影象

它們使用相同的混合函式,叫做 α 混合簡單 α 複合

C=B(Cb,Cs)=Cs×αs+Cb×αb×(1αs)=Cs×αs+Cb×(1αs)

αs 是前景透明度,αb 是背景透明度,上面的式子計算混合後的 r、g、b 顏色,混合後的透明度 αo 由公式 αo=αs+αb×(1αs) 給出。很多時候背景不透明,即 αb 是 1,上面把 1 代入了 αb

下面給上面的式子代入幾組實際值。設 Cs 是不透明紅 rgba(1, 0, 0, 1)Cb 是不透明藍 rgb(0, 0, 1),它倆混合的結果不用計算都知道仍然是不透明紅,計算過程如下,

r = 1 x 1 + 0 x (1 - 1) = 1
g = 0 x 1 + 0 x (1 - 1) = 0
b = 0 x 1 + 1 x (1 - 1) = 0

紅藍得紅,混合失敗。另外一組,Cs = rgba(1, 0, 0, 0.5)Cb = rgb(0, 0, 1),有,

r = 1 x 0.5 + 0 x (1 - 0.5) = 0.5
g = 0 x 0.5 + 0 x (1 - 0.5) = 0
b = 0 x 0.5 + 1 x (1 - 0.5) = 0.5

要想讓得到的 rgb(0.5, 0, 0.5)rgb(0, 1, 0) 的綠色混合以得到 rgb(1, 1, 1) 的白色,α 需要滿足下面的方程組,

{0.5α+0α+0(1α)=1(1α)=1={0.5α=11α=1={α=2α=0

上面的方程組無解,即無論如何設定 α 都無法通過 B 混合 rgb(0.5, 0, 0.5)rgb(0, 1, 0) 得到 rgb(1, 1, 1)

回過頭來觀察式子 Cs×αs+Cb×(1αs),可以看出結果介於 CsCb 之間。紅綠藍混合時,白色的紅色分量只能通過紅色得到,這要求紅色的 α 是 1,但 α = 1 造成背景顏色藍或者綠被忽略,而忽略任何一個分量都無法得到白色。因此這個混合函式不合適。

可行的方法

如果可以自己逐一計算畫素的顏色,得出要求的效果自然不在話下。除了自己計算外,如果存在正好能夠實現要求效果的固定函式,則呼叫該函式也可以。

在 html 中處理顏色有 3 種工具,css、svg、canvas。

css

css 有個模組叫複合與混合,這個模組定義了若干固定函式,其中一個叫 screen,它的 B

C=B(Cb,Cs)=1[(1Cb)×(1Cs)]=Cs+Cb

相關推薦

html 中用混合顏色

概要 本文通過解決一個假想的問題介紹了 css screen 混合模式,並介紹瞭如何用 svg 濾鏡、canvas 2d、canvas webgl 實現相同的效果。 問題 下面的圖片演示三種顏色光疊加的效果,請在 html 中實現這種效果。

資料結構__不含括號的減乘除混合運算

這個程式我一共寫了5個檔案,4個是標頭檔案,最後1個則是main函式的cpp檔案。 第一個檔名為head.h 用於包含一些基本的標頭檔案,如下所示: #pragma once #include<iostream> #include<stdlib.h> #inclu

混合顏色值計算公式

之前為了實現不同顏色液體混合的顏色變化效果,推敲得出一個計算公式。 兩種顏色混合後,混色的色值計算,RGB分別用這個公式計算:顏色A-(顏色A-顏色B)*(1-顏色A的百分比) 例如:綠和白混合,綠(192, 229, 112)70%,白(255, 255, 255)30%

HTML中用js獲取通過GET、POST方法(就是在網址後?a=b&c=d之類)傳過來的表單值

<script type="text/javascript">    //獲取指定form中的所有的<input>物件    function getElements(formId) {        var form = document.

html中用href 實現點擊鏈接彈出文件下載對話框

就會 鏈接 pre html 支持 body 能夠 自帶 圖片 瀏覽器支持能夠打開的格式,他都會默認直接在線打開(比如word或圖片),不支持的格式,他就會彈出下載提示。最好是做成.rar格式、xlsx的文件。瀏覽器自帶下載功能。 <body> <

html頁面載流程

使用 避免 doc 最好 時間 dom type css 下載 瀏覽器加載和渲染html的順序 1. IE下載的順序是從上到下,渲染(就是把請求的內容顯示到瀏覽器屏幕上)的順序也是從上到下,下載和渲染是同時進行的。 2. 在渲染到頁面的某一部分時,其上面的所有部分都已經下載

HTML樣式三種辦法

標題 charset html pac set wid lan document dev 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U

Html.EditorFor htmlAttributes

htm col hat html new font pan span ever @Html.EditorFor(m => m.Name, new { htmlAttributes = new { @required = "true", @anotherAttribut

HTML頁面載和解析流程

有一個 scrip isp epic api 需要 解析 pla script <link href="/Content/css/plugins/jqgrid/ui.jqgrid.css" rel="stylesheet" /><script src="~

兩種方法實現在HTML頁面載完畢後運行某個js

功能性 下載 事件 兩種 一點 方法 實現 代碼 寬度 js方法: <script type="text/javascript"> window.onload=function(){ var userName="xiaoming"; alert(user

JavaScript Html頁面載完成三種寫法

window blue log script onload document htm scrip javascrip //一、Html頁面加載完成的JS寫法 //1. $(function () { alert("窗體Html頁面加載完成方法一"); }); /

vue打包空白,圖片沒載,背景顏色沒有渲染出來-配置秘訣

run config util CP ack round .com 開發 sets 找到config文件夾下的index.js文件修改一下位置 看清楚是 build(上邊還有個dev 是開發環境下的配置,不需要改動)下的 assetsPublicPath :將‘/’改為‘

CSS單位分析及CSS顏色表示顏色表(調色板)

不錯 設置字體大小 靈活 希望 這樣的 字體 使用 columns 分辨 CSS單位主要分析em、rem、fr這三個較難理解的單位吧,平常的px、%、cm那些就不談了嘛。 px在不同場景之下為同樣的值,我們把它稱作絕對單位,而em和rem受外部因素的影響下而改變,因此稱作相

CSS顏色表示顏色

ima image bubuko 簡寫 alt http 顏色 表示法 src 顏色表示法: 1、顏色名表示,比如:red 紅色,gold 金色 2、rgb表示,比如:rgb(255,0,0)表示紅色 3、16進制數值表示,比如:#ff0000 表示紅色,這種可以簡寫

基於RGB差值顏色分割

主要思想來自顏色分類論文《Goal Evaluation of Segmentation Algorithms for Traffic Sign Recognition》 RGB空間是通常的初始的空間,如果簡單的分割過程是其目的,使用RGB空間是比較好的選擇。然而,三個顏色之間的高相關性元件和光

html中用js代替${pagecontext.request.getcontextpath}

在html中用js代替${pagecontext.request.getcontextpath}這樣就不用使用jsp了   var pathArray = window.location.pathname.split('/');   var secondL

BootStrap-CSS樣式_排版_強調(斜體粗對齊顏色)

<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" c

html中用css定義div的邊框樣式

我們都知道html中div定義的是一個塊,有時候我們需要給這個塊增加一些邊框來達到我們所需要的要求。 1.如何定義邊框 如下所示我用css定義了這個邊框的屬性 <style> .c{ width:100px; height:100px; bor

『最小生成樹』Kruskal演算法—— (並查集優化 + C++語言編寫 + 例題)

『演算法原理』          在一個連通網的所有生成樹中,各邊的代價之和最小的那顆生成樹稱為該連通網的最小代價生成樹(Minimum Cost Spanning Tree),簡稱最小生成樹(MST)。         Kruskal演算法之所以叫加邊法,就是因為其本質

光與的故事--顏色模型淺析

光與色的故事                ---顏色模型淺析 1.光的故事        光是一種電磁波,同聲波相類似,包含了不同頻率分量。不同的是,電磁波能夠在真空中傳播。電磁波通常是由一種頻率或多種頻率構成。比如非常高頻率的電磁波構成了微波;非常低頻率的構成了無線