14

Can you serialize/deserialize a canvas object in javascript?

Calvin
  • 4,559
  • 1
  • 25
  • 23
user17060
  • 412
  • 5
  • 7

2 Answers2

16

Besides the getImageData method, you can use canvas.toDataURL() to get an data-URL-encoded PNG. If you need to serialize to a string, it would save having to convert the raw data to a string manually. You could deserialize by creating an image and setting the src to the data URL, then drawing it to a canvas.

[Edited to account for asynchronous loading (suggested by olliej).]

function serialize(canvas) {
    return canvas.toDataURL();
}

function deserialize(data, canvas) {
    var img = new Image();
    img.onload = function() {
        canvas.width = img.width;
        canvas.height = img.height;
        canvas.getContext("2d").drawImage(img, 0, 0);
    };

    img.src = data;
}

If I remember correctly, some older versions of Safari, and maybe Opera didn't support toDataURL, but the more recent versions do.

Matthew Crumley
  • 101,441
  • 24
  • 103
  • 129
  • 2
    Technically the image is not guaranteed to be loaded synchronously so you should really do the remainder of the work in the images onload handler – olliej Apr 20 '09 at 07:40
5

You can get direct pixel access with canvas.getImageData() and .putImageData(). You can also serialize images to a data URL with canvas.toDataURL() for posting to a server.

This only works in newer browsers.

user92877
  • 151
  • 2
  • 2