I'm using code from this question to make a 'color picker' with colorwheel tool using jQuery UI's draggable function, but I'm having trouble. I can't seem to get the correct location on the canvas image, as my code always returns rgb valeus of 0, 0, 0, no matter where I drag it on the colorwheel. Here's my code:
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
var canvasWidth = $('#canvas').width();
function getColor(e) {
console.log(e);
var pos = findPos(document.getElementById('currentSelector'));
console.log(pos)
x = pos.x;
y = pos.y;
var coord = "x=" + x + ", y=" + y;
var canvasRender = document.getElementById('canvas').getContext('2d');
var rgba = canvasRender.getImageData(x, y, 1, 1).data;
var hex = "#" + ("000000" + rgbToHex(rgba[0], rgba[1], rgba[2])).slice(-6);
var rgb = [];
for (var i = 0; i < rgba.length - 1; i++){
var temp = rgba[i];
rgb[i] = temp;
};
console.log(rgb);
setWorkingColor();
};
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);
}
$('.selectors-container').on('drag', '#currentSelector', function(e, ui){
getColor(e)
});
You can also see a live preview of the problem here: https://adobecolor-shambolaz.c9.io/
Thanks for any help!
EDIT: So the problem with my code was I was passing in the selector element instead of the canvas to the findPos() function, and the x and y variables needed to be changed to the pageX and pageY values of the drag event with respect to the canvas position. Here's the relevant parts of the revised, working code:
function getColor(e) {
console.log(e);
var pos = findPos(canvas);
console.log(pos)
var x = e.pageX - pos.x;
var y = e.pageY - pos.y;
var coord = "x=" + x + ", y=" + y;
var canvasRender = document.getElementById('canvas').getContext('2d');
var rgba = canvasRender.getImageData(x, y, 1, 1).data;
var rgba_data = context.getImageData(x, y, 1, 1).data;
var rgba = rgba_data;
console.log(rgba)
var hex = "#" + ("000000" + rgbToHex(rgba[0], rgba[1], rgba[2])).slice(-6);
var rgb = [];
for (var i = 0; i < rgba.length - 1; i++){
var temp = rgba[i];
rgb[i] = temp;
};
console.log(rgb);
setWorkingColor();
};
Thanks to markE for the response.