toDataURL() увеличение размера файла

Когда я загружаю определенный файл в свой браузер, файл имеет тип jpeg и размер файла составляет 2 МБ, но когда я кодирую свой файл в base64 с помощью canvas.toDataURL(), размер полученного файла составляет около 9 МБ.

Почему файл в кодировке base64 в 3-4 раза больше исходного файла?

Я видел, что могу указать параметр для toDataURl(type, quality), но я не могу использовать его для файла png, только для jpeg, и я хочу png.


person simon    schedule 24.02.2015    source источник
comment
Потому что 64 меньше 256.   -  person rightfold    schedule 24.02.2015
comment
Повторим, base64 означает, что каждый байт исходного файла хранится в трех байтах текста ASCII. Таким образом, он в 3 раза больше по дизайну. Это полезно, потому что каждый байт base64 является безопасным для URL, тогда как большинство байтов в целом нет.   -  person Austin Mullins    schedule 24.02.2015
comment
Он не в 3 раза больше, а на 1/3 больше. Это связано с тем, что типичный байт кодируется 8 битами (2^8 == 256), а символ в кодировке Base64 может содержать только 6 бит (2^6 == 64). Яркий пример: btoa('hi there my friend... ;)').length (32) против 'hi there my friend... ;)'.length (24). Проблема в том, что вы начали с файла jpeg и перешли к png. Jpeg имеет сжатие с потерями, а png — без потерь (это 1/4 размера необработанного файла BMP).   -  person Pluto    schedule 24.02.2015


Ответы (1)


Bade-64 только (и всегда) увеличивает двоичное представление на 33%. Это связано с тем, что три октета распределены по четырем байтам, поэтому их значение может быть представлено в виде печатных символов ASCII и, следовательно, безопасно для транспортировки.

Окончательный размер определяется двоичным массивом, который необходимо закодировать. Кроме того, перед закодированными данными будет стоять uri-заголовок из нескольких байтов.

Файлы PNG без потерь и, как правило, больше, чем JPEG (хотя и не во всех случаях). Ожидается, что нам придется иметь дело с большими файлами, не зависящими от кодировки Base-64, используемой при использовании файлов PNG. PNG также имеет переменное сжатие, поскольку он использует gzip для сжатия данных изображения, но, к сожалению, у нас нет доступа к этому через контекстный метод.

person Community    schedule 25.02.2015
comment
Всем спасибо за ответ, я не знал всей информации, которую вы публикуете - person simon; 25.02.2015