【问题标题】:HTML5 Canvas contrast filterHTML5 Canvas 对比过滤器
【发布时间】:2012-06-22 23:59:33
【问题描述】:

如何使用 HTML5 Canvas 像素操作功能调整图像的对比度?我已经很容易成功地改变了图像的亮度,但对比度似乎有点复杂。

有谁知道我可以遵循的算法,或者我可以从中获取想法的示例 javascript 代码?

提前感谢有关此问题的任何帮助。

【问题讨论】:

    标签: javascript html canvas filter contrast


    【解决方案1】:

    我将发布所有过滤器的演示。 您可以通过 id 或 class 在画布上轻松使用它。 但问题是你不能用画布渲染它意味着你不保存或预览。因为canvas不能渲染样式。

    代码

    <!-- canvas -->
    <html>
    <head>
    <style>
    img {
        width: 33%;
        height: auto;
        float: left;
    }
    .origional {filter:none;}
    .blur {-webkit-filter: blur(4px);filter: blur(4px);}
    .brightness {-webkit-filter: brightness(0.30);filter: brightness(0.30);}
    .contrast {-webkit-filter: contrast(180%);filter: contrast(180%);}
    .grayscale {-webkit-filter: grayscale(100%);filter: grayscale(100%);}
    .huerotate {-webkit-filter: hue-rotate(180deg);filter: hue-rotate(180deg);}
    .invert {-webkit-filter: invert(100%);filter: invert(100%);}
    .opacity {-webkit-filter: opacity(50%);filter: opacity(50%);}
    .saturate {-webkit-filter: saturate(7); filter: saturate(7);}
    .sepia {-webkit-filter: sepia(100%);filter: sepia(100%);}
    .shadow {-webkit-filter: drop-shadow(8px 8px 10px green);filter: drop-shadow(8px 8px 10px green);}
    </style>
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js" type="text/javascript"></script>
    <script>
    $( document ).ready(function() {
    //origional canvas image
        var canvas = document.getElementById("canvas");
        var ctx = canvas.getContext("2d");
        var img = document.getElementById("origional");
       ctx.drawImage(img, 0, 0,300,300);
    
       $('#button').click(function() {
        canvas.classList.add("origional");
        canvas.classList.remove("blur");
        canvas.classList.remove("brightness");
        canvas.classList.remove("contrast");
        canvas.classList.remove("grayscale");
        canvas.classList.remove("huerotate");
        canvas.classList.remove("invert");
        canvas.classList.remove("opacity");
        canvas.classList.remove("saturate");
        canvas.classList.remove("sepia");
        canvas.classList.remove("shadow");
    });
    
       $('#button1').click(function() {
        canvas.classList.add("blur");
        canvas.classList.remove("origional");
        canvas.classList.remove("brightness");
        canvas.classList.remove("contrast");
        canvas.classList.remove("grayscale");
        canvas.classList.remove("huerotate");
        canvas.classList.remove("invert");
        canvas.classList.remove("opacity");
        canvas.classList.remove("saturate");
        canvas.classList.remove("sepia");
        canvas.classList.remove("shadow");
    });
    
       $('#button2').click(function() {
        canvas.classList.add("brightness");
        canvas.classList.remove("blur");
        canvas.classList.remove("origional");
        canvas.classList.remove("contrast");
        canvas.classList.remove("grayscale");
        canvas.classList.remove("huerotate");
        canvas.classList.remove("invert");
        canvas.classList.remove("opacity");
        canvas.classList.remove("saturate");
        canvas.classList.remove("sepia");
        canvas.classList.remove("shadow");
    });
       $('#button3').click(function() {
        canvas.classList.add("contrast");
        canvas.classList.remove("blur");
        canvas.classList.remove("brightness");
        canvas.classList.remove("origional");
        canvas.classList.remove("grayscale");
        canvas.classList.remove("huerotate");
        canvas.classList.remove("invert");
        canvas.classList.remove("opacity");
        canvas.classList.remove("saturate");
        canvas.classList.remove("sepia");
        canvas.classList.remove("shadow");
    });
       $('#button4').click(function() {
        canvas.classList.add("grayscale");
        canvas.classList.remove("blur");
        canvas.classList.remove("brightness");
        canvas.classList.remove("contrast");
        canvas.classList.remove("origional");
        canvas.classList.remove("huerotate");
        canvas.classList.remove("invert");
        canvas.classList.remove("opacity");
        canvas.classList.remove("saturate");
        canvas.classList.remove("sepia");
        canvas.classList.remove("shadow");
    });
       $('#button5').click(function() {
        canvas.classList.add("huerotate");
        canvas.classList.remove("blur");
        canvas.classList.remove("brightness");
        canvas.classList.remove("contrast");
        canvas.classList.remove("grayscale");
        canvas.classList.remove("origional");
        canvas.classList.remove("invert");
        canvas.classList.remove("opacity");
        canvas.classList.remove("saturate");
        canvas.classList.remove("sepia");
        canvas.classList.remove("shadow");
    });
       $('#button6').click(function() {
        canvas.classList.add("invert");
        canvas.classList.remove("blur");
        canvas.classList.remove("brightness");
        canvas.classList.remove("contrast");
        canvas.classList.remove("grayscale");
        canvas.classList.remove("huerotate");
        canvas.classList.remove("origional");
        canvas.classList.remove("opacity");
        canvas.classList.remove("saturate");
        canvas.classList.remove("sepia");
        canvas.classList.remove("shadow");
    });
       $('#button7').click(function() {
        canvas.classList.add("opacity");
        canvas.classList.remove("blur");
        canvas.classList.remove("brightness");
        canvas.classList.remove("contrast");
        canvas.classList.remove("grayscale");
        canvas.classList.remove("huerotate");
        canvas.classList.remove("invert");
        canvas.classList.remove("origional");
        canvas.classList.remove("saturate");
        canvas.classList.remove("sepia");
        canvas.classList.remove("shadow");
    });
       $('#button8').click(function() {
        canvas.classList.add("saturate");
        canvas.classList.remove("blur");
        canvas.classList.remove("brightness");
        canvas.classList.remove("contrast");
        canvas.classList.remove("grayscale");
        canvas.classList.remove("huerotate");
        canvas.classList.remove("invert");
        canvas.classList.remove("opacity");
        canvas.classList.remove("origional");
        canvas.classList.remove("sepia");
        canvas.classList.remove("shadow");
    });
       $('#button9').click(function() {
        canvas.classList.add("sapia");
        canvas.classList.remove("blur");
        canvas.classList.remove("brightness");
        canvas.classList.remove("contrast");
        canvas.classList.remove("grayscale");
        canvas.classList.remove("huerotate");
        canvas.classList.remove("invert");
        canvas.classList.remove("opacity");
        canvas.classList.remove("saturate");
        canvas.classList.remove("origional");
        canvas.classList.remove("shadow");
    });
       $('#button10').click(function() {
        canvas.classList.add("shadow");
        canvas.classList.remove("blur");
        canvas.classList.remove("brightness");
        canvas.classList.remove("contrast");
        canvas.classList.remove("grayscale");
        canvas.classList.remove("huerotate");
        canvas.classList.remove("invert");
        canvas.classList.remove("opacity");
        canvas.classList.remove("saturate");
        canvas.classList.remove("sepia");
        canvas.classList.remove("origional");
    });
    });
    </script>
    </head>
    <body>
    <h1>
    canvas
    </h1>
    <canvas id="canvas" width="300" height="300" ></canvas>
    <br>
    <div ><input type="button" id="button" value="origional" />
    <input type="button" id="button1" value="blur" />
    <input type="button" id="button2" value="brightness" /> 
    <input type="button" id="button3" value="contrast" /> 
    <input type="button" id="button4" value="grayscale" /> 
    <input type="button" id="button5" value="huerotate" /> 
    <input type="button" id="button6" value="invert" /> 
    <input type="button" id="button7" value="opacity" /> 
    <input type="button" id="button8" value="saturate" /> 
    <input type="button" id="button9" value="sepia" /> 
    <input type="button" id="button10" value="shadow" />  
    </div>
    <br>
    <!-- image -->
    <h1>
    image
    </h1>
    <img id="origional" src="https://lh5.googleusercontent.com/-bSF6HLBpWZU/AAAAAAAAAAI/AAAAAAAAABI/6UVYOKY6QhE/photo.jpg" alt="Pineapple" width="300" height="300">
    <img id="blur" class="blur" src="https://lh5.googleusercontent.com/-bSF6HLBpWZU/AAAAAAAAAAI/AAAAAAAAABI/6UVYOKY6QhE/photo.jpg" alt="Pineapple" width="300" height="300">
    <img class="brightness" src="https://lh5.googleusercontent.com/-bSF6HLBpWZU/AAAAAAAAAAI/AAAAAAAAABI/6UVYOKY6QhE/photo.jpg" alt="Pineapple" width="300" height="300">
    <img class="contrast" src="https://lh5.googleusercontent.com/-bSF6HLBpWZU/AAAAAAAAAAI/AAAAAAAAABI/6UVYOKY6QhE/photo.jpg" alt="Pineapple" width="300" height="300">
    <img class="grayscale" src="https://lh5.googleusercontent.com/-bSF6HLBpWZU/AAAAAAAAAAI/AAAAAAAAABI/6UVYOKY6QhE/photo.jpg" alt="Pineapple" width="300" height="300">
    <img class="huerotate" src="https://lh5.googleusercontent.com/-bSF6HLBpWZU/AAAAAAAAAAI/AAAAAAAAABI/6UVYOKY6QhE/photo.jpg" alt="Pineapple" width="300" height="300">
    <img class="invert" src="https://lh5.googleusercontent.com/-bSF6HLBpWZU/AAAAAAAAAAI/AAAAAAAAABI/6UVYOKY6QhE/photo.jpg" alt="Pineapple" width="300" height="300">
    <img class="opacity" src="https://lh5.googleusercontent.com/-bSF6HLBpWZU/AAAAAAAAAAI/AAAAAAAAABI/6UVYOKY6QhE/photo.jpg" alt="Pineapple" width="300" height="300">
    <img class="saturate" src="https://lh5.googleusercontent.com/-bSF6HLBpWZU/AAAAAAAAAAI/AAAAAAAAABI/6UVYOKY6QhE/photo.jpg" alt="Pineapple" width="300" height="300">
    <img class="sepia" src="https://lh5.googleusercontent.com/-bSF6HLBpWZU/AAAAAAAAAAI/AAAAAAAAABI/6UVYOKY6QhE/photo.jpg" alt="Pineapple" width="300" height="300">
    <img class="shadow" src="https://lh5.googleusercontent.com/-bSF6HLBpWZU/AAAAAAAAAAI/AAAAAAAAABI/6UVYOKY6QhE/photo.jpg" alt="Pineapple" width="300" height="300">
    </body>
    </html>
    

    这里Live Demo

    【讨论】:

      【解决方案2】:

      既然你说你已经调整了亮度,听起来你只需要调整对比度的算法这里是一个 C# 方法的线程(查看更新 2),代码的逻辑是合理的,并且可以在任何程序:

      Adjust the contrast of an image in C# efficiently - Stack Overflow

      【讨论】:

      • 谢谢,我设法用 javascript 重写了它,它使用 -100 到 100 范围的滑块完美地工作。
      • 谢谢!我也用 JS 重写了,供我使用!
      【解决方案3】:

      查看Pixastic 提供了大量出色的效果,您可以使用示例Editor 来查看其中的一些功能。 Pixastic brightness/contrast example

      这是我制作的对比鲜明的马里奥的演示。

      Live Demo

      如果您不想使用整个库,还可以查看 pixastic github source code for the contrast method 了解如何将其实施到您的代码中。

      【讨论】:

      • 我必须说这是一个非常好的插件,但我发现@TheZ 建议的那个更容易理解。无论如何,我肯定会在另一个项目中使用它,所以非常感谢你的建议!
      • 这确实是一个很棒的插件...直到您将许多事件处理程序绑定到同一个 Canvas!试试看!
      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 2012-08-09
      • 2014-02-10
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多