溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

JavaScript實(shí)現(xiàn)Ps濾鏡效果的方法

發(fā)布時(shí)間:2020-10-16 15:48:24 來(lái)源:億速云 閱讀:261 作者:小新 欄目:web開(kāi)發(fā)

這篇文章主要介紹了JavaScript實(shí)現(xiàn)Ps濾鏡效果的方法,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

效果預(yù)覽

JavaScript實(shí)現(xiàn)Ps濾鏡效果的方法

思路

其實(shí)非常非常趕單~
CSS3多了一個(gè)filter的屬性,非常強(qiáng)大(兼容性一般)!
我們只要根據(jù)輸入的值/滑塊滑動(dòng)的值來(lái)動(dòng)態(tài)更改css中filter屬性的值即可

filter

  • none    默認(rèn)值,沒(méi)有效果。
  • blur(px)    給圖像設(shè)置高斯模糊。"radius"一值設(shè)定高斯函數(shù)的標(biāo)準(zhǔn)差,或者是屏幕上以多少像素融在一起, 所以值越大越模糊;不接受百分比值。
  • brightness(%)    給圖片應(yīng)用一種線(xiàn)性乘法,使其看起來(lái)更亮或更暗。如果值是0%,圖像會(huì)全黑。值是100%,則圖像無(wú)變化。其他的值對(duì)應(yīng)線(xiàn)性乘數(shù)效果。值超過(guò)100%也是可以的,圖像會(huì)比原來(lái)更亮。如果沒(méi)有設(shè)定值,默認(rèn)是1。
  • contrast(%)    調(diào)整圖像的對(duì)比度。值是0%的話(huà),圖像會(huì)全黑。值是100%,圖像不變。值可以超過(guò)100%,意味著會(huì)運(yùn)用更低的對(duì)比。若沒(méi)有設(shè)置值,默認(rèn)是1。
  • drop-shadow(h-shadow v-shadow blur spread color)    給圖像設(shè)置一個(gè)陰影效果。陰影是合成在圖像下面,可以有模糊度的,可以以特定顏色畫(huà)出的遮罩圖的偏移版本。 函數(shù)接受<shadow>(在CSS3背景中定義)類(lèi)型的值,除了"inset"關(guān)鍵字是不允許的。該函數(shù)與已有的box-shadow box-shadow屬性很相似;不同之處在于,通過(guò)濾鏡,一些瀏覽器為了更好的性能會(huì)提供硬件加速
  • grayscale(%)    將圖像轉(zhuǎn)換為灰度圖像。值定義轉(zhuǎn)換的比例。值為100%則完全轉(zhuǎn)為灰度圖像,值為0%圖像無(wú)變化。值在0%到100%之間,則是效果的線(xiàn)性乘子。若未設(shè)置,值默認(rèn)是0;
  • hue-rotate(deg)    圖像應(yīng)用色相旋轉(zhuǎn)。"angle"一值設(shè)定圖像會(huì)被調(diào)整的色環(huán)角度值。值為0deg,則圖像無(wú)變化。若值未設(shè)置,默認(rèn)值是0deg。該值雖然沒(méi)有最大值,超過(guò)360deg的值相當(dāng)于又繞一圈。
  • invert(%)    反轉(zhuǎn)輸入圖像。值定義轉(zhuǎn)換的比例。100%的價(jià)值是完全反轉(zhuǎn)。值為0%則圖像無(wú)變化。值在0%和100%之間,則是效果的線(xiàn)性乘子。 若值未設(shè)置,值默認(rèn)是0。
  • opacity(%)    轉(zhuǎn)化圖像的透明程度。值定義轉(zhuǎn)換的比例。值為0%則是完全透明,值為100%則圖像無(wú)變化。值在0%和100%之間,則是效果的線(xiàn)性乘子,也相當(dāng)于圖像樣本乘以數(shù)量。 若值未設(shè)置,值默認(rèn)是1。該函數(shù)與已有的opacity屬性很相似,不同之處在于通過(guò)filter,一些瀏覽器為了提升性能會(huì)提供硬件加速。
  • saturate(%)    轉(zhuǎn)換圖像飽和度。值定義轉(zhuǎn)換的比例。值為0%則是完全不飽和,值為100%則圖像無(wú)變化。其他值,則是效果的線(xiàn)性乘子。超過(guò)100%的值是允許的,則有更高的飽和度。 若值未設(shè)置,值默認(rèn)是1。
  • sepia(%)     將圖像轉(zhuǎn)換為深褐色。值定義轉(zhuǎn)換的比例。值為100%則完全是深褐色的,值為0%圖像無(wú)變化。值在0%到100%之間,則是效果的線(xiàn)性乘子。若未設(shè)置,值默認(rèn)是0;
  • url() URL函數(shù)接受一個(gè)XML文件,該文件設(shè)置了 一個(gè)SVG濾鏡,且可以包含一個(gè)錨點(diǎn)來(lái)指定一個(gè)具體的濾鏡元素。

使用直接就這樣

img {
    -webkit-filter: contrast(200%); /* Chrome, Safari, Opera */
    filter: contrast(200%) opacity(0.5) //要多少屬性加多少;
}

開(kāi)始操作

  • 寫(xiě)一個(gè)過(guò)濾屬性滑塊和輸入框,互相綁定值,如果用vue就簡(jiǎn)單了hhh
//html
     <li>
      <label for="contrast">對(duì)比度(0-200):</label>
      <input id="contrast" max="200" min="0" step="1" type="range">
      <input id="contrast-val" class="val-box" type="number">
    </li>
//js
//注冊(cè)過(guò)濾器
function filter(type) {
  //獲取濾鏡類(lèi)型關(guān)聯(lián)的dom節(jié)點(diǎn)
  //綁定change事件,還有回車(chē)按鍵事件
  
  let ele = document.getElementById(type);
  let ele_val = document.getElementById(type + '-val');

  //輸入框輸入值按下回車(chē),把值更新到滑塊上
  ele_val.addEventListener('keyup',function(e){
    if(e.keyCode == 13){
    ele.value = ele_val.value;
    //同時(shí)更新濾鏡效果
    setCss(type, ele_val.value);

    }
  })
   
 //滑塊滑動(dòng)的時(shí)候,把值更新在右邊的輸入框中
  ele.addEventListener('change', function() {
    ele_val.value = ele.value;
    //同時(shí)更新濾鏡效果
    setCss(type, ele_val.value);
  });
}
  • 寫(xiě)一個(gè)文件選擇,預(yù)覽圖片
//html
<input id="file" type="file" accept="image/*">
<!-- 圖片預(yù)覽框 -->
<p>
    <img id="img" src="" alt="">
</p>
//選擇文件
function fileSelect() {
  let img = document.getElementById('img');
  document.getElementById('file').onchange = function() {
    var reader = new FileReader();
    reader.onload = function(e) {
      img.src = e.target.result;
    }
    reader.readAsDataURL(this.files[0]);
  }
}
  • 寫(xiě)一個(gè)根據(jù)輸入值更新CSS的方法
//更新css屬性
function setCss(type, val) {
  let img = document.getElementById('img');
  //已經(jīng)存在某個(gè)濾鏡,更改濾鏡數(shù)值
  if (img.style.filter.indexOf(type) > -1) {
    //利用正則則出濾鏡名稱(chēng)更改其值
    let reg = new RegExp("(?<=" + type + ")" + "\\(.*\\)", "g")
    img.style.filter = img.style.filter.replace(reg, function(match) { return `(${val/100})` });
  } else {
    //直接添加新濾鏡
    img.style.filter += `${type}(${val/100})`
  }
}

注意

由于這個(gè)demo只是隨便寫(xiě)寫(xiě),只是前幾天用到這個(gè)filter屬性感覺(jué)有點(diǎn)厲害,就拿來(lái)玩玩,文中的代碼寫(xiě)得很丑,也沒(méi)什么規(guī)范,只適用于‘寫(xiě)來(lái)玩玩’的范疇,一些輸入驗(yàn)證,節(jié)流,參數(shù)的規(guī)范都沒(méi)有做,見(jiàn)諒。
本來(lái)還打算做一個(gè)導(dǎo)出使用濾鏡后的照片的,用的html2canvas來(lái)截圖導(dǎo)出,然后發(fā)現(xiàn),它不支持?。?!不支持這個(gè)css屬性!!截出來(lái)的圖是原圖!這可是真的難受啊馬飛,現(xiàn)在還沒(méi)有解決方案,如果有大佬知道如何保存使用濾鏡后的圖片到本地的,請(qǐng)?jiān)谠u(píng)論區(qū)留下您的想法,非常感謝!

辣雞源碼

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>photoshop-web</title>
</head>

<body>
  <ul>
    <li>
      <label for="brightness">亮度(0-200):</label>
      <input id="brightness" max="200" min="0" step="1" type="range">
      <input id="brightness-val" class="val-box" type="number">
    </li>
    <li>
      <label for="contrast">對(duì)比度(0-200):</label>
      <input id="contrast" max="200" min="0" step="1" type="range">
      <input id="contrast-val" class="val-box" type="number">
    </li>
    <li>
      <label for="grayscale">灰度(0-100):</label>
      <input id="grayscale" max="100" min="0" step="1" type="range">
      <input id="grayscale-val" class="val-box" type="number">
    </li>
    <li>
      <label for="saturate">飽和度(0-200):</label>
      <input id="saturate" max="200" min="0" step="1" type="range">
      <input id="saturate-val" class="val-box" type="number">
    </li>
    <li>
      <label for="opacity">透明度(0-100):</label>
      <input id="opacity" max="100" min="0" step="1" type="range">
      <input id="opacity-val" class="val-box" type="number">
    </li>
    <li>
      <label for="invert">反相(0-100):</label>
      <input id="invert" max="100" min="0" step="1" type="range">
      <input id="invert-val" class="val-box" type="number">
    </li>
  </ul>
  <button id="reset">重置效果</button>
  <input id="file" type="file" accept="image/*">
  <p>
    <img id="img" src="" alt="">
  </p>
</body>
<script>
//選擇文件
function fileSelect() {
  let img = document.getElementById('img');
  document.getElementById('file').onchange = function() {
    var reader = new FileReader();
    reader.onload = function(e) {
      img.src = e.target.result;
    }
    reader.readAsDataURL(this.files[0]);
  }
}
//重置效果
function reset() {
  let reset_btn = document.getElementById('reset');
  let val_boxes = document.getElementsByClassName('val-box');
  let val_arr = Array.prototype.slice.call(val_boxes);
  let img = document.getElementById('img');

  reset_btn.addEventListener('click', function() {
    //所有的數(shù)據(jù)輸入重置為空
    val_arr.forEach(function(item) {
      item.value = "";
    });
    //去掉圖片的css屬性
    img.style.filter = "";
  })
}
//注冊(cè)過(guò)濾器
function filter(type) {
  //獲取濾鏡類(lèi)型關(guān)聯(lián)的dom節(jié)點(diǎn)
  //綁定change事件
  //更改右側(cè)輸入框的顯示的值,以及更新濾鏡效果
  let ele = document.getElementById(type);
  let ele_val = document.getElementById(type + '-val');
  ele_val.addEventListener('keyup',function(e){
    if(e.keyCode == 13){
    ele.value = ele_val.value;
    setCss(type, ele_val.value);

    }
  })
  ele.addEventListener('change', function() {
    ele_val.value = ele.value;
    setCss(type, ele_val.value);
  });
}
//更新css屬性
function setCss(type, val) {
  let img = document.getElementById('img');
  //已經(jīng)存在某個(gè)濾鏡,更改濾鏡數(shù)值
  if (img.style.filter.indexOf(type) > -1) {
    let reg = new RegExp("(?<=" + type + ")" + "\\(.*\\)", "g")
    img.style.filter = img.style.filter.replace(reg, function(match) { return `(${val/100})` });
  } else {
    //直接添加新濾鏡
    img.style.filter += `${type}(${val/100})`
  }
}
window.onload = function() {
  //亮度
  filter('brightness');
  //對(duì)比度
  filter('contrast');
  //灰度
  filter('grayscale');
  //飽和度
  filter('saturate');
  //透明度
  filter('opacity');
  //反相  
  filter('invert');
  //注冊(cè)重置
  reset();
  //注冊(cè)文件選擇
  fileSelect();
}
</script>

</html>

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享JavaScript實(shí)現(xiàn)Ps濾鏡效果的方法內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問(wèn)題就找億速云,詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI