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

我希望通过Greasemonkey和Firefox实现这一目标。


当前回答

它的2022年,我更喜欢使用现代createImageBitmap()而不是onload事件。

*注意:图像应该是相同的来源或CORS启用

async function imageToDataURL(imageUrl) { let img = await fetch(imageUrl); img = await img.blob(); let bitmap = await createImageBitmap(img); let canvas = document.createElement("canvas"); let ctx = canvas.getContext("2d"); canvas.width = bitmap.width; canvas.height = bitmap.height; ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height); return canvas.toDataURL("image/png"); // image compression? // return canvas.toDataURL("image/png", 0.9); }; (async() => { let dataUrl = await imageToDataURL('https://en.wikipedia.org/static/images/project-logos/enwiki.png') wikiImg.src = dataUrl; console.log(dataUrl) })(); <img id="wikiImg">

其他回答

使用onload事件转换图像加载后

函数加载(img) { 让c = document.createElement('canvas') c.getContext (2 d)。drawImage(img, 0,0) 味精。innerText = c.toDataURL实现(); } Pre {word-wrap: break-word;宽度:500 px;空白:pre-wrap;} <img onload="loaded(this)" src="https://cors-anywhere.herokuapp.com/http://lorempixel.com/200/140" crossorigin="anonymous"/> < pre id =“味精”> < / >之前

在HTML5中最好使用这个:

{
//...
canvas.width = img.naturalWidth; //img.width;
canvas.height = img.naturalHeight; //img.height;
//...
}

注意:只有当图像与页面来自相同的域,或者具有crossOrigin="anonymous"属性,并且服务器支持CORS时,这才有效。它也不会给你原始文件,而是一个重新编码的版本。如果您需要结果与原始相同,请参阅Kaiido的回答。


您需要创建一个具有正确尺寸的画布元素,并使用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,/, "");
}

在旧版本(3.5左右)的Firefox上无法获取jpeg格式的图像,因此如果您希望支持该格式,则需要检查兼容性。如果编码不支持,它将默认为“image/png”。

它的2022年,我更喜欢使用现代createImageBitmap()而不是onload事件。

*注意:图像应该是相同的来源或CORS启用

async function imageToDataURL(imageUrl) { let img = await fetch(imageUrl); img = await img.blob(); let bitmap = await createImageBitmap(img); let canvas = document.createElement("canvas"); let ctx = canvas.getContext("2d"); canvas.width = bitmap.width; canvas.height = bitmap.height; ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height); return canvas.toDataURL("image/png"); // image compression? // return canvas.toDataURL("image/png", 0.9); }; (async() => { let dataUrl = await imageToDataURL('https://en.wikipedia.org/static/images/project-logos/enwiki.png') wikiImg.src = dataUrl; console.log(dataUrl) })(); <img id="wikiImg">

这个函数接受URL,然后返回BASE64图像

function getBase64FromImageUrl(url) {
    var img = new Image();

    img.setAttribute('crossOrigin', 'anonymous');

    img.onload = function () {
        var canvas = document.createElement("canvas");
        canvas.width =this.width;
        canvas.height =this.height;

        var ctx = canvas.getContext("2d");
        ctx.drawImage(this, 0, 0);

        var dataURL = canvas.toDataURL("image/png");

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

    img.src = url;
}

这样叫它: getBase64FromImageUrl(“图像/ slbltxt.png”)