Javascript - get extension from base64 image

后端 未结 8 1613

I have a base64 encoded image returned from a service and it looks like this:

/9j/4AAQSkZJRgABAQEASABIAAD/4Yp2aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWN         


        
相关标签:
8条回答
  • 2021-01-01 10:08

    This one Worked for me perfectly. It will return file type in format '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;
        }
    
    0 讨论(0)
  • 2021-01-01 10:10

    For a String (which you can parse out of an image) you can do this:

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

    For completion's sake here's the source and I hope this helps!

    0 讨论(0)
  • 2021-01-01 10:12

    A bit late but it seem the question was misunderstood. He just only had the base64 content of the image, not the full data URI.

    I wrote here for anyone who encounters with this quest, you can read the first character of content content.charAt(0). By base64 image content if the first char is:

    '/' : jpg

    'i' : png

    'R' : gif

    'U' : webp

    So for your case, it is 'jpg'.

    0 讨论(0)
  • 2021-01-01 10:24

    Was just tweaking with the string. May be this could help.

    base64Data.substring("data:image/".length, base64Data.indexOf(";base64"))
    
    0 讨论(0)
  • 2021-01-01 10:28

    By the way you provided invalid Base64 string. correct syntax of base64 encoded image string is like this

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

    You can parse that string and can get the information out of it

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

    You can see demo here

    and if you want to get only extensions you can use following code to get that one. using regex to parse base64 string and get the extension.

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

    check online working Demo here

    0 讨论(0)
  • 2021-01-01 10:30

    You could also do it with a function chain.

    const type = base64Data.split(';')[0].split('/')[1];
    
    0 讨论(0)
提交回复
热议问题