小编典典

在 JavaScript 中获取图像数据 URL?

all

我有一个带有一些图像的常规 HTML 页面(只是常规的<img />HTML
标签)。我想获得他们的内容,最好是base64编码,而不需要重新下载图像(即它已经被浏览器加载,所以现在我想要内容)。

我很想用 Greasemonkey 和 Firefox 来实现。


阅读 99

收藏
2022-03-31

共1个答案

小编典典

注意: 这仅适用于图像来自与页面相同的域,或者具有crossOrigin="anonymous"属性并且服务器支持
CORS。它也不会给你原始文件,而是一个重新编码的版本。如果您需要结果与原始结果相同,请参阅答案。
在画布上绘制时,传递的图像是未压缩的 + 全部预乘。
导出时,其未压缩或使用不同的算法重新压缩,并且未相乘。

在此过程中,所有浏览器和设备都会发生不同的舍入错误
(请参阅画布指纹)。

因此,如果想要一个图像文件的 base64 版本,他们必须再次请求它(大部分时间它将来自缓存)但这次是作为 Blob。

然后,您可以使用FileReader将其作为 ArrayBuffer 或 dataURL 读取。

function toDataURL(url, callback){
    var xhr = new XMLHttpRequest();
    xhr.open('get', url);
    xhr.responseType = 'blob';
    xhr.onload = function(){
      var fr = new FileReader();

      fr.onload = function(){
        callback(this.result);
      };

      fr.readAsDataURL(xhr.response); // async call
    };

    xhr.send();
}

toDataURL(myImage.src, function(dataURL){
  result.src = dataURL;

  // now just to show that passing to a canvas doesn't hold the same results
  var canvas = document.createElement('canvas');
  canvas.width = myImage.naturalWidth;
  canvas.height = myImage.naturalHeight;
  canvas.getContext('2d').drawImage(myImage, 0,0);

  console.log(canvas.toDataURL() === dataURL); // false - not same data
  });
<img id="myImage" src="https://dl.dropboxusercontent.com/s/4e90e48s5vtmfbd/aaa.png" crossOrigin="anonymous">
<img id="result">

您将需要创建具有正确尺寸的画布元素并使用该drawImage函数复制图像数据。然后您可以使用该toDataURL函数获取具有 base-64
编码图像的 data: url。请注意,图像必须完全加载,否则您将返回一个空(黑色,透明)图像。

会是这样的。我从未编写过 Greasemonkey 脚本,因此您可能需要调整代码以在该环境中运行。

function getBase64Image(img) {
    // Create an empty canvas element
    var canvas = document.createElement("canvas");
    canvas.width = img.width;
    canvas.height = img.height;

    // Copy the image contents to the canvas
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0);

    // Get the data-URL formatted image
    // Firefox supports PNG and JPEG. You could check img.src to
    // guess the original format, but be aware the using "image/jpg"
    // will re-encode the image.
    var dataURL = canvas.toDataURL("image/png");

    return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
}

获取 JPEG 格式的图像不适用于旧版本(大约 3.5)的
Firefox,所以如果你想支持它,你需要检查兼容性。如果不支持编码,则默认为“image/png”。

2022-03-31