Выбор цвета на изображении с помощью HTML5 Canvas
Создание приложений с использованием canvas — это новая возможность HTML5, которая поддерживается современными браузерами. С помощью canvas можно создавать даже игры.
В этом уроке мы будем использовать элемент canvas для создания простого приложения, которое будет определять цвет точки на картинке.
HTML
Разметка для нашего примера очень проста: все, что нам понадобится — это элемент canvas и пара полей для показа цвета пикселя в форматах RGB и HEX:
<canvas width="600" height="440" id="canvas_picker"></canvas> <div id="hex">HEX: <input type="text"></input></div> <div id="rgb">RGB: <input type="text"></input></div>
Так как мы используем background изображение для нашей палитры, атрибуты width height элемента canvas будут соответственно равны ширине и высоте изображения.
Так же необходимо подключить к странице jQuery, так как мы будем его использовать дальше.
JavaScript
Первое, что нам надо сделать — получить элемент canvas:
var canvas = document.getElementById('canvas_picker').getContext('2d');
Теперь мы можем нарисовать изображение в canvas. Для этого создадим объект Image и в качестве источника укажем нужное изображение. Когда изображение загрузится, мы сможем нарисовать его:
var img = new Image();
img.src = 'image.jpg';
$(img).load(function(){
canvas.drawImage(img,0,0);
});
Сейчас все готово для того, чтобы определить поведение при нажатии на изображение. Сначала необходимо определить положение курсора в момент нажатия:
$('#canvas_picker').click(function(event){
var x = event.pageX - this.offsetLeft;
var y = event.pageY - this.offsetTop;
Этот код определяет координаты нажатия на изображение, учитывая при этом положение canvas.
Следующий шаг — получение RGB значений в точке нажатия. Для этого мы используем функцию getImageData, передавая в нее координаты пикселя:
var imgData = canvas.getImageData(x, y, 1, 1).data; var R = imgData[0]; var G = imgData[1]; var B = imgData[2];
Имея значения в переменных R, G и B, мы можем показать их в соответствующих полях. Для RGB формата:
var rgb = R + ',' + G + ',' + B;
$('#rgb input').val(rgb);
});
Для перевода RGB в шестнадцатеричный формат будем использовать следующую функцию:
function rgbToHex(R,G,B) {return toHex(R)+toHex(G)+toHex(B)}
function toHex(n) {
n = parseInt(n,10);
if (isNaN(n)) return "00";
n = Math.max(0,Math.min(n,255));return "0123456789ABCDEF".charAt((n-n%16)/16) + "0123456789ABCDEF".charAt(n%16);
}
Теперь покажем цвет в шестнадцатеричном формате:
var hex = rgbToHex(R,G,B);
$('#hex input').val('#' + hex);
Полный код
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Colorpicker demo</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
</head>
<body>
<canvas width="600" height="440" id="canvas_picker"></canvas>
<div id="hex">HEX: <input type="text"></input></div>
<div id="rgb">RGB: <input type="text"></input></div>
<script type="text/javascript">
var canvas = document.getElementById('canvas_picker').getContext('2d');
// создание изображения
var img = new Image();
img.src = 'image.jpg';
// копируем изображение в canvas
$(img).load(function(){
canvas.drawImage(img,0,0);
});
function rgbToHex(R,G,B) {return toHex(R)+toHex(G)+toHex(B)}
function toHex(n) {
n = parseInt(n,10);
if (isNaN(n)) return "00";
n = Math.max(0,Math.min(n,255));
return "0123456789ABCDEF".charAt((n-n%16)/16) + "0123456789ABCDEF".charAt(n%16);
}
$('#canvas_picker').click(function(event){
// получение координат
var x = event.pageX - this.offsetLeft;
var y = event.pageY - this.offsetTop;
// получение цвета пикселя
var img_data = canvas.getImageData(x, y, 1, 1).data;
var R = img_data[0];
var G = img_data[1];
var B = img_data[2]; var rgb = R + ',' + G + ',' + B;
// конвертируем из RGB в HEX
var hex = rgbToHex(R,G,B);
// показываем значения
$('#rgb input').val(rgb);
$('#hex input').val('#' + hex);
});
</script>
</body>
</html>
Готово!








Можно ли вместо jpg, подставить div элемент? Что бы скрипт отображал цвет background’a?