Found a better solution! It can be done using destination-in on an additional canvas and then move the result over to the main canvas:
function imgClip(image, x, y, radius) {
var scratchCanvas = document.getElementById('scratch');
scratchCanvas.width = radius*2;
scratchCanvas.height = radius*2;
var scratchCtx = scratchCanvas.getContext('2d');
//drawing code
scratchCtx.clearRect(0, 0, scratchCanvas.width, scratchCanvas.height);
scratchCtx.globalCompositeOperation = 'source-over'; //default
//Do whatever drawing you want. In your case, draw your image.
scratchCtx.drawImage(image, 0,0);
//As long as we can represent our clipping region as a single path,
//we can perform our clipping by using a non-default composite operation.
//You can think of destination-in as "write alpha". It will not touch
//the color channel of the canvas, but will replace the alpha channel.
//(Actually, it will multiply the already drawn alpha with the alpha
//currently being drawn - meaning that things look good where two anti-
//aliased pixels overlap.)
//
//If you can't represent the clipping region as a single path, you can
//always draw your clip shape into yet another scratch canvas.
scratchCtx.fillStyle = '#fff'; //color doesn't matter, but we want full opacity
scratchCtx.globalCompositeOperation = 'destination-in';
scratchCtx.beginPath();
scratchCtx.arc(x, y, radius, 0, 2 * Math.PI, true);
scratchCtx.closePath();
scratchCtx.fill();
return scratchCanvas;
}
var img = new Image();
var x = 200;
var y = 200;
var radius = 200;
img.onload = function() {
var image = imgClip(img, x, y, radius);
// Load from Server:
var raster = new Raster(image);