Saturday, May 11, 2024
 Popular · Latest · Hot · Upcoming
163
rated 0 times [  165] [ 2]  / answers: 1 / hits: 15564  / 12 Years ago, mon, march 19, 2012, 12:00:00

When using toDataUrl() to set the source of an image tag I am finding that the image when saved is a great deal larger than the original image.



In the example below I am not specifying a second param for the toDataUrl function so the default quality is being used. This is resulting in an image much larger that the original image size. When specifying 1 for full quality the image generated is even larger.



Does anybody know why this is happening or how I can stop it?



            // create image
var image = document.createElement('img');

// set src using remote image location
image.src = 'test.jpg';

// wait til it has loaded
image.onload = function (){

// set up variables
var fWidth = image.width;
var fHeight = image.height;

// create canvas
var canvas = document.createElement('canvas');
canvas.id = 'canvas';
canvas.width = fWidth;
canvas.height = fHeight;
var context = canvas.getContext('2d');

// draw image to canvas
context.drawImage(image, 0, 0, fWidth, fHeight, 0, 0, fWidth, fHeight);

// get data url
dataUrl = canvas.toDataURL('image/jpeg');

// this image when saved is much larger than the image loaded in
document.write('<img src=' + dataUrl + ' />');

}


Thank you :D



Here is an example, unfortunately the image cannot be cross domain and so I am having to just pull one of the jsfiddle images.



http://jsfiddle.net/ptSUd/



The image is 7.4kb, if you then save the image which is being output you will see that it is 10kb. The difference is more noticeable with more detailed images. If you set the toDataUrl quality to 1, the image is then 17kb.



I am also using FireFox 10 for this, when using Chrome the image sizes are still larger but not by as much.


More From » canvas

 Answers
4

The string returned by the toDataURL() method does not represent the original data.


I have just performed some extensive tests, which showed that the created data-URL depends on the browser (not on the operating system).


 Environment             -    md5 sum                       - file size
Original file - c9eaf8f2aeb1b383ff2f1c68c0ae1085 - 4776 bytes
WinXP Chrome 17.0.963.79 - 94913afdaba3421da6ddad642132354a - 7702 bytes
Linux Chrome 17.0.963.79 - 94913afdaba3421da6ddad642132354a - 7702 bytes
Linux Firefox 10.0.2 - 4f184006e00a44f6f2dae7ba3982895e - 3909 bytes

The method of getting the data-URI does not matter, the following snippet was used to verify that the data-URI from a file upload are also different:


Test case: http://jsfiddle.net/Fkykx/


<input type="file" id="file"><script>
document.getElementById('file').onchange=function() {
var filereader = new FileReader();
filereader.onload = function(event) {
var img = new Image();
img.onload = function() {
var c = document.createElement('canvas'); // Create canvas
c.width = img.width;
c.height = img.height; c.getContext('2d').drawImage(img,0,0,img.width,img.height);
var toAppend = new Image;
toAppend.title = 'Imported via upload, drawn in a canvas';
toAppend.src = c.toDataURL('image/png');
document.body.appendChild(toAppend);
}
img.src = event.target.result; // Set src from upload, original byte sequence
img.title = 'Imported via file upload';
document.body.appendChild(img);
};
filereader.readAsDataURL(this.files[0]);
}
</script>

[#86742] Sunday, March 18, 2012, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
catrinas

Total Points: 587
Total Questions: 100
Total Answers: 105

Location: Rwanda
Member since Thu, Feb 10, 2022
2 Years ago
;