JS版base64获取&&canvas版

2017-12-27  本文已影响323人  bo_bo_bo_la

1. JS版base64获取

html代码

    <body>
        <input type="file" id="myFile" onchange="sub()" />
    </body>

JS代码

    <script type="text/javascript">
        function sub(){
            var myFile = document.getElementById("myFile").files[0];
            var fileRead = new FileReader();
            fileRead.readAsDataURL(myFile);
            fileRead.onload = function(e){
                var base64 = e.target.result;
                var img = new Image();
                img.src = base64;
                document.getElementsByTagName("body")[0].appendChild(img);
            }
        }
    </script>

解释:

  1. var myFile = document.getElementById("myFile").files[0];
    .files[0] 获取 在input上传的图片
  2. var fileRead = new FileReader();
    HTML5 定义了 FileReader 作为文件API的重要成员用于读取文件,根据W3C的定义FileReader接口提供了读取文件的方法和包含读取结果的事件模型
    new FileReader的实例有4个方法


    new FileReader
  1. fileRead.readAsDataURL(myFile);
    FileReader随想的readAsDataURL方法可以将读取到的文件编码成Data URL,Data URL是一项特殊技术,可以讲资料(图片)内嵌在网页之中,不用放在外部文件。使用Data URL的好处是,不需要额外的发送一个HTTP请求到服务器端取得的额外资料,缺点是,网页的大小可能会变大,它适合应用在内嵌小图片。

  2. fileRead.onload = function(e)中的e
    如下图所示,e是一个对象,e.target.result就是我们想获取的上传图片转化为的base64


    image.png
  3. var img = new Image();
    最后我们创建一个img图片,将img的src设置成我们获取到的base64

2. canvas版base64获取

<body>
        <canvas id="myCanvas" width="500" height="500"></canvas>
        <button onclick="sub()">点击</button>
    </body>
    <script type="text/javascript">
        var canvas = document.getElementById("myCanvas");
        var context = canvas.getContext("2d");
        
        context.beginPath();
        context.fillStyle = "red";
        context.fillRect(100,100,100,100);
        function sub(){
            var base64 = canvas.toDataURL();
            console.log(base64)
            var img = new Image();
            img.src = base64;
            document.getElementsByTagName("body")[0].appendChild(img);
        }
    </script>

解释:

  1. canvas.toDataURL()
    FileReader对象也有类似的方法,比如.readAsDataURL(),然而它只接受file或blob类型,而这两种类型一般只能通过<input[type=file]>元素的files属性获取,或者用Blob()构造函数手工创建一个新的对象。尴尬的是我们当前只有图片路径,受制于浏览器的安全策略,<input[type=file]>的files属性是只读的,而Blob()构造函数只接受文件内容,两种方式都无法通过图片路径直接获取。上文中假设的应用场景迫使我们必先考虑如何通过路径获取到图片内容。<img>是可以的,并且可以被绘制到<canvas>中,而<canvas>正巧拥有.toDataURL()方法。
上一篇 下一篇

猜你喜欢

热点阅读