Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strange HTML5 Canvas drawImage behaviour

I am writing some code that uses HTML5 canvas. Generally it works well, but now I found a very strange behaviour. The weird thing is that it is consistent on different browsers, so must be that I understood the thing wrong... Despite the docs seem to say exactly what I am doing. Here is the code (it's an object method):

   MyCanvas.prototype.getElement = function() {          var innerHtml = "<div></div>";          var elem = jQuery(innerHtml, {             'id' : this.viewId         });            var canvas = jQuery("<canvas/>", {             'id' : this.viewId + "canvas",             'width' : this.width,             'height' : this.height         });          var w = this.width;         var h = this.height;          jQuery(elem).append(canvas);          var imgElem = new Image();          imgElem.src = this.maskImage;         imgElem.onload = function() {             var ctx = canvas[0].getContext('2d');             ctx.drawImage(this, 0, 0, w, h);          };          return elem;     }; 

After this I'll use jQuery again to append this element to a Div that is already in the page (which is blank). The result will be that the image is overstretched like ten times it's width.... That is weird because, for what I understood of drawImage, it should use the w and h values to scale the image and given that w and h are the size of the canvas, it should fit well.

What am I doing wrong? Is it because I do the drawing off the rendered DOM tree?

like image 553
gotch4 Avatar asked Jul 06 '10 11:07

gotch4


People also ask

What is the purpose of the HTML5 canvas?

The CANVAS element allows you to add so much more interactivity to your web pages because now you can control the graphics, images, and text dynamically with a scripting language. The CANVAS element helps you turn images, photos, charts, and graphs into animated elements.

Does HTML5 support canvas element?

The canvas element is part of HTML5 and allows for dynamic, scriptable rendering of 2D shapes and bitmap images.

How fast is HTML5 canvas?

The Canvas tab loaded in one second and takes up 30MB. It also takes up 13% of CPU time all of the time, regardless of whether or not one is looking at it. Video on the HTML page, while I am not moving objects, is actually perfectly smooth.


1 Answers

I found this "feature" as well to be a bit irksome. It seems as though you don't want to use CSS to set the width and height properties for the canvas element. Append the canvas element with attributes (rather than CSS) and the dimensions should correct themselves.

var canvas = jQuery("<canvas/>", {     'id' : this.viewId + "canvas" });  $('#' + this.viewId).attr('height', this.height).attr('width', this.width); 
like image 105
Brian Flanagan Avatar answered Oct 03 '22 09:10

Brian Flanagan