¿Porque el tamaño de una imagen codificada en base64 es diferente al original?

publicado por: Anonymous

Estoy usando el API de ficheros de javascript para leer imágenes usando el método readAsDataURL y me topé con que mis imágenes siempre eran más grandes que sus originales, en un caso incluso 1 MB más grande.

Este es el código que estoy usando

_x000D_

_x000D_

$(function() {_x000D_
  'use strict';_x000D_
  $('#source').on('change', function(evt) {_x000D_
_x000D_
    var reader = new FileReader();_x000D_
_x000D_
    var file = evt.target.files[0];_x000D_
    var reader = new FileReader();_x000D_
_x000D_
    reader.onloadend = function() {_x000D_
      $('#encoded').text('El tamaño codificado es ' + reader.result.length / 1024 + ' kb')_x000D_
    }_x000D_
_x000D_
    if (file) {_x000D_
      $('#original').text('El tamaño original es ' + file.size / 1024 + ' kb')_x000D_
      reader.readAsDataURL(file);_x000D_
    }_x000D_
  });_x000D_
});

_x000D_

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>_x000D_
<input id="source" type="file">_x000D_
<div id="original"></div>_x000D_
<div id="encoded"></div>

_x000D_

_x000D_

_x000D_

No sé si es que se me está escapando algo aquí o existe alguna razón para este comportamiento. Alguien sabe cuál puede ser la causa?

solución

Base64 es una representación en caracteres imprimibles de un contenido binario. Para que sea imprimible, Base64 usa un alfabeto de 64 caracteres, 6 bits por caracter.

El “desperdicio” aparece por que Base64 se almacena/transporta en bytes (como todo lo demás), por ello para cada byte que almacenas en representación Base64 necesitas 1 byte + 2 bits del siguiente byte de almacenamiento.. disco, red, memoria, etc.

Un diagrama dice mas que mil palabras:

 byte    | base 64
-------- + ---------------------------
 1 byte  | 1 byte + 2 bits.
 2 byte  | 2 byte + 4 bits.
 3 byte  | 3 byte + 6 bits = 4 bytes (recuerda, solo 6 bits)

Es decir que cada bloque de 3 bytes del archivo original se convierte en 4 bytes en formato Base64, por ello eso como mínimo el tamaño aumentara en una relación 4/3, es decir el 133%. A ello le deberás sumar el relleno (no siempre los tamaños de los archivos serán múltiplos de 3) y los retornos de carro que halla en el archivo de transferencia.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *