Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JavaScript将图像转换为Base64字符串?_Javascript_Base64 - Fatal编程技术网

如何使用JavaScript将图像转换为Base64字符串?

如何使用JavaScript将图像转换为Base64字符串?,javascript,base64,Javascript,Base64,我需要将图像转换为Base64字符串,以便将图像发送到服务器 有JavaScript文件吗?否则,我如何转换它?您可以使用,但它几乎不受支持。您可以使用HTML5: 创建一个画布,将图像加载到其中,然后使用它来获取Base64表示。实际上,它是一个data:URL,但它包含Base64编码的图像。如果您使用,它为我们提供了一种直接编码或解码Base64的方法 试试这个: 要使用dojox.encoding.base64对字节数组进行编码,请执行以下操作: var str = dojox.enco

我需要将图像转换为Base64字符串,以便将图像发送到服务器

有JavaScript文件吗?否则,我如何转换它?

您可以使用,但它几乎不受支持。

您可以使用HTML5:

创建一个画布,将图像加载到其中,然后使用它来获取Base64表示。实际上,它是一个data:URL,但它包含Base64编码的图像。

如果您使用,它为我们提供了一种直接编码或解码Base64的方法

试试这个:

要使用dojox.encoding.base64对字节数组进行编码,请执行以下操作:

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)