Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
71
rated 0 times [  74] [ 3]  / answers: 1 / hits: 40320  / 12 Years ago, thu, october 25, 2012, 12:00:00

There are hundreds of tutorials, how one can crop an image by drawImage() on a canvas.



context.drawImage(imageObj, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight);


However, I have a canvas that fills the user's browser. By exporting the canvas as an image I would like to export only an area of 640px*480px from (0|0).



Problem: How can I tell javascript to use only 640*480 of the canvas for the toDataURL()?



Here is what I have so far:



$(#submitGraphic).click( function(){
var canvas = document.getElementsByTagName(canvas);
// canvas context
var context = canvas[0].getContext(2d);
// get the current ImageData for the canvas
var data = context.getImageData(0, 0, canvas[0].width, canvas[0].height);
// store the current globalCompositeOperation
var compositeOperation = context.globalCompositeOperation;
// set to draw behind current content
context.globalCompositeOperation = destination-over;
//set background color
context.fillStyle = #FFFFFF;
// draw background/rectangle on entire canvas
context.fillRect(0,0,canvas[0].width,canvas[0].height);

// not working, seems to clear the canvas? browser hangs?
// seems that I can click a white image in the background
/*canvas[0].width = 640;
canvas[0].height = 480;*/

// not working either
/*canvas[0].style.width = '640px';
canvas[0].style.height = '480px';*/

// not working at all
/*context.canvas.width = 640;
context.canvas.height = 480;*/

// write on screen
var img = canvas[0].toDataURL(image/png);
document.write('<a href='+img+'><img src='+img+'/></a>');
})


PS: I do not want to resize or scale, just clipping/cropping to the fixed window. Here I read that you only specifiy canvas.width and canvas.height - but this clears the canvas.


More From » image

 Answers
44

The best way is to just create a temporary canvas to draw onto from the current canvas. The user will never see this temp canvas. Then you just need use toDataUrl() on the temp canvas.



Live Demo



$(#submitGraphic).click( function(){
var canvas = document.getElementsByTagName(canvas);
// canvas context
var context = canvas[0].getContext(2d);
// get the current ImageData for the canvas
var data = context.getImageData(0, 0, canvas[0].width, canvas[0].height);
// store the current globalCompositeOperation
var compositeOperation = context.globalCompositeOperation;
// set to draw behind current content
context.globalCompositeOperation = destination-over;
//set background color
context.fillStyle = #FFFFFF;
// draw background/rectangle on entire canvas
context.fillRect(0,0,canvas[0].width,canvas[0].height);

var tempCanvas = document.createElement(canvas),
tCtx = tempCanvas.getContext(2d);

tempCanvas.width = 640;
tempCanvas.height = 480;

tCtx.drawImage(canvas[0],0,0);

// write on screen
var img = tempCanvas.toDataURL(image/png);
document.write('<a href='+img+'><img src='+img+'/></a>');
})​

[#82352] Wednesday, October 24, 2012, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
rocioblancac

Total Points: 699
Total Questions: 96
Total Answers: 108

Location: Libya
Member since Mon, Dec 7, 2020
4 Years ago
;