如果src是base64字符串,如何获取新创建的Image()的文件大小?

kov*_*ack 6 javascript image coffeescript

new Image()如果此图像srcbase64数据图像,如何获得新创建的字节大小?

我有这样的coffeescript代码:

# This string is received after some original image preprocessing
base64String = "data:image/jpeg;base64......"

newImageObj = new Image()
newImageObj.src = base64String
newImageObj.onload = ->
  console.log "Resized image width is " + this.width
  console.log "New file size in bytes is " + newImageObj.fileSize
Run Code Online (Sandbox Code Playgroud)

输出总是这样:

Resized image width is 500
New file size in bytes is undefined
Run Code Online (Sandbox Code Playgroud)

newImageObj.fileSize总是如此undefined.

m e*_*m e 15

这是从 base64 字符串中查找文件大小的算法:

base64String = "data:image/jpeg;base64......";

var stringLength = base64String.length - 'data:image/png;base64,'.length;

var sizeInBytes = 4 * Math.ceil((stringLength / 3))*0.5624896334383812;
var sizeInKb=sizeInBytes/1000;
Run Code Online (Sandbox Code Playgroud)

  • 这个公式是正确的,但理由却是错误的,因此过于复杂。Base64 将 3 个字节的二进制数据编码为 4 个字符。因此,要获得原始数据的大小,只需将 stringLength(减去标头)乘以 3/4。上面的答案犯了乘以 4/3 的错误。0.5624896334383812 魔术常数可以纠正该错误(4/3 * 0.5624896334383812 = 3/4)。 (13认同)
  • 因此,真正的公式是 Math.ceil(stringLength / 4) * 3,如果字符串长度不是 4 的倍数或者以填充结尾(如果您想更加精确),则减去 1 或 2 个字节。末尾缺少 1 个字符或 1 个 =:要删除 1 个字节。末尾缺少 2 个字符或 ==:要删除 2 个字节。它不能缺少 3 个字符或以 === 结尾。 (7认同)
  • 您使用的常数 4、3 和 0.5624896334383812 有何意义? (6认同)
  • 非常接近:) 1024 (4认同)

Jos*_*son 8

我个人会使用类似的方法来执行上述操作,在数据格式不正确的情况下它将正常工作(例如,缺少“=”,通常无论如何都会正确解码)

new Buffer(base64String, 'base64').length
Run Code Online (Sandbox Code Playgroud)

  • 啊,这是节点。正在寻找前端解决方案。感谢您的澄清! (6认同)