Я написал код для захвата изображений с помощью javascript / jquery. Ниже приведен код:
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);
}
Item_image печатает формат base64, как преобразовать этот base64 в изображение и как использовать этот путь на стороне клиента javascript.
Я ищу в Google так много веб-сайтов, но он не работает, и этот код не подходит для моих требований.
javascript
jquery
base64
user2996174
источник
источник
Ответы:
Вы можете просто создать
Image
объект и поместить base64 в качестве своихsrc
, в том числеdata:image...
части , как это :var image = new Image(); image.src = 'data:image/png;base64,iVBORw0K...'; document.body.appendChild(image);
Это то, что они называют «URI данных», а вот таблица совместимости для внутреннего спокойствия.
источник
data:image...
часть изitem_image
.Это не совсем сценарий OP, но ответ на некоторые из комментаторов. Это решение, основанное на Cordova и Angular 1, которое должно быть адаптировано к другим фреймворкам, таким как jQuery. Он дает вам Blob из данных Base64, которые вы можете где-то хранить и ссылаться на него из javascript / html на стороне клиента.
Он также отвечает на исходный вопрос о том, как получить изображение (файл) из данных Base 64:
Важной частью является Base 64 - двоичное преобразование:
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 }); }
Нарезка необходима, чтобы избежать ошибок нехватки памяти.
Работает с файлами jpg и pdf (по крайней мере, то, что я тестировал). Должен работать и с другими типами mimetypes / contenttypes. Проверьте браузеры и их версии, к которым вы стремитесь, они должны поддерживать Uint8Array, Blob и atob.
Вот код для записи файла в локальное хранилище устройства с помощью 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); }); ...
Пишем сам файл:
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); }); }) }
Я использую последние версии Cordova (6.5.0) и Plugins:
Надеюсь, это всех настроит в правильном направлении.
источник
Придется добавить это на основе ответа @ Joseph. Если кто-то хочет создать объект изображения:
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);
источник
console.log(image.width);
сразу после установки src, я получу 0 при первой загрузке в Chrome, но при последующих перезагрузках страницы я получаю фактическую ширину изображения. Кажется, что браузер кэширует изображение, но эту самую первую загрузку нужно прослушивать, потому что технически установка src является асинхронной, что означает, что вы не можете полагаться на наличие изображения сразу после установки src в строку base64. Код будет продолжать выполняться в синхронном порядке с пустым изображением, если вы не убедитесь, что он правильно загружен.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
источник
HTML
<img id="imgElem"></img>
Js
string baseStr64="/9j/4AAQSkZJRgABAQE..."; imgElem.setAttribute('src', "data:image/jpg;base64," + baseStr64);
источник
Один быстрый и простой способ:
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); }
источник