2015-02-24 180 views
0

当我在浏览器中上传某个文件时,文件类型为jpeg,文件大小为2MB,但是当我使用canvas.toDataURL()将文件编码为base64时,生成的文件的大小约为9MB。toDataURL()文件大小增加

为什么base64编码文件比原始文件大3-4倍?

我已经看到,我可以指定一个选项toDataURl(type, quality),但我不能将它用于png文件,仅用于jpeg,而我想要一个png。

+1

因为64小于256. – rightfold 2015-02-24 16:05:40

+2

要重申,base64意味着原始文件的每个字节都存储在三个字节的ASCII文本中。因此,它的设计大了3倍。这很有用,因为base64的每个字节都是URL安全的,而大多数字节通常不是。 – 2015-02-24 16:11:00

+0

它不是3倍大,它是大三分之一。这是因为一个典型的字节被编码为8位('2^8 == 256'),而Base64编码的字符只能保存6位('2^6 == 64')。一个明显的例子是:'btoa('你好我的朋友...;)')。length(** 32 **)对''你好我的朋友...;)'。length'(** 24 **)。这里的问题是你从一个jpeg文件开始并进入png。 Jpeg有损压缩,PNG无损(它是原始BMP文件的1/4)。 – Pluto 2015-02-24 16:57:00

回答

0

Bade-64只会(并且总是)将二进制表示法放大33%。这是因为三个八位字节分布在四个字节中,因此这些字节的值可以表示为可打印的ASCII字符,因此是安全的。

最终大小由需要编码的二进制数组确定。此外,还会有一个预编码数据的几个字节的uri头。

PNG文件没有损失,并且往往比JPEG大(但并非所有情况下)。预计我们将不得不在独立于使用PNG文件的Base-64编码时处理更大的文件。由于PNG使用gzip压缩图像数据,因此PNG也具有可变压缩,但不幸的是,我们无法通过上下文方法访问它。

+0

谢谢大家的回复,我不知道你发布的所有信息 – simon 2015-02-25 09:14:11