Preguntas sobre imágenes en Base64
Formatos, tamaño, caché y los límites que importan.
¿Qué es una data URI de imagen en Base64?+
Es el archivo entero reescrito como una URL. La cadena empieza por data:image/png;base64, y todo lo que va después de la coma son los bytes del archivo escritos con el alfabeto de 64 caracteres formado por letras, dígitos, el signo más y la barra. Como la imagen viaja dentro de la referencia, lo que haya cargado la hoja de estilos o el HTML ya tiene la imagen, y no se hace una segunda petición para obtenerla.
¿Por qué Base64 y no codificación porcentual, si el SVG se codifica mejor así?+
Porque los bytes son binarios. La codificación porcentual deja intacto el ASCII imprimible y gasta tres caracteres en todo lo demás, lo que es una ganga para el marcado y un desastre para un PNG: los datos de imagen comprimidos son casi aleatorios, así que prácticamente cada byte necesitaría escape y la cadena acabaría cerca del triple del tamaño del archivo. Base64 cobra una tarifa fija de cuatro caracteres por cada tres bytes sea cual sea el contenido, y su alfabeto no necesita más escapes en CSS, HTML ni JSON. Para el SVG, que es texto, el intercambio se invierte, y por eso ese formato tiene su propia página aquí.
¿Incrustar una imagen hace que una página cargue más rápido?+
Para un recurso pequeño en la ruta crítica, normalmente sí: una petición tiene costes fijos de establecimiento de conexión, cabeceras y latencia que superan con creces a un icono de 600 bytes. Más allá de eso, la respuesta se vuelve negativa enseguida. Los bytes pasan a formar parte de un archivo que bloquea el renderizado, se vuelven a descargar cada vez que ese archivo cambia, no se pueden cargar de forma diferida ni bajar de prioridad, y no se pueden descargar en paralelo como lo haría una URL separada. Incrustar cambia una petición por peso en el lugar equivocado; solo compensa mientras ese peso es insignificante.
¿Cuánto más grande es exactamente la versión codificada?+
La carga útil ocupa ceil(bytes / 3) × 4 caracteres (un 33.3% fijo antes de redondear), más el relleno necesario para llegar a un múltiplo de cuatro, más el prefijo data:…;base64, de unos veinte bytes. Un PNG de 10 KB se convierte en unos 13.4 KB de texto. La compresión tampoco lo arregla: gzip y brotli aprovechan las repeticiones, y a una imagen ya comprimida casi no le quedan, así que recuperas un par de puntos porcentuales, no el aumento.
¿Qué formatos funcionan y cuáles no?+
PNG, JPEG, WebP, GIF, AVIF, BMP e ICO se codifican y se muestran como data URI, y también se acepta SVG, aunque su sitio es la página de SVG. HEIC es el rechazo más notable: es lo que guarda un iPhone por defecto y ningún navegador puede decodificarlo, así que codificarlo solo produciría una URI que no se muestra en ninguna parte. Con TIFF, PDF y los archivos RAW de cámara pasa lo mismo. Conviértelos primero a PNG o JPEG y codifica el resultado.
La herramienta dice que mi archivo tiene un formato distinto al de su extensión. ¿Cuál es el correcto?+
El de los bytes. Las extensiones son una convención de nombres que cualquiera puede cambiar, y los archivos se renombran constantemente: una captura PNG guardada como .jpg, un WebP descargado con el sufijo .png. Todo formato de imagen empieza con una firma fija, así que la cabecera es la que manda y es lo que usa esta página. Si escribes en la URI el tipo MIME de la extensión, los navegadores no se ponen de acuerdo sobre si analizar el contenido o fiarse de la declaración, y así es como una imagen acaba mostrándose en tu equipo y no en el de otra persona.
¿Puedo usar una data URI en un correo electrónico o como favicon?+
Como favicon, sí: <link rel="icon" href="data:image/png;base64,…"> funciona en todos los navegadores actuales y ahorra una petición en el primer pintado. El correo es lo contrario: Outlook ignora directamente las data URI y Gmail las elimina, así que las imágenes incrustadas en un correo siguen necesitando un adjunto CID o una URL alojada. También conviene saberlo: los navegadores bloquean desde 2017 la navegación directa a URL data:, así que pegar una en la barra de direcciones para comprobarla no funcionará. Usa la vista previa de arriba.
¿Hay un límite de longitud para la propia URI?+
No uno que importe en los navegadores modernos: una data URI de varios megabytes se carga desde una hoja de estilos o una etiqueta de imagen. Los límites que afectan son prácticos. Esta página limita la entrada a 10 MB porque la cadena codificada tiene que vivir en la memoria de la pestaña y en el DOM. Más allá de eso, los paquetes minificados y los source maps se vuelven ilegibles, algunos campos de CMS y bases de datos truncan los valores largos sin avisar, las DevTools se arrastran cuando inspeccionas el elemento, y cada kilobyte se vuelve a enviar con el archivo que lo contiene.