แปลง 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 นั้นเป็นรูปภาพและวิธีใช้พา ธ นั้นในไคลเอนต์จาวาสคริปต์

ฉันกำลังค้นหาเว็บไซต์จำนวนมากใน Google แต่ใช้งานไม่ได้และรหัสนั้นไม่เหมาะกับความต้องการของฉัน


หากคุณต้องการข้อมูล base64 นั้นเป็นรูปภาพคุณจะต้องประมวลผลสตริงที่ฝั่งเซิร์ฟเวอร์และใช้เส้นทางของรูปภาพที่บันทึกไว้ทางฝั่งเซิร์ฟเวอร์ คุณสามารถทำได้โดยใช้วิธี Ajax Post
Rayon

หากต้องการรื้อฟื้นโพสต์เก่าโปรดดูที่นี่: stackoverflow.com/a/19644105
Luke Madhanga

คำตอบ:


138

คุณสามารถสร้าง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
@ จอห์นคุณจะต้องบันทึกอัปโหลดและโฮสต์ไฟล์ไว้ที่ใดที่หนึ่งเนื่องจากข้อมูล URI ไม่มีการอ้างอิงถึงที่มาของไฟล์
Gabe O'Leary

18

นี่ไม่ใช่สถานการณ์ของ OP แต่เป็นคำตอบสำหรับผู้แสดงความคิดเห็นบางคน เป็นโซลูชันที่ใช้ Cordova และ Angular 1 ซึ่งควรปรับให้เข้ากับเฟรมเวิร์กอื่น ๆ เช่น jQuery มันให้ข้อมูล Blob จาก Base64 ซึ่งคุณสามารถเก็บไว้ที่ไหนสักแห่งและอ้างอิงจาก javascript / html ฝั่งไคลเอ็นต์

นอกจากนี้ยังตอบคำถามเดิมเกี่ยวกับวิธีรับภาพ (ไฟล์) จากข้อมูลฐาน 64:

ส่วนที่สำคัญคือฐาน 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 (อย่างน้อยนั่นคือสิ่งที่ฉันทดสอบ) ควรทำงานร่วมกับประเภทอื่น ๆ / ประเภทเนื้อหาด้วย ตรวจสอบเบราว์เซอร์และเวอร์ชันที่คุณตั้งเป้าไว้ว่าต้องรองรับ 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);

1
โทร. หากฉันทำconsole.log(image.width);โดยตรงหลังจากตั้งค่า src ฉันจะได้รับ 0 ในการโหลดครั้งแรกใน Chrome แต่ในการโหลดหน้าถัดไปฉันจะได้รับความกว้างจริงของรูปภาพ ดูเหมือนว่าเบราว์เซอร์กำลังแคชรูปภาพ แต่การโหลดครั้งแรกนั้นจำเป็นต้องได้รับการฟังเนื่องจากในทางเทคนิคการตั้งค่า src เป็นแบบอะซิงโครนัสซึ่งหมายความว่าคุณไม่สามารถพึ่งพาการมีรูปภาพได้ทันทีหลังจากตั้งค่า src เป็นสตริง base64 โค้ดจะยังคงดำเนินการตามลำดับแบบซิงโครนัสกับรูปภาพว่างเปล่าเว้นแต่คุณจะแน่ใจว่าโหลดถูกต้อง
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

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

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.