javascript - 如何使用javascript将数据:image/png:base64. ..解码为真实图像

标签 javascript jquery css html

我使用 HTML5 从网络摄像头捕获了图像,但结果是用 base64 编码的。如何解码并将真实图像放在文件上传中。 这是我的代码

HTML

<div class="fileUpload">
    <input type="file" accept="image/*" class="CUupload" onClick="return false">
</div>
<div class="CUpopup" style="display:none">
    <div id="CUmain">
        <video id="video"></video>
        <div class="CUvideoside">
            <a id="button">Camera button</a>
            <!-- target for the canvas-->
            <div id="canvasHolder"></div>
            <!--preview image captured from canvas-->
            <img id="preview" src="" width="160" height="120">
            <label>base64 image:</label>
              <!--<input id="imageToForm" type="text">-->
            <div class="CUdone">
                <a href="javascript:void(0);">Done</a>
            </div>
        </div>
    </div>
</div>

CSS

 body{
    font-family:Sans-Serif;
}
canvas{
    position:absolute; 
    left: -9999em;
}
#button{
    background-color: Red; 
    color: #fff; 
    padding: 3px 10px; 
    cursor:pointer; 
    display: inline-block; 
    border-radius: 5px;
}
#sidebar{
    float:right; 
    width: 45%;
}
#main{
    float:left; 
    width: 45%;
}
#imageToForm{
    width:100%;
}
#preview{
    margin: 20px 0;
}
label{
    display: block;
}
video#video{
    width:50%;
    float:left;
    height:100%;
}
.CUpopup{
    position:fixed;
    top:0px;
    left:0px; 
    bottom:0px;
    right:0px; 
    background:rgba(0,0,0,0.3);
}
#CUmain{position:absolute;
    top:0px;
    left:0px; 
    bottom:0px;
    right:0px;
    margin:auto;
    background:#fff;
    width:50%;
    height:50%;
    padding:10px;
    border-radius:10px;
}
.CUvideoside{
    width:48%;
    float:left;
    margin-left:2%;
}
.CUdone a{
    background-color: Red; 
    color: #fff; 
    padding: 3px 10px; 
    cursor:pointer; 
    display: inline-block; 
    border-radius: 5px;
    text-decoration:none;
}


**JS**


$(document).ready(function(){
    $('.CUupload').click(function(){
        $('.CUpopup').show();
    });
    $('.CUdone').click(function(){
        if($('preview').attr('src') != ""){
             $('.CUpopup').hide();
        }
    });

});
        var video;
        var dataURL;

        //http://coderthoughts.blogspot.co.uk/2013/03/html5-video-fun.html - thanks :)
        function setup() {
            navigator.myGetMedia = (navigator.getUserMedia ||
            navigator.webkitGetUserMedia ||
            navigator.mozGetUserMedia ||
            navigator.msGetUserMedia);
            navigator.myGetMedia({ video: true }, connect, error);
        }

        function connect(stream) {
            video = document.getElementById("video");
            video.src = window.URL ? window.URL.createObjectURL(stream) : stream;
            video.play();
        }

        function error(e) { console.log(e); }

        addEventListener("load", setup);

        function captureImage() {
            var canvas = document.createElement('canvas');
            canvas.id = 'hiddenCanvas';
            //add canvas to the body element
            document.body.appendChild(canvas);
            //add canvas to #canvasHolder
            document.getElementById('canvasHolder').appendChild(canvas);
            var ctx = canvas.getContext('2d');
            canvas.width = video.videoWidth / 4;
            canvas.height = video.videoHeight / 4;
            ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
            //save canvas image as data url
            dataURL = canvas.toDataURL();
            //set preview image src to dataURL
            document.getElementById('preview').src = dataURL;
            // place the image value in the text box
           // document.getElementById('imageToForm').value = dataURL;
            $('.CUupload').attr('value',dataURL);
        }

        //Bind a click to a button to capture an image from the video stream
        var el = document.getElementById("button");
        el.addEventListener("click", captureImage, false);

我想使用文件上传上传网络摄像头拍摄的图像

最佳答案

将 base64 字符串转换为 blob。使用文件 uploader 的文件是具有额外属性的 blob,因此上传 blob 的工作方式相同。

var file = dataURItoBlob(canString, 'image/png');


function dataURItoBlob(dataURI, type) {
    // convert base64 to raw binary data held in a string
    var byteString = atob(dataURI.split(',')[1]);

    // separate out the mime component
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]

    // write the bytes of the string to an ArrayBuffer
    var ab = new ArrayBuffer(byteString.length);
    var ia = new Uint8Array(ab);
    for (var i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }

    // write the ArrayBuffer to a blob, and you're done
    var bb = new Blob([ab], { type: type });
    return bb;
}

更新

将 base64 字符串转换为图像:

var image = new Image(),
    containerWidth = null,
    containerHeight = null;

image.onload=function(){
    containerWidth = image.width;
    containerHeight = image.height;
}
image.src = base64string;

或者将 base64 字符串保存为本地文件(当我找到实现它的位置时,这个文件不在内存中):

    function saveImage(base64string) {
        var imageData = base64string.split(',')[1];
        var a = $("<a>").attr("href", "data:Application/base64," + imageData )
                        .attr("download","image.png")
                        .appendTo("body");

            a[0].click();

        a.remove();
    }

关于javascript - 如何使用javascript将数据:image/png:base64. ..解码为真实图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28636294/

相关文章:

jquery - 将列数据设置为超链接(dataTable JQUERY)

jquery - .live() 到 .on() 问题

javascript - TypeError : $(. ..).SetHeight 不是函数

javascript - JavaScript 中的主体加载函数

jquery - 使用 JQuery 在 HTML 周围添加 Span

html - 将折叠文本切换为单行

javascript - 如何启用表单中的提交按钮?

javascript - 用 javascript 写变音符号

javascript - javascript倒计时器在页面刷新时重置

javascript - Unity 3D WebGL : Run Javascript code after the app has been loaded and is ready