我有一个带有一些图像的常规HTML页面(只是常规的<img /> HTML标签)。我想得到他们的内容,base64编码最好,而不需要重新下载图像(即。它已经被浏览器加载,所以现在我想要的内容)。
我希望通过Greasemonkey和Firefox实现这一目标。
我有一个带有一些图像的常规HTML页面(只是常规的<img /> HTML标签)。我想得到他们的内容,base64编码最好,而不需要重新下载图像(即。它已经被浏览器加载,所以现在我想要的内容)。
我希望通过Greasemonkey和Firefox实现这一目标。
当前回答
这个函数接受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”)
其他回答
注意:只有当图像与页面来自相同的域,或者具有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”。
这个函数接受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”)
在HTML5中最好使用这个:
{
//...
canvas.width = img.naturalWidth; //img.width;
canvas.height = img.naturalHeight; //img.height;
//...
}
很久以后,这里没有一个答案是完全正确的。
当在画布上绘制时,传递的图像是未压缩的+所有预相乘。 当导出时,它用不同的算法解压缩或重压缩,并且不相乘。
在这个过程中,所有浏览器和设备都有不同的舍入错误 (见画布指纹)。
因此,如果有人想要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">
Shiv / shim / sham
如果你的图像已经加载(或没有加载),这个“工具”可能会派上用场:
Object.defineProperty
(
HTMLImageElement.prototype,'toDataURL',
{enumerable:false,configurable:false,writable:false,value:function(m,q)
{
let c=document.createElement('canvas');
c.width=this.naturalWidth; c.height=this.naturalHeight;
c.getContext('2d').drawImage(this,0,0); return c.toDataURL(m,q);
}}
);
. .但是为什么呢?
这样做的好处是使用“已经加载”的图像数据,因此不需要额外的请求。此外,它还允许最终用户(像您这样的程序员)决定CORS和/或mime类型和质量- or -您可以省略MDN规范中描述的这些参数/参数。
如果你已经加载了这个JS(在需要它之前),那么转换为dataURL就像这样简单:
例子
HTML
<img src="/yo.jpg" onload="console.log(this.toDataURL('image/jpeg'))">
JS
console.log(document.getElementById("someImgID").toDataURL());
GPU指纹
如果您担心比特的“精确性”,那么您可以根据@Kaiido的回答修改这个工具以满足您的需求。