Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Saving Data URI as Image?

On a node server I would like to save uploaded datauri data as an image. To do this I've tried decoding the content of this png-

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAIAAAFlEcHbAAAAB3RJTUUH1gMWFjk7nUWcXQAAAAlwSFlzAABOIAAATiABFn2Z3gAAAARnQU1BAACxjwv8YQUAAAAeSURBVHjaY7h79y7DhAkTGIA04/Tp0xkYGJ49ewYAgYwLV/R7bDQAAAAASUVORK5CYII=

And saving it as a .png extension. Looks like there is more too it than that. How do I decode the datauri and save it as a file?

like image 414
micah Avatar asked Apr 12 '16 22:04

micah


3 Answers

I've created a library to be used with Node.js that helps with encoding and decoding of data URI schemes. I believe it can help you, check:

https://github.com/DiegoZoracKy/image-data-uri

Using this library, in your case, the code would be:

'use strict';

const ImageDataURI = require('image-data-uri');

const dataURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAIAAAFlEcHbAAAAB3RJTUUH1gMWFjk7nUWcXQAAAAlwSFlzAABOIAAATiABFn2Z3gAAAARnQU1BAACxjwv8YQUAAAAeSURBVHjaY7h79y7DhAkTGIA04/Tp0xkYGJ49ewYAgYwLV/R7bDQAAAAASUVORK5CYII=';
const fileName = 'decoded-image.png';

ImageDataURI.outputFile(dataURI, filePath);
like image 164
Diego ZoracKy Avatar answered Oct 10 '22 15:10

Diego ZoracKy


I was trying to decode the data using atob and saving this as a png file. I'm instead saving it base64 encoded but specifying the encoding in the write buffer.

fs.writeFileSync('tmp/myfile.png', new Buffer(data, 'base64'));

like image 23
micah Avatar answered Oct 10 '22 15:10

micah


You can convert your data uri to a blob using below code:

function dataURItoBlob(dataURI) {
    var byteStr;
    if (dataURI.split(',')[0].indexOf('base64') >= 0)
        byteStr = atob(dataURI.split(',')[1]);
    else
        byteStr = unescape(dataURI.split(',')[1]);

    var mimeStr = dataURI.split(',')[0].split(':')[1].split(';')[0];

    var arr= new Uint8Array(byteStr.length);
    for (var i = 0; i < byteStr.length; i++) {
        arr[i] = byteStr.charCodeAt(i);
    }

    return new Blob([arr], {type:mimeStr});
}

and then you can append this blob data to from data and upload it as a file:

var blob = dataURItoBlob(dataURI);
var fd = new FormData(document.forms[0]);
fd.append("image", blob);
like image 41
somprabhsharma Avatar answered Oct 10 '22 13:10

somprabhsharma