【问题标题】:CONVERT Image url to Base64将图像 url 转换为 Base64
【发布时间】:2014-04-06 00:38:08
【问题描述】:

使用图像文件,我得到图像的 url,需要发送到 web 服务。从那里图像必须本地保存在我的系统上。

我正在使用的代码:

var imagepath = $("#imageid").val();// from this getting the path of the selected image

that var st = imagepath.replace(data:image/png or jpg; base64"/"");

如何将图片url转成BASE64?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

HTML

<img id=imageid src=https://www.google.de/images/srpr/logo11w.png>

JavaScript

function getBase64Image(img) {
  var canvas = document.createElement("canvas");
  canvas.width = img.width;
  canvas.height = img.height;
  var ctx = canvas.getContext("2d");
  ctx.drawImage(img, 0, 0);
  var dataURL = canvas.toDataURL("image/png");
  return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
}

var base64 = getBase64Image(document.getElementById("imageid"));

此方法需要画布元素,即perfectly supported

【讨论】:

  • 我相信,当您在 JS 中创建和添加 &lt;img&gt; 时,这不起作用。因为我得到了Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.
  • @Rubinous - 请参考this question。我认为您的问题/异常与我的代码无关。否则,请随时证明我错了。
  • 这是对 OP 问题的正确答案。为了我,我想在 CSS background-image 中使用 toDataURL 的实际结果。所以,我确实需要所有前面的data:image/png;base64, 东西,所以我直接返回了dataURL 的值(我不需要RegEx 替换)。谢谢!
  • 转换部分 var dataURL = canvas.toDataURL("image/png"); return dataURL.replace(/^data:image\/(png|jpg);base64,/, ""); 在 Angular 上也很有效。
  • 你需要使用 img.naturalWidth 和 img.naturalHeight 来处理缩小的图片
【解决方案2】:

查看此答案:@HaNdTriX 的https://stackoverflow.com/a/20285053/5065874

基本上,他实现了这个功能:

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(imagepath, function(myBase64) {
    console.log(myBase64); // myBase64 is the base64 string
});

【讨论】:

  • blob 是一种处理图像的可怕方式,因为它使用“屏幕截图”来制作图像。这意味着图像的不同大小取决于用户的屏幕分辨率
  • 在我使用打字稿的情况下,它是 console.log(myBase64);显示未定义
  • @TheCrazyProfessor 您如何建议在没有 blob 的情况下解决问题?谢谢!
  • 有时它通过 CROS 源请求错误使用 HttpRequest 进行调用以从 URL 接收图像
【解决方案3】:

在今天的 JavaScript 中,这也可以工作..

const getBase64FromUrl = async (url) => {
  const data = await fetch(url);
  const blob = await data.blob();
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.readAsDataURL(blob); 
    reader.onloadend = () => {
      const base64data = reader.result;   
      resolve(base64data);
    }
  });
}

getBase64FromUrl('https://lh3.googleusercontent.com/i7cTyGnCwLIJhT1t2YpLW-zHt8ZKalgQiqfrYnZQl975-ygD_0mOXaYZMzekfKW_ydHRutDbNzeqpWoLkFR4Yx2Z2bgNj2XskKJrfw8').then(console.log)

【讨论】:

  • 您将如何使用特定的图像 mimetype 来做到这一点?
  • 从未尝试过,但我认为blob.Properties.ContentType = "image/png" 会起作用
  • 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。
【解决方案4】:

这是你的html-

    <img id="imageid" src="">
    <canvas id="imgCanvas" />

Javascript 应该是-

   var can = document.getElementById("imgCanvas");
   var img = document.getElementById("imageid");
   var ctx = can.getContext("2d");
   ctx.drawImage(img, 10, 10);
   var encodedBase = can.toDataURL();

'encodedBase' 包含图像的 Base64 编码。

【讨论】:

    【解决方案5】:

    你可以用这个:

    function ViewImage(){
     function getBase64(file) {
      return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = () => resolve(reader.result);
        reader.onerror = error => reject(error);
      });
    }
    var file = document.querySelector('input[type="file"]').files[0];
    getBase64(file).then(data =>$("#ImageBase46").val(data));
    }
    

    添加到您的输入 onchange=ViewImage();

    【讨论】:

      【解决方案6】:
      <input id="inputFileToLoad" type="file" onchange="encodeImageFileAsURL();" />
      <div id="imgTest"></div>
      <script type='text/javascript'>
        function encodeImageFileAsURL() {
      
          var filesSelected = document.getElementById("inputFileToLoad").files;
          if (filesSelected.length > 0) {
            var fileToLoad = filesSelected[0];
      
            var fileReader = new FileReader();
      
            fileReader.onload = function(fileLoadedEvent) {
              var srcData = fileLoadedEvent.target.result; // <--- data: base64
      
              var newImage = document.createElement('img');
              newImage.src = srcData;
      
              document.getElementById("imgTest").innerHTML = newImage.outerHTML;
              alert("Converted Base64 version is " + document.getElementById("imgTest").innerHTML);
              console.log("Converted Base64 version is " + document.getElementById("imgTest").innerHTML);
            }
            fileReader.readAsDataURL(fileToLoad);
          }
        }
      </script>
      

      【讨论】:

      • 这个很完美。这也是我jsfiddle.net/vibs2006/ed9j7epr的上述代码的Working Fiddle
      • 您好,如何将其应用于远程 url 而不会遇到跨域问题?
      • 我们如何将远程 url 转换为 base64?不正确的解决方案
      【解决方案7】:
      imageToBase64 = (URL) => {
          let image;
          image = new Image();
          image.crossOrigin = 'Anonymous';
          image.addEventListener('load', function() {
              let canvas = document.createElement('canvas');
              let context = canvas.getContext('2d');
              canvas.width = image.width;
              canvas.height = image.height;
              context.drawImage(image, 0, 0);
              try {
                  localStorage.setItem('saved-image-example', canvas.toDataURL('image/png'));
              } catch (err) {
                  console.error(err)
              }
          });
          image.src = URL;
      };
      
      imageToBase64('image URL')
      

      【讨论】:

        【解决方案8】:

        这是 Abubakar Ahmad 答案的打字稿版本

        function imageTo64(
          url: string, 
          callback: (path64: string | ArrayBuffer) => void
        ): void {
          const xhr = new XMLHttpRequest();
          xhr.open('GET', url);
          xhr.responseType = 'blob';
          xhr.send();
        
          xhr.onload = (): void => {
            const reader = new FileReader();
            reader.readAsDataURL(xhr.response);
            reader.onloadend = (): void => callback(reader.result);
          }
        }
        

        【讨论】:

          【解决方案9】:

          我尝试使用top answer,但它发生在Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported

          我发现这是因为cross domain problems,解决办法是

          function convert(oldImag, callback) {
              var img = new Image();
              img.onload = function(){
                  callback(img)
              }
              img.setAttribute('crossorigin', 'anonymous');
              img.src = oldImag.src;
          }
          function getBase64Image(img,callback) {
              convert(img, function(newImg){
                  var canvas = document.createElement("canvas");
                  canvas.width = newImg.width;
                  canvas.height = newImg.height;
                  var ctx = canvas.getContext("2d");
                  ctx.drawImage(newImg, 0, 0);
                  var base64=canvas.toDataURL("image/png");
                  callback(base64)
              })
          }
          getBase64Image(document.getElementById("imageid"),function(base64){
          // base64 in here.
              console.log(base64)
          });
          

          【讨论】:

            【解决方案10】:

            没关系,谢谢!

            const getBase64FromUrl = async (url) => {
              const data = await fetch(url);
              const blob = await data.blob();
              return new Promise((resolve) => {
                const reader = new FileReader();
                reader.readAsDataURL(blob); 
                reader.onloadend = function() {
                  const base64data = reader.result;   
                  resolve(base64data);
                }
              });
            }
            
            getBase64FromUrl('https://lh3.googleusercontent.com/i7cTyGnCwLIJhT1t2YpLW-zHt8ZKalgQiqfrYnZQl975-ygD_0mOXaYZMzekfKW_ydHRutDbNzeqpWoLkFR4Yx2Z2bgNj2XskKJrfw8').then(console.log)

            【讨论】:

              【解决方案11】:
              let baseImage = new Image;
              baseImage.setAttribute('crossOrigin', 'anonymous');
              baseImage.src = your image url
              
              var canvas = document.createElement("canvas");
                canvas.width = baseImage.width;
                canvas.height = baseImage.height;
                var ctx = canvas.getContext("2d");
                ctx.drawImage(baseImage, 0, 0);
                var dataURL = canvas.toDataURL("image/png");
              

              有关“启用 CORS 的图像”的其他信息:MDN Documentation

              【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-11-18
              • 2019-07-12
              • 2017-06-06
              • 1970-01-01
              • 2015-12-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多