Получить цвет пикселя с холста, при наведении курсора мыши
это возможно, чтобы получить значение RGB пикселя под мышкой? Есть ли полный пример этого? Вот что у меня есть до сих пор:
<script>
function draw() {
var ctx = document.getElementById('canvas').getContext('2d');
var img = new Image();
img.src = 'Your URL';
img.onload = function(){
ctx.drawImage(img,0,0);
};
canvas.onmousemove = function(e) {
var mouseX, mouseY;
if(e.offsetX) {
mouseX = e.offsetX;
mouseY = e.offsetY;
}
else if(e.layerX) {
mouseX = e.layerX;
mouseY = e.layerY;
}
var c = ctx.getImageData(mouseX, mouseY, 1, 1).data;
$('#ttip').css({'left':mouseX+20, 'top':mouseY+20}).html(c[0]+'-'+c[1]+'-'+c[2]);
};
}
</script>
7 ответов:
вот полный, самодостаточный пример. Во-первых, используйте следующий HTML:
<canvas id="example" width="200" height="60"></canvas> <div id="status"></div>
соответствующий JavaScript:
// set up some sample squares var example = document.getElementById('example'); var context = example.getContext('2d'); context.fillStyle = "rgb(255,0,0)"; context.fillRect(0, 0, 50, 50); context.fillStyle = "rgb(0,0,255)"; context.fillRect(55, 0, 50, 50); $('#example').mousemove(function(e) { var pos = findPos(this); var x = e.pageX - pos.x; var y = e.pageY - pos.y; var coord = "x=" + x + ", y=" + y; var c = this.getContext('2d'); var p = c.getImageData(x, y, 1, 1).data; var hex = "#" + ("000000" + rgbToHex(p[0], p[1], p[2])).slice(-6); $('#status').html(coord + "<br>" + hex); });
приведенный выше код предполагает наличие jQuery и следующие служебные функции:
function findPos(obj) { var curleft = 0, curtop = 0; if (obj.offsetParent) { do { curleft += obj.offsetLeft; curtop += obj.offsetTop; } while (obj = obj.offsetParent); return { x: curleft, y: curtop }; } return undefined; } function rgbToHex(r, g, b) { if (r > 255 || g > 255 || b > 255) throw "Invalid color component"; return ((r << 16) | (g << 8) | b).toString(16); }
смотрите его в действии на JSFIDDLE:
Я знаю, что это старый вопрос, но вот альтернатива. Я бы сохранил эти данные изображения в массиве, а затем, при перемещении мыши по холсту:
var index = (Math.floor(y) * canvasWidth + Math.floor(x)) * 4 var r = data[index] var g = data[index + 1] var b = data[index + 2] var a = data[index + 3]
намного проще, чем она каждый раз.
объединение различных ссылок, найденных здесь в StackOverflow (включая статью выше) и на других сайтах, я сделал это с помощью javascript и JQuery:
<html> <body> <canvas id="myCanvas" width="400" height="400" style="border:1px solid #c3c3c3;"> Your browser does not support the canvas element. </canvas> <script src="jquery.js"></script> <script type="text/javascript"> window.onload = function(){ var canvas = document.getElementById('myCanvas'); var context = canvas.getContext('2d'); var img = new Image(); img.src = 'photo_apple.jpg'; context.drawImage(img, 0, 0); }; function findPos(obj){ var current_left = 0, current_top = 0; if (obj.offsetParent){ do{ current_left += obj.offsetLeft; current_top += obj.offsetTop; }while(obj = obj.offsetParent); return {x: current_left, y: current_top}; } return undefined; } function rgbToHex(r, g, b){ if (r > 255 || g > 255 || b > 255) throw "Invalid color component"; return ((r << 16) | (g << 8) | b).toString(16); } $('#myCanvas').click(function(e){ var position = findPos(this); var x = e.pageX - position.x; var y = e.pageY - position.y; var coordinate = "x=" + x + ", y=" + y; var canvas = this.getContext('2d'); var p = canvas.getImageData(x, y, 1, 1).data; var hex = "#" + ("000000" + rgbToHex(p[0], p[1], p[2])).slice(-6); alert("HEX: " + hex); }); </script> <img src="photo_apple.jpg"/> </body> </html>
Это мое полное решение. Здесь я использовал только холст и одно изображение, но если вам нужно использовать
<map>
над изображением, это тоже возможно.
Быстрый Ответ
context.getImageData(x, y, 1, 1).data;
возвращает массив rgba. например,[50, 50, 50, 255]
вот версия функции @lwburk rgbToHex, которая принимает массив rgba в качестве аргумента.
function rgbToHex(rgb){ return '#' + ((rgb[0] << 16) | (rgb[1] << 8) | rgb[2]).toString(16); };
вы можете попробовать color-sampler. Это простой способ выбрать цвет на холсте. Смотрите демо.
у меня есть очень простой рабочий пример получения цвета пикселя с холста.
сначала некоторые основные HTML:
<canvas id="myCanvas" width="400" height="250" style="background:red;" onmouseover="echoColor(event)"> </canvas>
затем JS, чтобы нарисовать что-то на холсте, и получить цвет:
var c = document.getElementById("myCanvas"); var ctx = c.getContext("2d"); ctx.fillStyle = "black"; ctx.fillRect(10, 10, 50, 50); function echoColor(e){ var imgData = ctx.getImageData(e.pageX, e.pageX, 1, 1); red = imgData.data[0]; green = imgData.data[1]; blue = imgData.data[2]; alpha = imgData.data[3]; console.log(red + " " + green + " " + blue + " " + alpha); }
здесь пример работающего, просто посмотрите на консоли.
вызов getImageData каждый раз будет замедлять процесс ... чтобы ускорить вещи, я храню данные изображения, а затем я могу перебирать все пиксели, такие как
var imgData = ctx.getImageData(0,0,can_ida.width,can_ida.height); var data = imgData.data; for (var y = 0; y < imgData.height; ++y) { for (var x = 0; x < imgData.width; ++x) { var index = (y * imgData.width + x) * 4; // index of the current pixel var red = data[index]; var green = data[index+1]; var blue = data[index+2]; var alpha = data[index+3]; console.log('pix x ' + x +' y '+y+ ' index '+index +' COLOR '+red+','+green+','+blue+','+alpha); } }