JavaScript写一个简朴的Ps滤镜结果

结果预览

《JavaScript写一个简朴的Ps滤镜结果》

思绪

实在异常异常赶单~
CSS3多了一个filter的属性,异常壮大(兼容性平常)!
我们只需依据输入的值/滑块滑动的值来动态变动css中filter属性的值即可

filter

  • none 默许值,没有结果。
  • blur(px) 给图象设置高斯隐约。”radius”一值设定高斯函数的标准差,或者是屏幕上以若干像素融在一起, 所以值越大越隐约;不接收百分比值。
  • brightness(%) 给图片应用一种线性乘法,使其看起来更亮或更暗。假如值是0%,图象会全黑。值是100%,则图象无变化。其他的值对应线性乘数结果。值凌驾100%也是能够的,图象会比原本更亮。假如没有设定值,默许是1。
  • contrast(%) 调解图象的对照度。值是0%的话,图象会全黑。值是100%,图象稳定。值能够凌驾100%,意味着会应用更低的对照。若没有设置值,默许是1。
  • drop-shadow(h-shadow v-shadow blur spread color) 给图象设置一个暗影结果。暗影是合成在图象下面,能够有隐约度的,能够以特定色彩画出的遮罩图的偏移版本。 函数接收<shadow>(在CSS3背景中定义)范例的值,除了”inset”关键字是不许可的。该函数与已有的box-shadow box-shadow属性很类似;不同之处在于,经由过程滤镜,一些浏览器为了更好的机能会供应硬件加速
  • grayscale(%) 将图象转换为灰度图象。值定义转换的比例。值为100%则完整转为灰度图象,值为0%图象无变化。值在0%到100%之间,则是结果的线性乘子。若未设置,值默许是0;
  • hue-rotate(deg) 图象应用色相扭转。”angle”一值设定图象会被调解的色环角度值。值为0deg,则图象无变化。若值未设置,默许值是0deg。该值虽然没有最大值,凌驾360deg的值相当于又绕一圈。
  • invert(%) 反转输入图象。值定义转换的比例。100%的代价是完整反转。值为0%则图象无变化。值在0%和100%之间,则是结果的线性乘子。 若值未设置,值默许是0。
  • opacity(%) 转化图象的通明水平。值定义转换的比例。值为0%则是完整通明,值为100%则图象无变化。值在0%和100%之间,则是结果的线性乘子,也相当于图象样本乘以数目。 若值未设置,值默许是1。该函数与已有的opacity属性很类似,不同之处在于经由过程filter,一些浏览器为了提拔机能会供应硬件加速。
  • saturate(%) 转换图象饱和度。值定义转换的比例。值为0%则是完整不饱和,值为100%则图象无变化。其他值,则是结果的线性乘子。凌驾100%的值是许可的,则有更高的饱和度。 若值未设置,值默许是1。
  • sepia(%) 将图象转换为深褐色。值定义转换的比例。值为100%则完整是深褐色的,值为0%图象无变化。值在0%到100%之间,则是结果的线性乘子。若未设置,值默许是0;
  • url() URL函数接收一个XML文件,该文件设置了 一个SVG滤镜,且能够包括一个锚点来指定一个详细的滤镜元素。

运用直接就这样

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

最先操纵

  • 写一个过滤属性滑块和输入框,相互绑定值,假如用vue就简朴了hhh
//html
     <li>
      <label for="contrast">对照度(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
//注册过滤器
function filter(type) {
  //猎取滤镜范例关联的dom节点
  //绑定change事宜,另有回车按键事宜
  
  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);
  });
}
  • 写一个文件挑选,预览图片
//html
<input id="file" type="file" accept="image/*">
<!-- 图片预览框 -->
<div>
    <img id="img" src="" alt="">
</div>
//挑选文件
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]);
  }
}
  • 写一个依据输入值更新CSS的要领
//更新css属性
function setCss(type, val) {
  let img = document.getElementById('img');
  //已存在某个滤镜,变动滤镜数值
  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})`
  }
}

注重

  • 因为这个demo只是随意写写,只是头几天用到这个filter属性觉得有点凶猛,就拿来玩玩,文中的代码写得很丑,也没什么范例,只适用于‘写来玩玩’的领域,一些输入考证,撙节,参数的范例都没有做,包涵。
  • 原本还盘算做一个导出运用滤镜后的照片的,用的html2canvas来截图导出,然后发明,它不支撑!!!不支撑这个css属性!!截出来的图是原图!这但是真的难熬痛苦啊马飞,如今还没有解决方案,假如有大佬晓得怎样保留运用滤镜后的图片到当地的,请在批评区留下您的主意,异常感谢!

辣鸡源码

<!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">对照度(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/*">
  <div>
    <img id="img" src="" alt="">
  </div>
</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() {
    //一切的数据输入重置为空
    val_arr.forEach(function(item) {
      item.value = "";
    });
    //去掉图片的css属性
    img.style.filter = "";
  })
}
//注册过滤器
function filter(type) {
  //猎取滤镜范例关联的dom节点
  //绑定change事宜
  //变动右边输入框的显现的值,以及更新滤镜结果
  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');
  //已存在某个滤镜,变动滤镜数值
  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');
  //对照度
  filter('contrast');
  //灰度
  filter('grayscale');
  //饱和度
  filter('saturate');
  //通明度
  filter('opacity');
  //反相  
  filter('invert');
  //注册重置
  reset();
  //注册文件挑选
  fileSelect();
}
</script>

</html>
    原文作者:李大雷
    原文地址: https://segmentfault.com/a/1190000018523309
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞