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


90

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


Якщо ви хочете, щоб дані base64 були зображенням, вам доведеться обробити рядок tt на стороні сервера та використовувати шлях збереженого зображення на стороні сервера. Ви можете зробити це за допомогою методу Ajax Post.
Район,

Для того, щоб воскресити старий пост, подивіться тут: stackoverflow.com/a/19644105
Luke Madhanga

Відповіді:


129

Ви можете просто створити 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 > але це не працює
user2996174

Це тому, що ваш код видалив data:image...частину з item_image.
Джозеф

8
Я думаю, що я шукаю те саме, що є OP. Я вважаю, що він хоче, щоб URL-адреса зображення вказувала на .png, а не на оригінальний рядок, закодований base64. Шукає перетворення десь там, якщо це можливо.
Джон

1
@ John, вам доведеться десь зберегти, завантажити та розмістити файл, оскільки URI даних не має посилання на те, звідки файл походить.
Гейб О'Лірі,

18

Це не зовсім сценарій ОП, а відповідь на запитання деяких коментаторів. Це рішення, засноване на 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 (принаймні, це я тестував). Слід також працювати з іншими типами mime / 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) та плагінів:

Я сподіваюся, це налаштовує всіх тут у правильному напрямку.


12

Доведіть це на основі відповіді @ 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);

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

1
Це єдина відповідь, яка насправді спрацювала !!!! Тепер, як надіслати це як запит AJAX?
Raz


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

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.