ChatGPT解决这个技术问题 Extra ChatGPT

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

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

有没有这方面的 JavaScript 文件?否则,我该如何转换它?


Y
YakovL

您可以选择多种方法:

1.方法:文件阅读器

通过 XMLHttpRequest 将图像加载为 blob 并使用 FileReader API (readAsDataURL()) 将其转换为 dataURL

函数 toDataURL(url, 回调) { var xhr = new XMLHttpRequest(); xhr.onload = function() { var reader = new FileReader(); reader.onloadend = function() { callback(reader.result); } reader.readAsDataURL(xhr.response); }; xhr.open('GET', url); xhr.responseType = 'blob'; xhr.send(); } toDataURL('https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0', function(dataUrl) { console.log('RESULT:', dataUrl) })

此代码示例也可以使用 WHATWG fetch API 实现:

const toDataURL = url => fetch(url) .then(response => response.blob()) .then(blob => new Promise((resolve, reject) => { const reader = new FileReader() reader.onloadend = () => resolve(reader.result) reader.onerror = reject reader.readAsDataURL(blob) })) toDataURL('https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0') .then(dataUrl => { 控制台.log('结果:', dataUrl) })

这些方法:

缺乏浏览器支持

有更好的压缩

也适用于其他文件类型

浏览器支持:

http://caniuse.com/#feat=filereader

http://caniuse.com/#feat=fetch

2.方法:帆布

将图像加载到 Image-Object 中,将其绘制到未污染的画布上并将画布转换回 dataURL。

函数 toDataURL(src, callback, outputFormat) { var img = new Image(); img.crossOrigin = '匿名'; img.onload = function() { var canvas = document.createElement('CANVAS'); var ctx = canvas.getContext('2d');变量数据URL; canvas.height = this.naturalHeight; canvas.width = this.naturalWidth; ctx.drawImage(this, 0, 0); dataURL = canvas.toDataURL(outputFormat);回调(数据URL); }; img.src = src; if (img.complete || img.complete === undefined) { img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="; img.src = src; } } toDataURL('https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0', function(dataUrl) { console.log('RESULT:', dataUrl) } )

In detail

支持的输入格式:

image/pngimage/jpegimage/jpgimage/gifimage/bmpimage/tiffimage/x-iconimage/svg+xmlimage/webpimage/xxx

支持的输出格式:

image/pngimage/jpegimage/webp(铬)

浏览器支持:

http://caniuse.com/#feat=canvas

Internet Explorer 10(Internet Explorer 10 仅适用于同源图像)

3. 方法:来自本地文件系统的图像

如果要从用户文件系统转换图像,则需要采用不同的方法。使用 FileReader API

函数 encodeImageFileAsURL(element) { var file = element.files[0]; var reader = new FileReader(); reader.onloadend = function() { console.log('RESULT', reader.result) } reader.readAsDataURL(file); }


不适用于我的 chrome:Image from origin **** has been blocked from loading by Cross-Origin Resource Sharing policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://fiddle.jshell.net' is therefore not allowed access.
以防万一这绊倒了其他人,这个例程在它返回的字符串中包含“data:image/jpg;base64”标题,所以你不需要附加它。
警告 2:内容有问题。在此过程中的某个地方,数据有可能被损坏/更改(尽管可能不会太多),至少在某些图像上的 Firefox 35 上发生这种情况,base64 与 php 创建的 base64 不同图片。
是的,这是正确的。有些数据可能会丢失,因为我们实际上将图像绘制到画布元素 (developer.mozilla.org/en-US/docs/Web/API/…),然后将其转换为 dataURL (developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/…)。
方法:FileReader (2) 比方法 Canvas 工作得更快。在大照片上进行了测试。希望它对某人有所帮助。
P
Peter Mortensen

您可以使用 HTML5 <canvas>

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


toDataURL 是否像 xhr 一样控制诸如 done/fail/always 之类的回调?
我们可以将 2 个或更多画布提取为单个 PNG 吗?
这种方法在违反 CORS 的情况下失败。除此之外,这个解决方案应该解决这个问题。
我们都知道将二进制转换为base64会占用更多的数据,但是如果您不使用reader.readAsDataURL,使用canvas以这种方式获取base64会增加更多数据,因为使用toDataURL时您可能还会失去所有图像压缩。除非您希望将每个图像都转换为特定格式。当您使用画布时,您还会丢失所有元数据,例如:EXIF、旋转、相机、地理位置等
N
Neithan Max

该片段可以将您的字符串、图像甚至视频文件转换为 Base64 字符串数据。