• JavaScript 图片与Base64数据互相转换脚本


    JavaScript 图片与Base64数据互相转换脚本

    注: 转换过程中注意跨域问题、测试页是否支持相关标签创建、dom结构.

    方法一:非Html 5使用FileReader

    使用XMLHttpRequest将图像加载为blob,接着使用FileReader API将其转换为dataURL。

    function toDataURL(url, callback) {
      var xhr = new XMLHttpRequest();
      xhr.onload = function() {
        var reader = new FileReader();
        reader.onloadend = function() {
          callback(reader.result);
        }
        reader.readAsDataURL(xhr.response);
      };
      xhr.open('GET', url);
      xhr.responseType = 'blob';
      xhr.send();
    }
    
    
    
    toDataURL('https://www.gravatar.com/avatar/00000000000000000000000000000000?d=identicon&f=y', function(dataUrl) {
      console.log('结果:', dataUrl)
    })
    

    方法二:Html 5使用Canvas

    将图像加载到Image对象中,将其绘制到Canvas上,最后转换为dataURL

    function toDataURL(src, callback, outputFormat) {
      var img = new Image();
      img.crossOrigin = 'Anonymous';
      img.onload = function() {
        var canvas = document.createElement('CANVAS');
        var ctx = canvas.getContext('2d');
        var dataURL;
        canvas.height = this.naturalHeight;
        canvas.width = this.naturalWidth;
        ctx.drawImage(this, 0, 0);
        dataURL = canvas.toDataURL(outputFormat);
        callback(dataURL);
      };
      img.src = src;
      if (img.complete || img.complete === undefined) {
        img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
        img.src = src;
      }
    }
    
    
    
    toDataURL(
      'https://www.gravatar.com/avatar/00000000000000000000000000000000?d=identicon&f=y',
      function(dataUrl) {
        console.log('结果:', dataUrl)
      }
    )
    

    Base64数据转换为图片
    这里是把Base64的字符串转换为Blob ,这样就可以把数据传到一些图片服务器。

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

    附: blob 对象 转 blob url

    
    window.URL = window.URL || window.webkitURL;
    var url = window.URL.createObjectURL(blob); // base64toBlob 方法转出的 blob 对象, 转 url
    // $0 是一个 img 标签
    $0.src = url
    
    
    /*-----------------------------------------------------------------------*/
    // canvas转dataURL:canvas对象、转换格式、图像品质
    function canvasToDataURL(canvas, format, quality){
        return canvas.toDataURL(format||'image/jpeg', quality||1.0);
    }
    // DataURL转canvas
    function dataURLToCanvas(dataurl, cb){
        var canvas = document.createElement('CANVAS');
        var ctx = canvas.getContext('2d');
        var img = new Image();
        img.onload = function(){
            canvas.width = img.width;
            canvas.height = img.height;
            ctx.drawImage(img, 0, 0);
            cb(canvas);
        };
        img.src = dataurl;
    }
    /*-----------------------------------------------------------------------*/
    // image转canvas:图片地址
    function imageToCanvas(src, cb){
        var canvas = document.createElement('CANVAS');
        var ctx = canvas.getContext('2d');
        var img = new Image();
        img.src = src;
        img.onload = function (){
            canvas.width = img.width;
            canvas.height = img.height;
            ctx.drawImage(img, 0, 0);
            cb(canvas);
        };
    }
    // canvas转image
    function canvasToImage(canvas){
        var img = new Image();
        img.src = canvas.toDataURL('image/jpeg', 1.0);
        return img;
    }
    /*-----------------------------------------------------------------------*/
    // File/Blob对象转DataURL
    function fileOrBlobToDataURL(obj, cb){
        var a = new FileReader();
        a.readAsDataURL(obj);
        a.onload = function (e){
            cb(e.target.result);
        };
    }
    // DataURL转Blob对象
    function dataURLToBlob(dataurl){
        var arr = dataurl.split(',');
        var mime = arr[0].match(/:(.*?);/)[1];
        var bstr = atob(arr[1]);
        var n = bstr.length;
        var u8arr = new Uint8Array(n);
        while(n--){
            u8arr[n] = bstr.charCodeAt(n);
        }
        return new Blob([u8arr], {type:mime});
    }
    /*-----------------------------------------------------------------------*/
    // Blob转image
    function blobToImage(blob, cb){
        fileOrBlobToDataURL(blob, function (dataurl){
            var img = new Image();
            img.src = dataurl;
            cb(img);
        });
    }
    // image转Blob
    function imageToBlob(src, cb){
        imageToCanvas(src, function (canvas){
            cb(dataURLToBlob(canvasToDataURL(canvas)));
        });
    }
    /*-----------------------------------------------------------------------*/
    // Blob转canvas
    function BlobToCanvas(blob, cb){
        fileOrBlobToDataURL(blob, function (dataurl){
            dataURLToCanvas(dataurl, cb);
        });
    }
    // canvas转Blob
    function canvasToBlob(canvas, cb){
        cb(dataURLToBlob(canvasToDataURL(canvas)));
    }
    /*-----------------------------------------------------------------------*/
    // image转dataURL
    function imageToDataURL(src, cb){
        imageToCanvas(src, function (canvas){
            cb(canvasToDataURL(canvas));
        });
    }
    // dataURL转image,这个不需要转,直接给了src就能用
    function dataURLToImage(dataurl){
        var img = new Image();
        img.src = d;
        return img;
    }
    /*-----------------------------------------------------------------------*/
    
    // 使用示例
    
    imageToDataURL('https://www.baidu.com/favicon.ico', res=> console.log(res))
    

    参考:

  • 相关阅读:
    SWT DragSource 和 DropTarget 托拉拽
    Java的反射机制
    1. 算法导论
    SWT对于监听Tab键的理解
    SWT基础
    socket
    TCP/IP
    RPC(远程过程调用协议)
    Jython基本知识
    #与##
  • 原文地址:https://www.cnblogs.com/daysme/p/11720609.html
Copyright © 2020-2023  润新知