yua*_*uan 3 javascript base64 blob image
我有一些问题要fileinputjs.The图像SRC是blob.But我想使用的图像SRC做something.So我使用readAsDataURL得到base64.But有关于它的任何问题.
<script type="text/javascript">
$("#last").click(function(){
var blob=document.querySelector(".file-preview-image").src;
var reader = new FileReader(); //?? FileReader ??blob??
reader.onload = function(){
this.result === dataURI; //base64??
}
console.log(reader.readAsDataURL(blob));
})
</script>
Run Code Online (Sandbox Code Playgroud)
然后有Uncaught TypeError: Failed to execute 'readAsDataURL' on 'FileReader': parameter 1 is not of type 'Blob'.
这里有很多误解.
blob不是一个Blob,而是一个字符串,它的url .file-preview-image.onload回调中,您只是检查结果是否等于未定义的变量.那不会做任何事情.dataURIconsole.log调用readAsDataURL这将是undefined因为这种方法是异步的(你要调用console.log回调).但是,因为我想,你有什么是对象的url(blob://),那么你的解决方法是,获得真正的Blob对象,并把它传递给一个FileReader,或在画布上画出这个图像,然后调用它的toDataURL方法来得到一个base64编码版.
如果你能得到blob:
var dataURI;
var reader = new FileReader();
reader.onload = function(){
// here you'll call what to do with the base64 string result
dataURI = this.result;
console.log(dataURI);
};
reader.readAsDataURL(blob);
Run Code Online (Sandbox Code Playgroud)
除此以外 :
var dataURI;
var img = document.querySelector(".file-preview-image");
var canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
canvas.getContext('2d').drawImage(img, 0,0);
dataURI = canvas.toDataURL();
Run Code Online (Sandbox Code Playgroud)
但请注意,对于后者,您必须等待图像实际上已加载,然后才能在画布上绘制它.
此外,默认情况下,它会将您的图像转换为png版本.如果原始图像是JPEG格式,您也可以image/jpeg作为第一个参数传递toDataURL('image/jpeg').
如果图像是svg,那么使用该<object>元素会有另一种解决方案,但除非你真的需要它,否则我会把它留给另一个答案.