在javascript / jquery中将base64转换为图像


89

我已经编写了一些使用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转换为image以及如何在javascript客户端中使用该路径。

我正在搜索google的网站这么多,但无法正常工作,并且该代码不适合我的要求。


如果要将base64数据用作映像,则必须在服务器端处理thet字符串,并在服务器端使用保存的映像的路径。您可以使用Ajax Post方法来做到这一点。
人造丝

要复活旧帖子,请在此处查看:stackoverflow.com/a/19644105
Luke Madhanga 2014年

Answers:


127

你可以创建一个Image对象,并把以base64为src,包括data:image...一部分这样的

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

这就是他们所谓的“数据URI”,这是内部和平的兼容性表


1
您能清楚说明图像返回对象html元素以及如何将其读取为图像

在这里写img标签<img id =“ myImg” src =“ d:\\ face.png” border = 1>并在使用这些代码document.getElementById('myImg')。src = item_image; // <img标签>但它不起作用
user2996174 2014年

那是因为您的代码从中删除了该data:image...部分item_image
2014年

8
我想我正在寻找OP相同的东西。我相信他希望图像url指向.png,而不是原始的base64编码的字符串。如果可能的话,在那里寻找转换。
约翰

1
@John,您将不得不在某个位置保存,上传和托管文件,因为数据URI没有引用文件的原始来源。
加贝·奥利里

17

这不完全是OP的情况,而是对某些评论者的回答。这是基于Cordova和Angular 1的解决方案,应该适用于其他框架,例如jQuery。它为您提供了来自Base64数据的Blob,您可以将其存储在某个地方,并从客户端javascript / html引用它。

它还回答了有关如何从Base 64数据获取图像(文件)的原始问题:

重要的部分是Base 64-Binary转换:

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)和插件版本:

我希望这能使每个人都朝正确的方向前进。


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后直接执行操作,则在Chrome的第一次加载中得到0,但是在随后的页面重新加载中,我得到图像的实际宽度。似乎浏览器正在缓存图像,但是由于技术上设置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请求发送?
拉兹

9

HTML

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

s

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

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.