Контрастный фильтр HTML5 Canvas

Как я могу настроить контрастность изображения, используя возможности манипулирования пикселями HTML5 Canvas? Мне уже удалось довольно легко изменить яркость изображения, но контраст кажется немного более сложным.

Кто-нибудь знает алгоритм, которому я могу следовать, или, возможно, пример кода javascript, из которого я мог бы взять идеи?

заранее спасибо за любую помощь по этому вопросу.


person mfreitas    schedule 20.06.2012    source источник


Ответы (3)


Поскольку вы сказали, что уже настроили яркость, и похоже, что все, что вам нужно, это алгоритм настройки контрастности, вот поток для метода С# (см. Обновление 2), логика кода звучит и будет работать в любой программе:

Эффективная настройка контрастности изображения в C# - c# - CodeRoad

person TheZ    schedule 20.06.2012
comment
Спасибо, мне удалось переписать его на javascript, и он отлично работал, используя ползунок диапазона от -100 до 100. - person mfreitas; 21.06.2012
comment
Спасибо! Я тоже переписал его на JS для себя! - person Rutwick Gangurde; 31.12.2012

выложу демо в котором все фильтруют. вы можете легко использовать это на холсте по идентификатору или классу. но проблема в том, что вы не можете визуализировать это с помощью холста, это означает, что вы не сохраняете это или не просматриваете. Потому что холст не может отображать стиль.

код

<!-- 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>

Здесь демонстрация в реальном времени

person Dinesh Gurjar    schedule 27.03.2017

Посмотрите Pixastic предлагает массу отличных эффектов, вы можете поиграть с образцом Editor, чтобы увидеть некоторые возможности. Пример яркости/контраста Pixastic

Вот демонстрация контрастного Марио, которую я сделал на скорую руку.

Текущая демонстрация

также проверьте pixastic исходный код github для контрастного метода для идеи о том, как это работает для реализации в вашем коде, если вы не хотите использовать всю библиотеку.

person Loktar    schedule 20.06.2012
comment
Должен сказать, это действительно хороший плагин, но я обнаружил, что тот, который предложил @TheZ, намного проще для понимания. В любом случае, я обязательно использую его в другом проекте, так что большое спасибо за предложение! - person mfreitas; 21.06.2012
comment
Это действительно отличный плагин... до тех пор, пока вы не привяжете множество обработчиков событий к одному и тому же Canvas! Попробуй! - person Rutwick Gangurde; 31.12.2012