Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
159
rated 0 times [  166] [ 7]  / answers: 1 / hits: 34996  / 11 Years ago, sun, november 17, 2013, 12:00:00

I have two Set of Code for testing html5 canvas



Set 1 - Work perfectly



<img id=preview src=http://www.gravatar.com/avatar/0e39d18b89822d1d9871e0d1bc839d06?s=128&d=identicon&r=PG>
<canvas id=myCanvas/>

var c = document.getElementById(myCanvas);
var ctx = c.getContext(2d);
var img = document.getElementById(preview);
ctx.drawImage(img, 10, 10);
alert(c.toDataURL());


Set 2 - Show exception error (Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': tainted canvases may not be exported. )



<img id=preview1 src=http://www.gravatar.com/avatar/0e39d18b89822d1d9871e0d1bc839d06?s=128&d=identicon&r=PG>

function getBase64() {
var img = new Image();
img = document.getElementById(preview1);
var canvas = document.createElement(canvas);
canvas.width =img.width;
canvas.height =img.width;
var ctx = canvas.getContext(2d);
ctx.drawImage(img, 0, 0);
var dataURL = canvas.toDataURL(image/png); //This line of code will throw exception
alert( dataURL.replace(/^data:image/(png|jpg);base64,/, ));
}


I have no idea why in Set 1 toDataURL is not throwing any exception where Set toDataURL will throw exception and both are using same set of image.The different is in the first set i hardcode the canvas in HTML , and second set i create it through javascript.



My objective for Set 2 code is to get 64 base encode of the image.


More From » html

 Answers
35

This is a CORS issue - Gravatar sends the correct headers, you just need to put the correct attribute in:



<img id=preview1 crossorigin=anonymous src=http://www.gravatar.com/avatar/0e39d18b89822d1d9871e0d1bc839d06?s=128&d=identicon&r=PG>

function getBase64() {
var img = document.getElementById(preview1);
var canvas = document.createElement(canvas);
canvas.width = img.width;
canvas.height = img.width;
var ctx = canvas.getContext(2d);
ctx.drawImage(img, 0, 0);
var dataURL = canvas.toDataURL(image/png);
alert(dataURL.replace(/^data:image/(png|jpg);base64,/, ));
}
getBase64();


Note that your first example also failed when I tested it, just as it should.


[#74242] Friday, November 15, 2013, 11 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
jonrened

Total Points: 627
Total Questions: 114
Total Answers: 99

Location: Zimbabwe
Member since Thu, Jul 21, 2022
2 Years ago
jonrened questions
Mon, Nov 2, 20, 00:00, 4 Years ago
Tue, May 19, 20, 00:00, 4 Years ago
Tue, Jan 21, 20, 00:00, 4 Years ago
Thu, Nov 7, 19, 00:00, 5 Years ago
;