convertir base64 a imagen en javascript / jquery

90

He escrito un código para la captura de imágenes usando javascript / jquery A continuación se muestra el código:

function capture_image(){ 
    alert("capture_image");
    var p = webcam.capture();
    webcam.save();           
    alert("capture complete "+p); //getting true here


     var img = canvas.toDataURL("image");
    var item_image = img.replace(/^data:image\/(png|jpg);base64,/, "") ; 
    alert("item_image"+item_image);
}

El item_image imprime el formato base64, Cómo convertir ese base64 en una imagen y cómo usar esa ruta en el lado del cliente de JavaScript.

Estoy buscando en Google tantos sitios web pero no funciona y ese código no es adecuado para mis necesidades.

usuario2996174
fuente
Si desea esos datos base64 como una imagen, tendrá que procesar la cadena en el lado del servidor y usar la ruta de la imagen guardada en el lado del servidor. Puede hacer esto utilizando el método Ajax Post.
Rayon
Para resucitar una publicación anterior, eche un vistazo aquí: stackoverflow.com/a/19644105
Luke Madhanga

Respuestas:

128

Puede simplemente crear un Imageobjeto y poner la base64 como su src, incluida la data:image...parte como esta :

var image = new Image();
image.src = 'data:image/png;base64,iVBORw0K...';
document.body.appendChild(image);

Es lo que llaman "URI de datos" y aquí está la tabla de compatibilidad para la paz interior.

Joseph
fuente
1
Can u explicar claramente significa que el objeto elemento html imagen vuelve y cómo leer como imagen
user2996174
Aquí estoy escribiendo la etiqueta img <img id = "myImg" src = "d: \\ face.png" border = 1> y estoy usando este código document.getElementById ('myImg'). Src = item_image; // <etiqueta img > pero no funciona
user2996174
Eso es porque su código eliminó la data:image...parte de item_image.
Joseph
8
Creo que estoy buscando lo mismo que OP. Creo que quiere que la URL de la imagen apunte a un .png, no a la cadena codificada en base64 original. Buscando una conversión en algún lugar allí si es posible.
John
1
@John, tendría que guardar, cargar y alojar el archivo en algún lugar, ya que el URI de datos no tiene ninguna referencia al origen del archivo.
Gabe O'Leary
18

Este no es exactamente el escenario del OP, sino una respuesta a los de algunos de los comentaristas. Es una solución basada en Cordova y Angular 1, que debería ser adaptable a otros frameworks como jQuery. Le brinda un Blob de datos Base64 que puede almacenar en algún lugar y hacer referencia a él desde el lado del cliente javascript / html.

También responde a la pregunta original sobre cómo obtener una imagen (archivo) de los datos de Base 64:

La parte importante es la Base 64 - Conversión binaria:

function base64toBlob(base64Data, contentType) {
    contentType = contentType || '';
    var sliceSize = 1024;
    var byteCharacters = atob(base64Data);
    var bytesLength = byteCharacters.length;
    var slicesCount = Math.ceil(bytesLength / sliceSize);
    var byteArrays = new Array(slicesCount);

    for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
        var begin = sliceIndex * sliceSize;
        var end = Math.min(begin + sliceSize, bytesLength);

        var bytes = new Array(end - begin);
        for (var offset = begin, i = 0; offset < end; ++i, ++offset) {
            bytes[i] = byteCharacters[offset].charCodeAt(0);
        }
        byteArrays[sliceIndex] = new Uint8Array(bytes);
    }
    return new Blob(byteArrays, { type: contentType });
}

Se requiere el corte para evitar errores de memoria insuficiente.

Funciona con archivos jpg y pdf (al menos eso es lo que probé). También debería funcionar con otros mimetypes / contenttypes. Verifique los navegadores y las versiones que busca, deben ser compatibles con Uint8Array, Blob y atob.

Aquí está el código para escribir el archivo en el almacenamiento local del dispositivo con Cordova / Android:

...
window.resolveLocalFileSystemURL(cordova.file.externalDataDirectory, function(dirEntry) {

                    // Setup filename and assume a jpg file
                    var filename = attachment.id + "-" + (attachment.fileName ? attachment.fileName : 'image') + "." + (attachment.fileType ? attachment.fileType : "jpg");
                    dirEntry.getFile(filename, { create: true, exclusive: false }, function(fileEntry) {
                        // attachment.document holds the base 64 data at this moment
                        var binary = base64toBlob(attachment.document, attachment.mimetype);
                        writeFile(fileEntry, binary).then(function() {
                            // Store file url for later reference, base 64 data is no longer required
                            attachment.document = fileEntry.nativeURL;

                        }, function(error) {
                            WL.Logger.error("Error writing local file: " + error);
                            reject(error.code);
                        });

                    }, function(errorCreateFile) {
                        WL.Logger.error("Error creating local file: " + JSON.stringify(errorCreateFile));
                        reject(errorCreateFile.code);
                    });

                }, function(errorCreateFS) {
                    WL.Logger.error("Error getting filesystem: " + errorCreateFS);
                    reject(errorCreateFS.code);
                });
...

Escribiendo el archivo en sí:

function writeFile(fileEntry, dataObj) {
    return $q(function(resolve, reject) {
        // Create a FileWriter object for our FileEntry (log.txt).
        fileEntry.createWriter(function(fileWriter) {

            fileWriter.onwriteend = function() {
                WL.Logger.debug(LOG_PREFIX + "Successful file write...");
                resolve();
            };

            fileWriter.onerror = function(e) {
                WL.Logger.error(LOG_PREFIX + "Failed file write: " + e.toString());
                reject(e);
            };

            // If data object is not passed in,
            // create a new Blob instead.
            if (!dataObj) {
                dataObj = new Blob(['missing data'], { type: 'text/plain' });
            }

            fileWriter.write(dataObj);
        });
    })
}

Estoy usando las últimas versiones de Cordova (6.5.0) y Plugins:

Espero que esto ponga a todos aquí en la dirección correcta.

Jürgen 'Kashban' Wahlmann
fuente
12

Tengo que agregar esto según la respuesta de @ Joseph. Si alguien quiere crear un objeto de imagen:

var image = new Image();
image.onload = function(){
   console.log(image.width); // image is loaded and we have image width 
}
image.src = 'data:image/png;base64,iVBORw0K...';
document.body.appendChild(image);
jare25
fuente
1
Buena llamada. Si lo hago console.log(image.width);directamente después de configurar src, obtengo 0 en la primera carga en Chrome, pero en las recargas de página posteriores obtengo el ancho real de la imagen. Parece que el navegador está almacenando en caché la imagen, pero esa primera carga debe ser escuchada porque técnicamente la configuración de src es asincrónica, lo que significa que no puede confiar en tener una imagen inmediatamente después de configurar src en una cadena base64. El código continuará ejecutándose en orden síncrono con una imagen vacía a menos que se asegure de que esté correctamente cargada.
Frank
11
var src = "data:image/jpeg;base64,";
src += item_image;
var newImage = document.createElement('img');
newImage.src = src;
newImage.width = newImage.height = "80";
document.querySelector('#imageContainer').innerHTML = newImage.outerHTML;//where to insert your image
MRTC
fuente
1
¡Esta es la única respuesta que realmente funcionó! Ahora, ¿cómo enviar esto como una solicitud AJAX?
Raz
10

HTML

<img id="imgElem"></img>

Js

string baseStr64="/9j/4AAQSkZJRgABAQE...";
imgElem.setAttribute('src', "data:image/jpg;base64," + baseStr64);
Tran Anh Hien
fuente
0

Una forma rápida y sencilla:

function paintSvgToCanvas(uSvg, uCanvas) {

    var pbx = document.createElement('img');

    pbx.style.width  = uSvg.style.width;
    pbx.style.height = uSvg.style.height;

    pbx.src = 'data:image/svg+xml;base64,' + window.btoa(uSvg.outerHTML);
    uCanvas.getContext('2d').drawImage(pbx, 0, 0);

}
John Haugeland
fuente