Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

get rgb values of pixel of image in fabric.js on mouse move

how to get rgb values of image in fabric.js on mouse move. I used getFill() method of image object, but it is returning (0,0,0). Please help me

like image 301
swapnil gandhi Avatar asked Nov 06 '14 09:11

swapnil gandhi


1 Answers

FabricJS does not have a native method for getting the pixel colors.

The workaround is to use native html5 canvas to fetch the pixel data:

  • Create your Fabric image objects. Be sure to specify crossOrigin as 'anonymous' otherwise the canvas will be tainted with a security violation and then the pixel data will be unavailable.

  • Listen on Fabric's 'mouse:move' event. When it fires, get the current mouse position and use native canvas's context.getImageData to fetch that pixel's color array.

Good luck with your project!

Here's annotatede code and a Demo:

// create a Fabric.Canvas
var canvas = new fabric.Canvas("canvas");

// get a reference to <p id=results></p>
// (used to report pixel color under mouse)
var results = document.getElementById('results');

// get references to the html canvas element & its context
var canvasElement = document.getElementById('canvas');
var ctx = canvasElement.getContext("2d");


// create a test Fabric.Image
addFabricImage('https://cdn.pixabay.com/photo/2019/12/12/05/34/afro-4689826_1280.jpg');

// listen for mouse:move events
canvas.on('mouse:move', function(e) {

  // get the current mouse position
  var mouse = canvas.getPointer(e.e);
  var x = parseInt(mouse.x);
  var y = parseInt(mouse.y);

  // get the color array for the pixel under the mouse
  var px = ctx.getImageData(x, y, 1, 1).data;

  // report that pixel data
  results.innerHTML = 'At [' + x + ' / ' + y + ']: Red/Green/Blue/Alpha = [' + px[0] + ' / ' + px[1] + ' / ' + px[2] + ' / ' + px[3] + ']';

});



// create a Fabric.Image at x,y using a specified imgSrc
function addFabricImage(imgSrc, x, y) {

  // create a new javascript Image object using imgSrc
  var img = new Image();

  // be sure to set crossOrigin or else 
  // cross-domain imgSrc's will taint the canvas
  // and then we can't get the pixel data
  // IMPORTANT!: the source domain must be properly configured 
  // to allow crossOrigin='anonymous'
  img.crossOrigin = 'anonymous';

  // when the Image object is fully loaded, 
  // use it to create a new fabric.Image object
  img.onload = function() {

    var fabImg = new fabric.Image(this, {
      left: 30,
      top: 30
    });
    canvas.add(fabImg);

  }

  // use imgSrc as the image source
  img.src = imgSrc;

}
body {
  background-color: ivory;
}
canvas {
  border: 1px solid red;
}
<script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.4.0/fabric.min.js"></script>
<p id="results">Move mouse over canvas</p>
<canvas id=canvas width=300 height=300></canvas>
like image 140
markE Avatar answered Sep 21 '22 23:09

markE