如何使用JavaScript将图像转换为Base64字符串?
我需要将图像转换为Base64字符串,以便将图像发送到服务器 有JavaScript文件吗?否则,我如何转换它?您可以使用,但它几乎不受支持。您可以使用HTML5: 创建一个画布,将图像加载到其中,然后使用它来获取Base64表示。实际上,它是一个data:URL,但它包含Base64编码的图像。如果您使用,它为我们提供了一种直接编码或解码Base64的方法 试试这个: 要使用dojox.encoding.base64对字节数组进行编码,请执行以下操作:如何使用JavaScript将图像转换为Base64字符串?,javascript,base64,Javascript,Base64,我需要将图像转换为Base64字符串,以便将图像发送到服务器 有JavaScript文件吗?否则,我如何转换它?您可以使用,但它几乎不受支持。您可以使用HTML5: 创建一个画布,将图像加载到其中,然后使用它来获取Base64表示。实际上,它是一个data:URL,但它包含Base64编码的图像。如果您使用,它为我们提供了一种直接编码或解码Base64的方法 试试这个: 要使用dojox.encoding.base64对字节数组进行编码,请执行以下操作: var str = dojox.enco
var str = dojox.encoding.base64.encode(myByteArray);
要解码Base64编码字符串,请执行以下操作:
var bytes = dojox.encoding.base64.decode(str);
有多种方法可供选择: 1.方法:文件阅读器 通过将图像加载为blob,并使用将其转换为: 函数toDataURLurl,回调{ var xhr=新的XMLHttpRequest; xhr.onload=函数{ var reader=新文件读取器; reader.onloadend=函数{ callbackreader.result; } reader.readAsDataURLxhr.response; }; 打开'GET',url; xhr.responseType='blob'; xhr.send; } toDataURL'https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0,functiondataUrl{ console.log'RESULT:',dataUrl
} 此代码段可以将字符串、图像甚至视频文件转换为Base64字符串数据 函数encodeImageFileAsURL{ var fileselected=document.getElementByIdinputFileToLoad.files; 如果选择了files.length>0{ var fileToLoad=fileselected[0]; var fileReader=新的fileReader; fileReader.onload=函数FileLoadedEvent{
var srcData=fileloadevent.target.result;//据我所知,图像可以通过FileReader或将其存储在canvas元素中转换为Base64字符串,然后使用toDataURL获取图像。我遇到了类似的问题,您可以参考这一点 以下是我所做的:
// Author James Harrington 2014
function base64(file, callback){
var coolFile = {};
function readerOnload(e){
var base64 = btoa(e.target.result);
coolFile.base64 = base64;
callback(coolFile)
};
var reader = new FileReader();
reader.onload = readerOnload;
var file = file[0].files[0];
coolFile.filetype = file.type;
coolFile.size = file.size;
coolFile.filename = file.name;
reader.readAsBinaryString(file);
}
下面是你如何使用它
base64( $('input[type="file"]'), function(data){
console.log(data.base64)
})
基本上,如果你的形象
<img id='Img1' src='someurl'>
请尝试以下代码:
对于文件上载更改事件,请调用此函数:
$("#fileproof").on('change', function () {
readImage($(this)).done(function (base64Data) { $('#<%=hfimgbs64.ClientID%>').val(base64Data); });
});
function readImage(inputElement) {
var deferred = $.Deferred();
var files = inputElement.get(0).files;
if (files && files[0]) {
var fr = new FileReader();
fr.onload = function (e) {
deferred.resolve(e.target.result);
};
fr.readAsDataURL(files[0]);
} else {
deferred.resolve(undefined);
}
return deferred.promise();
}
将Base64数据存储在隐藏字段中以供使用。如果您有一个文件对象,此简单功能将起作用:
function getBase64 (file, callback) {
const reader = new FileReader();
reader.addEventListener('load', () => callback(reader.result));
reader.readAsDataURL(file);
}
用法示例:
getBase64(fileObjectFromInput, function(base64Data){
console.log("Base64 of file is", base64Data); // Here you can have your code which uses Base64 for its operation, // file to Base64 by oneshubh
});
我发现最安全可靠的方法是使用FileReader 演示: 更新-与@AnniekJ请求的注释相同的代码:
下面是使用Javascript Promise的方法
const getBase64 = (file) => new Promise(function (resolve, reject) {
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result)
reader.onerror = (error) => reject('Error: ', error);
})
现在,在事件处理程序中使用它
const _changeImg = (e) => {
const file = e.target.files[0];
let encoded;
getBase64(file)
.then((result) => {
encoded = result;
})
.catch(e => console.log(e))
}
document.querySelector'input'。onchange=e=>{
const fr=新文件读取器
fr.onloadend==>document.writefr.result
fr.readAsDataURLe.target.files[0]
}
需要利用读卡器将blob转换为base64,更喜欢使用异步等待语法,因此我选择将读卡器逻辑提取到帮助器中,如下所示:
//* Convert resBlob to base64
export const blobToData = (blob: Blob) => {
return new Promise((resolve) => {
const reader = new FileReader()
reader.onloadend = () => resolve(reader.result)
reader.readAsDataURL(blob)
})
}
并在主代码中使用wait调用它:
//* Convert resBlob to dataUrl and resolve
const resData = await blobToData(resBlob)
我最终使用了一个返回
const getImg64=async=>{
const convertImgToBase64URL=url=>{
console.logurl
返回新的PromiseSolve,拒绝=>{
const img=新图像;
img.crossOrigin='匿名';
img.onload==>{
让canvas=document.createElement'canvas'
const ctx=canvas.getContext'2d'
canvas.height=img.height;
canvas.width=img.width;
ctx.drawImageimg,0,0;
const dataURL=canvas.toDataURL;
canvas=null;
resolvedataURL
}
img.src=url;
}
}
//出于演示的目的,我使用代理服务器来避免跨源错误
常量proxyUrl=https://cors-anywhere.herokuapp.com/'
const image=wait convertImgToBase64URLproxyUrl+'https://image.shutterstock.com/image-vector/vector-line-icon-hello-wave-260nw-1521867944.jpg'
console.logimage
}
GetIMG64您的图像来自何处?JS和jQ:toDataURL是否像xhr一样控制回调,如done/fail/always?我们是否可以将2个或更多画布提取为单个PNG?您是否可以制作一个jsbin或至少在此处编写一些代码?这种方法在违反CORS的情况下会失败。除此之外,此解决方案还应添加回答这个问题。我们都知道将二进制文件转换为base64会占用更多的数据,但如果不使用reader.readAsDataURL,则以这种方式使用canvas来获取base64会增加更多数据,因为在使用toDataURL时,您可能也会丢失所有图像压缩。除非您希望将每个图像转换为特定格式。当您使用画布,您还可以释放所有元数据,如:EXIF、旋转、相机、地理位置等。不使用chrome for me:源站图像****已被跨源站资源共享策略阻止加载:请求的资源上不存在“访问控制允许源站”标题。源站http://fiddle.jshell.net因此,"不允许"为了防止绊倒其他人,这个例程在返回的字符串中包含数据:image/jpg;base64,header,所以您不需要附加它。
警告2:内容有问题。在某种程度上,数据有可能被破坏/更改,尽管,也许不会太多,至少在firefox 35上的一些图像上会发生这种情况,base64与php在同一图像上创建的base64不同。是的。有些数据可能会丢失,因为我们实际上将图像绘制到画布元素,然后将其转换为dataURL。方法:FileReader 2比方法canvas工作得更快。在大照片上测试。希望它能对某些人有所帮助。它不仅很棒,而且还绕过了跨域起源问题!有了它,您可以允许用户提供自己的图像或来自URL的图像,因为Windows将自己获取图像,在画布上绘制图像,并在仍然能够使用的情况下使用它们。toDataURL等。非常感谢!您好,如何将此应用于从远程url加载的图像而不面临跨域问题?感谢这在Chrome 78.0.3904.97中有时起作用,但在其他时候它会崩溃。什么是btoa?:a=ASCII和b=Binary@DownVoter-亲爱的,如果您标记的是负数,最好也指出错误。以便有人能够改进。据我所知,dojo也是一个JavaScript库,如果允许您使用dojo,您肯定可以使用这种方法。不幸的是,这只适用于本地图像,如果您尝试使用远程图像,请从web上选择一个,它会将此信息写入firefox控制台:“SecurityError:该操作不安全”。它可以在其他图像上工作,但取决于该站点的CORS设置,并且必须指定为在firefox上,您可以临时禁用该安全性。转到关于:配置并将property privacy.file_unique_origin更改为Falshi Ravi!我看你是比较新的。除非原始海报特别要求使用jQuery、lodash等库解决方案,否则每个人最好使用简单的最小值(在本例中为纯javascript)来回答。如果您仍然想使用jQuery,请在您的条目中明确说明:如果您只想更改图像以进行预览,请使用URL.createObjectURLfile代替。我正在寻找一种方法,将Powerpoint加载项中的图像转换为base64,因为否则我无法将其添加到幻灯片中并找到您的响应。你能再给我解释一下你在这里做什么吗?我对这个相当陌生,所以我没有真正了解整个文件阅读器。只是想提供一些背景信息:我有一个字符串selectedImages,它们是.png,我想将它们转换为base64文件,然后能够将它们添加到powerpoint幻灯片中。@AnniekJ请查看我的更新答案以及每行代码上方的注释如果我将reader.result发送到WebAPI的请求正文中,我是否能够使用字节[]来使用它在api端键入?请尝试reader.readAsArrayBufferfile它提供字节数组如果您使用java,base64可以在那里转换为字节数组,请遵循示例
const getBase64 = (file) => new Promise(function (resolve, reject) {
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result)
reader.onerror = (error) => reject('Error: ', error);
})
const _changeImg = (e) => {
const file = e.target.files[0];
let encoded;
getBase64(file)
.then((result) => {
encoded = result;
})
.catch(e => console.log(e))
}
//* Convert resBlob to base64
export const blobToData = (blob: Blob) => {
return new Promise((resolve) => {
const reader = new FileReader()
reader.onloadend = () => resolve(reader.result)
reader.readAsDataURL(blob)
})
}
//* Convert resBlob to dataUrl and resolve
const resData = await blobToData(resBlob)