将图像 url 转换为 Base64

IT技术 javascript jquery
2021-01-30 05:41:49

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

我正在使用的代码:

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?

6个回答

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

这个方法需要canvas元素,完美支持

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

查看此答案:@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
});
@TheCrazyProfessor 您如何建议在没有斑点的情况下解决问题?谢谢!
2021-03-13 05:41:49
有时它通过 CROS 源请求错误使用 HttpRequest 进行调用以从 URL 接收图像
2021-03-20 05:41:49
blob 是一种处理图像的可怕方式,因为它使用“屏幕截图”来制作图像。这意味着图像的不同大小取决于用户的屏幕分辨率
2021-04-02 05:41:49
在我的typescript中,它是 console.log(myBase64); 显示未定义
2021-04-03 05:41:49

在今天的 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)

已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明响应满足您的需求,请将请求的模式设置为“no-cors”以在禁用 CORS 的情况下获取资源。
2021-03-17 05:41:49
您将如何使用特定图像 mimetype 执行此操作?
2021-04-11 05:41:49
从未尝试过,但我认为blob.Properties.ContentType = "image/png"会奏效
2021-04-11 05:41:49

这是你的 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 编码。

你可以用这个:

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