преобразовать base64 в изображение в javascript / jquery

94

Я написал код для захвата изображений с помощью 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 так много веб-сайтов, но он не работает, и этот код не подходит для моих требований.

user2996174
источник
Если вы хотите, чтобы данные base64 были изображением, вам нужно будет обработать эту строку на стороне сервера и использовать путь к сохраненному изображению на стороне сервера. Вы можете сделать это с помощью метода Ajax Post.
Rayon
Чтобы воскресить старый пост, посмотрите здесь: stackoverflow.com/a/19644105
Люк Мадханга

Ответы:

139

Вы можете просто создать Imageобъект и поместить base64 в качестве своих src, в том числе data:image...части , как это :

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

Это то, что они называют «URI данных», а вот таблица совместимости для внутреннего спокойствия.

Джозеф
источник
1
Вы можете четко объяснить, означает, что изображение возвращает элемент html объекта и как читать как изображение
user2996174
Здесь я пишу тег img <img id = "myImg" src = "d: \\ face.png" border = 1> и использую этот код document.getElementById ('myImg'). Src = item_image; // <img tag > но он не работает
user2996174
Это потому, что ваш код удалил data:image...часть из item_image.
Джозеф
8
Я думаю, что ищу то же самое, что и OP. Я считаю, что он хочет, чтобы URL-адрес изображения указывал на .png, а не на исходную строку в кодировке base64. Ищу конверсию где-нибудь там, если это возможно.
Джон
1
@John, вам нужно будет где-то сохранить, загрузить и разместить файл, поскольку URI данных не имеет ссылки на то, откуда файл изначально пришел.
Гейб О'Лири,
18

Это не совсем сценарий 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:

Надеюсь, это всех настроит в правильном направлении.

Юрген 'Кашбан' Вальманн
источник
13

Придется добавить это на основе ответа @ 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);
jare25
источник
1
Хороший звонок. Если я сделаю это console.log(image.width);сразу после установки src, я получу 0 при первой загрузке в Chrome, но при последующих перезагрузках страницы я получаю фактическую ширину изображения. Кажется, что браузер кэширует изображение, но эту самую первую загрузку нужно прослушивать, потому что технически установка src является асинхронной, что означает, что вы не можете полагаться на наличие изображения сразу после установки src в строку base64. Код будет продолжать выполняться в синхронном порядке с пустым изображением, если вы не убедитесь, что он правильно загружен.
Фрэнк
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
источник
1
Это единственный ответ, который действительно сработал !!!! Теперь, как отправить это как запрос AJAX?
Raz
11

HTML

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

Js

string baseStr64="/9j/4AAQSkZJRgABAQE...";
imgElem.setAttribute('src', "data:image/jpg;base64," + baseStr64);
Тран Ань Хиен
источник
0

Один быстрый и простой способ:

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);

}
Джон Хогеланд
источник