【问题标题】:Javascript - get extension from base64 imageJavascript - 从 base64 图像获取扩展名
【发布时间】:2021-10-14 20:17:36
【问题描述】:

我有一个从服务返回的 base64 编码图像,它看起来像这样:

/9j/4AAQSkZJRgABAQEASABIAAD/4Yp2aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA0LjEtYzAzNiA0Ni4yNzcwOTIsIEZyaSBGZWIgMjMgMjAwNyAxNDoxNjoxOCAgICAgICAgIj4KICAgPHJkZjpSREYgeG1.... etc

我如何检测/检查图像扩展名?

【问题讨论】:

  • 这是base64中的图片代码或者图片picName/url+picName?
  • 好的,是图像代码,我可以得到这个:ÿØÿà JFIF H H ÿáŠvhttp://ns.adobe.com/xap/1.0/
  • 这是图片内容的base64,你可以在本站获取相同编码的图片例如base64-image.de

标签: javascript image base64 file-extension


【解决方案1】:

有点晚了,但问题似乎被误解了。他只有图像的 base64 内容,而不是完整的数据 URI。

我在这里写给任何遇到这个任务的人,你可以阅读内容的第一个字符content.charAt(0)。如果第一个字符是,则按base64图像内容:

'/' : jpg

'我':png

'R' : gif

'U' : webp

所以对于你的情况,它是'jpg'。

【讨论】:

  • 我来这里是为了寻找这个答案。为了完整起见,U 代表 webp
  • 虽然这对于.pdf 也应该是这样的与iT
  • 添加一个选项'P':SVG
  • 如果我也想查看视频怎么办?
  • TIF 的字符是什么?
【解决方案2】:

只是在调整字符串。可能这会有所帮助。

base64Data.substring("data:image/".length, base64Data.indexOf(";base64"))

【讨论】:

  • 这在图像进入请求正文的后端操作中很有用
【解决方案3】:

你也可以用函数链来做。

const type = base64Data.split(';')[0].split('/')[1];

【讨论】:

    【解决方案4】:

    对于String(您可以从图像中解析出来),您可以这样做:

    // Create Base64 Object
    var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}
    
    // Define the string, also meaning that you need to know the file extension
    var encoded = "Base64 encoded image returned from your service";
    
    // Decode the string
    var decoded = Base64.decode(encoded);
    console.log(decoded);
    
    // if the file extension is unknown
    var extension = undefined;
    // do something like this
    var lowerCase = decoded.toLowerCase();
    if (lowerCase.indexOf("png") !== -1) extension = "png"
    else if (lowerCase.indexOf("jpg") !== -1 || lowerCase.indexOf("jpeg") !== -1)
        extension = "jpg"
    else extension = "tiff";
    
    // and then to display the image
    var img = document.createElement("img");
    img.src = decoded;
    
    // alternatively, you can do this
    img.src = "data:image/" + extension + ";base64," + encoded;
    

    为了完整起见,这里是source,我希望这会有所帮助!

    【讨论】:

    • 嗨,谢谢,但我不明白如何返回原始图像扩展名
    • @sbaaaang 如果您已经解码了您的有效负载,即已经解码了服务器返回的 Base64 字符串,那么您将拥有与其他任何图像一样的图像。唯一的区别是,您的图像中只有数据。换句话说,图像不存储在本地,仅以编程方式存储。
    • 是的,但我如何获得解码后的文件扩展名? :D
    • @sbaaaang 我已经更新了我的答案。我承认这有点 hacky,但这是获取文件扩展名和客户端信息的唯一方法。
    • 既然有atobbtoa函数,为什么还要定义Base64对象? developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
    【解决方案5】:

    这适用于任何扩展类型:pdf、mp3、png、....

    base64.substring(base64.indexOf('/') + 1, base64.indexOf(';base64'));

    【讨论】:

      【解决方案6】:

      顺便说一句,您提供了无效的 Base64 字符串。 base64编码图像字符串的正确语法是这样的

      "data:image/png;base64,abcdefghijklmnopqrstuvwxyz0123456789......"
      

      您可以解析该字符串并从中获取信息

      const base64str = {profilepic:"data:image/png;base64,abcdefghijklmnopqrstuvwxyz0123456789"};
      let mimeType = base64str.profilepic.match(/[^:]\w+\/[\w-+\d.]+(?=;|,)/)[0];
      

      You can see demo here

      如果您只想获得扩展,您可以使用以下代码来获得该扩展。使用正则表达式解析 base64 字符串并获取扩展名。

      const body2 = {profilepic:"data:image/png;base64,abcdefghijklmnopqrstuvwxyz0123456789"};
      let mimeType2 = body2.profilepic.match(/[^:/]\w+(?=;|,)/)[0];
      

      check online working Demo here

      【讨论】:

      • 简单而不复杂,它可以工作,在真实的生产环境中你会有多少次像 OPs 这样的字符串。我只需要使用您的选项二的扩展名。
      【解决方案7】:

      有点晚了,但您可以使用 Node.JS 中的 file-type 模块来完成:

      npm 安装文件类型

      var fileType = require("file-type");
      
      var base64string = "/9j/4AAQSkZJRgABAQEASABIAAD/4Yp2aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA0LjEtYzAzNiA0Ni4yNzcwOTIsIEZyaSBGZWIgMjMgMjAwNyAxNDoxNjoxOCAgICAgICAgIj4KICAgPHJkZjpSREYgeG1";
      var base64string_buffer = Buffer.from(base64string, "base64");
      
      (async ()=>{
      
          var result = await fileType.fromBuffer(base64string_buffer);
          console.log(result);
          //Returns  { ext: 'jpg', mime: 'image/jpeg' }
      
      })();
      

      根据file-type 的npm 页面,它可以在返回的缓冲区项中找到magic number。例如,jpeg 以ff d8 开头,pdf 以25 50 44 46 开头,等等

      作为参考,这里有一个来自base64string_buffer.toString('hex').match(/../g).join(' ')的sn-p:

      ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 00 48 00 00 ff e1 8a 76 68 74 74 70 .....

      【讨论】:

        【解决方案8】:

        使用我的js函数! 它可以检查JPG,PNG,BMP等。

        /**
         * @author PiaoZhenJia
         */
        function base64FileHeaderMapper(fileBase64) {
        
            let fileHeader = new Map();
        
            //get the first 3 char of base64
            fileHeader.set("/9j", "JPG")
            fileHeader.set("iVB", "PNG")
            fileHeader.set("Qk0", "BMP")
            fileHeader.set("SUk", "TIFF")
            fileHeader.set("JVB", "PDF")
            fileHeader.set("UEs", "OFD")
        
            let res = ""
        
            fileHeader.forEach((v, k) => {
                if (k == fileBase64.substr(0, 3)) {
                    res = v
                }
            })
        
            //if file is not supported
            if (res == "") {
                res = "unknown file"
            }
        
            //return map value
            return res;
        }

        【讨论】:

          【解决方案9】:

          这个非常适合我。它将以格式'image/png'返回文件类型

              function base64MimeType(encoded) {
                var result = null;
              
                if (typeof encoded !== 'string') {
                  return result;
                }
              
                var mime = encoded.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/);
              
                if (mime && mime.length) {
                  result = mime[1];
                }
              
                return result;
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-06-18
            • 2021-01-27
            • 1970-01-01
            • 1970-01-01
            • 2021-02-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多