Я использую API файла javascript для чтения изображений с помощью метода readAsDataURL и обнаружил, что мои изображения всегда были больше, чем их оригиналы, в одном случае даже на 1 МБ больше.
Это код, который я использую
$(function() {
'use strict';
$('#source').on('change', function(evt) {
var reader = new FileReader();
var file = evt.target.files[0];
var reader = new FileReader();
reader.onloadend = function() {
$('#encoded').text('El tamaño codificado es ' + reader.result.length / 1024 + ' kb')
}
if (file) {
$('#original').text('El tamaño original es ' + file.size / 1024 + ' kb')
reader.readAsDataURL(file);
}
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="source" type="file">
<div id="original"></div>
<div id="encoded"></div>
Я не знаю, упускаю ли я что-то здесь или есть какая-то причина для такого поведения. Кто-нибудь знает, что может быть причиной?
Base64 — это печатное символьное представление двоичного содержимого. Для печати Base64 использует алфавит из 64 символов, по 6 бит на символ.
«Отходы» появляются из-за того, что Base64 хранится/переносится в байтах (как и все остальное), поэтому для каждого байта, который вы сохраняете в представлении Base64, вам нужен 1 байт + 2 бита следующего байта хранения. диск, сеть, память и т. д.
Диаграмма говорит больше, чем тысяча слов:
Иными словами, каждый 3-байтовый блок исходного файла преобразуется в 4 байта в формате Base64, так что как минимум размер увеличится в соотношении 4/3, то есть на 133%. К этому вы должны добавить отступы (размеры файлов не всегда будут кратны 3) и возврат каретки, найденные в файле передачи.
Я только что попробовал изображение следующих размеров:
Используя ваш пример, я получаю:
Перейдем к Сан-английской Википедии https://en.wikipedia.org/wiki/Base64 .
А в Сан-Википедии на испанском языке https://es.wikipedia.org/wiki/Base64
Будь то 137% или 140%, размер увеличится при использовании Base64. Ваше здоровье!
FileReader преобразует изображение в текстовую строку base64:
Принимая во внимание, что ваша переменная
file
является объектом типаFile
, который содержит изображение в двоичном формате .Для получения дополнительной информации об объекте
File
вы можете прочитать эту документацию