konversikan base64 ke gambar di javascript / jquery

90

Saya telah menulis beberapa kode untuk pengambilan gambar menggunakan javascript / jquery Di bawah ini adalah kodenya:

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 mencetak format base64, Cara mengonversi base64 itu ke gambar dan cara menggunakan jalur itu di sisi klien javascript.

Saya mencari di google begitu banyak situs web tetapi tidak berfungsi dan kode itu tidak sesuai dengan kebutuhan saya.

pengguna2996174
sumber
Jika Anda ingin data base64 itu sebagai gambar maka Anda harus memproses string di sisi server dan menggunakan jalur gambar yang disimpan di sisi server. Anda dapat melakukan ini dengan menggunakan metode Ajax Post.
Rayon
Untuk menghidupkan kembali pos lama, lihat di sini: stackoverflow.com/a/19644105
Luke Madhanga

Jawaban:

129

Anda bisa membuat sebuah Imageobjek dan meletakkan base64 sebagai miliknya src, termasuk data:image...bagian seperti ini :

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

Itulah yang mereka sebut "URI Data" dan inilah tabel kompatibilitas untuk kedamaian batin.

Joseph
sumber
1
Bisakah Anda menjelaskan dengan jelas berarti gambar mengembalikan elemen html objek dan cara membaca sebagai gambar
user2996174
Di sini saya menulis tag img <img id = "myImg" src = "d: \\ face.png" border = 1> dan saya menggunakan kode ini document.getElementById ('myImg'). Src = item_image; // <img tag > tetapi tidak berfungsi
user2996174
Itu karena kode Anda menghapus data:image...bagian dari item_image.
Joseph
8
Saya pikir saya mencari OP yang sama. Saya yakin dia ingin url gambar mengarah ke .png, bukan string yang dikodekan base64 asli. Mencari konversi di suatu tempat di sana jika memungkinkan.
Yohanes
1
@John Anda harus menyimpan, mengunggah, dan menghosting file di suatu tempat karena URI data tidak memiliki referensi ke asal file tersebut.
Gabe O'Leary
18

Ini bukan skenario OP tetapi jawaban dari beberapa komentator. Ini adalah solusi berdasarkan Cordova dan Angular 1, yang harus dapat disesuaikan dengan kerangka kerja lain seperti jQuery. Ini memberi Anda Blob dari data Base64 yang dapat Anda simpan di suatu tempat dan mereferensikannya dari sisi klien javascript / html.

Ini juga menjawab pertanyaan asli tentang bagaimana mendapatkan gambar (file) dari data Base 64:

Bagian penting adalah Basis 64 - Konversi biner:

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

Pemotongan diperlukan untuk menghindari kesalahan memori.

Bekerja dengan file jpg dan pdf (setidaknya itulah yang saya uji). Harus bekerja dengan mimetypes / contenttypes lain juga. Periksa browser dan versinya yang Anda tuju, mereka perlu mendukung Uint8Array, Blob dan atob.

Berikut kode untuk menulis file ke penyimpanan lokal perangkat dengan 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);
                });
...

Menulis file itu sendiri:

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

Saya menggunakan Cordova (6.5.0) dan versi Plugin terbaru:

Saya harap ini membuat semua orang di sini ke arah yang benar.

Jürgen 'Kashban' Wahlmann
sumber
12

Harus menambahkan ini berdasarkan jawaban @ Joseph. Jika seseorang ingin membuat objek gambar:

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
sumber
1
Panggilan yang bagus. Jika saya lakukan console.log(image.width);langsung setelah pengaturan src saya mendapatkan 0 pada pemuatan pertama di Chrome, tetapi pada halaman berikutnya memuat ulang saya mendapatkan lebar gambar yang sebenarnya. Tampaknya browser menyimpan gambar dalam cache, tetapi pemuatan pertama itu perlu diperhatikan karena secara teknis menyetel src adalah asinkron, yang berarti Anda tidak dapat mengandalkan gambar segera setelah menyetel src ke string base64. Kode akan terus dijalankan dalam urutan sinkron dengan gambar kosong kecuali Anda memastikannya dimuat dengan benar.
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
sumber
1
Ini adalah satu-satunya jawaban yang benar-benar berhasil !!!! Sekarang, bagaimana cara mengirim ini sebagai permintaan AJAX?
Raz
10

Html

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

Js

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

Satu cara cepat dan mudah:

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
sumber