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.
javascript
jquery
base64
usuario2996174
fuente
fuente
Respuestas:
Puede simplemente crear un
Image
objeto y poner la base64 como susrc
, incluida ladata: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.
fuente
data:image...
parte deitem_image
.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.
fuente
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);
fuente
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.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
fuente
HTML
<img id="imgElem"></img>
Js
string baseStr64="/9j/4AAQSkZJRgABAQE..."; imgElem.setAttribute('src', "data:image/jpg;base64," + baseStr64);
fuente
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); }
fuente