Python - Módulo base64


Codificar y decodificar archivos mediante base64.

El módulo base64 forma parte de la librería estándar de python, por lo que no es necesario instalarlo si ya tienes instalado python.

Para utilizar el módulo simplemente importalo en tu script:

import base64

El módulo base64 tiene dos funciones principales:


CODIFICACIÓN

Por ejemplo, para codificar el string al que hace referencia la variable txt_string:

>>> import base64
>>> txt_string = "Hola Mundo"
>>> txt_string
'Hola Mundo'
>>> txt_bytes = txt_string.encode('utf-8')
>>> txt_bytes
b'Hola Mundo'
>>> txt_b64 = base64.b64encode(txt_bytes)
>>> txt_b64
b'SG9sYSBNdW5kbw=='
>>> txt_b64_string = txt_b64.decode('utf-8')
>>> txt_b64_string
'SG9sYSBNdW5kbw=='

En este ejemplo txt_string es un str que queremos codificar. Como la función b64encode no recibe str como parámetro, sino bytes, lo primero que hemos hecho es codificar el string "Hola MUndo" en una secuencia de bytes que interpreta al literal del string como una cadena codificada en utf-8: txt_bytes = txt_string.encode('utf-8'), obteniendo así la secuencia de bytes b'Hola Mundo'.

La función b64encode puede ahora invocarse recibiendo como parámetro a txt_bytes para devolver los bytes codificados en base64: b'SG9sYSBNdW5kbw==', que almacenamos en la variable txt_b64.

Habitualmente nuestro objetivo será almacenar el resultado en un archivo de texto, por lo que finalmente debemos convertir el resultado al tipo de dato str, es decir, debemos decodificar los bytes y obtener el string correspondiente para ser almacenado: txt_b64_string = txt_b64.decode('utf-8')

En este ejemplo he utilizado la codificación-decodificación utf-8 para pasar de string a bytes y viceversa, pero podriamos haber utilizado ascii o cualquier otra codificación. Lo importante es codificar y decodificar con la misma base.


DECODIFICACIÓN

Para decodificar el string en txt_b64_string y obtener el texto original:

>>> import base64
>>> txt_b64_string = "SG9sYSBNdW5kbw=="
>>> txt_b64 = txt_b64.encode('utf-8')
>>> txt_b64
b'SG9sYSBNdW5kbw=='
>>> txt_bytes = base64.b64decode(txt_b64)
>>> txt_bytes
b'Hola Mundo'
>>> txt_string = txt_bytes.decode('utf-8')
>>> txt_string
'Hola Mundo'

Es exactamente el proceso contrario a la codificación.


EJEMPLO PRÁCTICO

La codificación de imágenes en base64 es una práctica habitual en el desarrollo web, ya que de esta manera las imágenes pueden guardarse en el propio documento html, con lo que se evitan demasiadas peticiones HTTP al servidor para obtenerlas.

Imagínate que tienes la siguiente imágen en el direcorio raíz de un sitio web: Logo de Python

En el documento html puedes cargar la imagen de la manera habitual (de libro):

<img src="python-logo.png"/>

De modo que al cargar la página, el navegador hace una petición HTTP al servidor para obtener la imágen indicada en el atributo src de la etiqueta img.

Puedes codificar la imagen a base64 para incrustarla directamente en el documento html y evitar que el navegador realize una petición HTTP para obtener la imágen. Si el documento html solicita muchas imágenes y estas están codificadas en base64 estaremos evitando muchas solicitudes al servidor, por lo que los tiempos de carga de la página mejoran considerablemente.

Para hacerlo puedes usar el siguiente script python:

import base64

with open('python-logo.png', 'rb') as f:
    image = f.read()

encoded_bytes = base64.b64encode(image)
encoded_string = encoded_bytes.decode('utf-8')

with open('python-logo-encoded.txt', 'w') as f:
    f.write(encoded_string)

Al ejecutar el script en el directorio en el que se encuentra la imagen python-logo.png se crea una archivo de texto (python-logo-encoded.txt) cuyo contenido es la imagen codificada en base64:

iVBORw0KGgoAAAANSUhEUgAAADoAAAA6CAMAAADWZboaAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMAUExURQAAAC5qmy5rnC9snTBtnTBtnjBunjRvnjFvoDJwoDNxojRwoDRyojVzpDZ0pDd0pjh1pTh1pjh2pjx1ozp3qDt4qDx4qDx4qj16qz97rEZ7p0B8rEB9rkF+rkV+rUh/q0J/sEmBrUyDrkOAsESAsUWBskWCskaDtEeEtUeEtkiEs0iFtkiGtkyGtUiGuEmIukuKvEyLvU6MvU+NvleLtFONvVaNuVWOvFyLsWeTtmKUvWmYvWmZv1WQwFeSwVmTwVyTwGGYxGSaxHCdwHKewXOfwnSfwnKgxHWgwXWgw3ShxXShxnWixXajxnemzHiiwnqjxHukxXikx3ilyH2nyX2oyv3TO/3TPP3UPP3WQf3WRf3XSv3YQ/3YRfzZSfzaTPzcTv3ZUf3aVfzcUfzdVfzfWPzfXv3eZv3fa/3fbfzgWvzhXfziYfzkYvzkZfvmavvnbPzhavzlaPvobf3hcv3hdP3ldf3ief3jff3kePvpcfvqdPzodfvrePvsfvzoePzpfYSqyYasyoWuz4itzImuzIivz4qwzoix0oyy0Y211JK0zpi3zpC00pK205G31Ze30JS41Zu60Zu81py71J691Zm82J2+2aG/2KbB16bC16LB2qLC26rH3qvI37HJ27PL37fM3LLM4LTN4LTN4rfP47vS5f3lhf3mi/3mjvzqhfzojv3nkfzukv3qmvzwl/7roP7vo/3spv7tqf7trfzwoP3wpfzyqf3zr/7ws/3xvf30vsPU4sLW5sTW48XX5MTY58fa6Mra5cvc6Mnc6s3d6M7e6tHe6NPg6tHg7dXi69Ti7dbj7tbk79/p8d/p8v7ywv7yx/30wf32xf7zy/32yf30zf74z/z10f321P332f333f741P742OLr8uXt8+Tt9Orx9ezx9e/09+70+P774v765f366P377f786/787fD09/P2+PP3+vT3+fT3+vX4+vf6+v788v799fj5+fj5+vn6+fn6+vn7/Pv8+/r8/P39+vz8/P7+/f7+/gAAACDxZOcAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRFWHRTb2Z0d2FyZQBwYWludC5uZXQgNC4wLjIx8SBplQAABVxJREFUSEuFl3tck1UYx99BkJtzAY1BIQYaiGksu9v9YlqU3XHvu2JIsopLoCiWmCUU0f1u9ytWZKmVWhaS3dHuMcJmZEEmQ6PiA5MztuO7nnPOe9neTfbw+fDH4MvvOb/ncg5cMGpgjHwIQyD4Hv1Xglzk5wiLf7U3r24qvHTu3IJrG598pf0fjKLgkSjuefoCa37+tLypubnHZmVOzDgqPWPOF1GkI1DfCydZNWSaxWxp+DdCV4viF2cScjrVnEI109JSzSlHXDyoZbXonrOt1lOe//ihGVOBzGKkGUiT6VltzhoUtYPop6IoPpObA+REWdM0wTj5b42sBsVvWK3n+QD98XhmEc02GUhj0o6xUfSaNf+0/wD97jhmLj0nIQ2GTzQZa1S9a8Cih/3iYEFWZkYYqddvi4E2k4KeUXiqpGkxmyHbCUaDXj8uJspaQSpLKJnYNrYqas7LCykolMVEDgqaCQkxUO9n11w9b95lBZfMuWj27AvPtFCLDAb9uMSEww6JwoQEAhiDuWr0TKJloWR8fBuZJDJMUpGYw6O49/Wn7r+PRFNTU2Pj3Q0NDfX19VdaFM34uLi24Q+3kNjqYYemKOq998SInk+l5sqacYAO3bGCRN2KLQEZ9X1/Lu15Ym6ONGdKE5GyJMbH6XQyWle3ZMn7RBdUUc85CqlOi1JQek4VJeSimi5gAcWXzzwBRKdPg7LkqHOWrJhLSaZaR8jq6ppVkDIXRF8zMo+kOwX6L2RaaFkYSVEqWV1TVVW1CwE6+gghZ6gHTU8nE0paAUCF1MVtG1rJJKuqKivfI6h4frhFQErTEqqp0x2+fd8KSbKysmIZBrQ3siypIU3EsoU4ek8Xk7wFyIqK/iCHvtQuMWm2WfsppO7BwPrqGposgOVON+bwS9Qi7bQorSBp6k4f2L2IShKw3On8CNDHSFmIuZnUXJizFDahYZqz/ty/SiGdpaULNyAO3cXMJWXJUNZfSlKSyWgcPz6RxpGzXvXve0s+ZTkhF7aMcKOF8p4Hkpo7+fFvBlBYHBQDrtvlZJ2UXLAcc95C5YagZOoDg+L+37rCwvXBnZI/cEoKFjuWYk68R71bgLS8LO59hw4IC6nxpGRV0rEccfgJ5VYC0vyo+MvKcBAaTy0JlQRNR1ELoGvUnjebT/bt1ZAUpF0AFZGSdRQV2d/FXPBbuSykc587uD4k1zrSeGoxCUiOCaQg/IS44GAuLQs1N6W3L+yUlGSNp/jDSAEaMYjPghtC6vls/07FHnVKWP+oyV4vCHyZn8zraoU0Zfs7VWOj+ONgkjzPbyZDF/yB3S1m2AoyesiS0Fx53mbvZwvmKkomw3AzlG0R1R/ItVQqCZO08evYbkJ/ZNO7BdYCRZUtwkoinXIByZWRPF/skfYw/moSu0QNBI0pOZ8XOnzKCv/9CrLnjfpj/J0KGSoJtZT9sdn4m9x+ZfsH0ejAjs8htoud0uKiyS7u2uWWY6cSHnxAvTjUR8KIi/nDumCxZ2h4SInA2PfriEshtV0gdIjh7xDtW8IVukXCS9IR4y3hYsmGSdppF9hioVul+SJdIE2JY0PrWsHGx0RbtVNiL2qFa34jP5+PoYpcmmQFoaQf0D67jf95dEybgrvlwYTGY11Q3Adot8Dbu8d+6AUDyzSDydtaAuJwrY0vo6+AkNA+atGvTsUfOl/g7Q21JTb+um7tIz7iFT7ivpGsH7ll6aBAlLg1J5VeMGF5IM/bxWz9yBjPC2v7vTEf8OQXsGfjzUUsV/jihbJN/XRUYpyV/diLh7o2vXnr0trb1m12D0f9VyVawtLf9iF0AHnhK4oe++h/TdNqoVoaf1AAAAAASUVORK5CYII=

Ahora puedes copiar el contenido de python-logo-encoded.txt y definir el atributo src de la etiqueta img del siguiente modo:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA6CAMAAADWZboaAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMAUExURQAAAC5qmy5rnC9snTBtnTBtnjBunjRvnjFvoDJwoDNxojRwoDRyojVzpDZ0pDd0pjh1pTh1pjh2pjx1ozp3qDt4qDx4qDx4qj16qz97rEZ7p0B8rEB9rkF+rkV+rUh/q0J/sEmBrUyDrkOAsESAsUWBskWCskaDtEeEtUeEtkiEs0iFtkiGtkyGtUiGuEmIukuKvEyLvU6MvU+NvleLtFONvVaNuVWOvFyLsWeTtmKUvWmYvWmZv1WQwFeSwVmTwVyTwGGYxGSaxHCdwHKewXOfwnSfwnKgxHWgwXWgw3ShxXShxnWixXajxnemzHiiwnqjxHukxXikx3ilyH2nyX2oyv3TO/3TPP3UPP3WQf3WRf3XSv3YQ/3YRfzZSfzaTPzcTv3ZUf3aVfzcUfzdVfzfWPzfXv3eZv3fa/3fbfzgWvzhXfziYfzkYvzkZfvmavvnbPzhavzlaPvobf3hcv3hdP3ldf3ief3jff3kePvpcfvqdPzodfvrePvsfvzoePzpfYSqyYasyoWuz4itzImuzIivz4qwzoix0oyy0Y211JK0zpi3zpC00pK205G31Ze30JS41Zu60Zu81py71J691Zm82J2+2aG/2KbB16bC16LB2qLC26rH3qvI37HJ27PL37fM3LLM4LTN4LTN4rfP47vS5f3lhf3mi/3mjvzqhfzojv3nkfzukv3qmvzwl/7roP7vo/3spv7tqf7trfzwoP3wpfzyqf3zr/7ws/3xvf30vsPU4sLW5sTW48XX5MTY58fa6Mra5cvc6Mnc6s3d6M7e6tHe6NPg6tHg7dXi69Ti7dbj7tbk79/p8d/p8v7ywv7yx/30wf32xf7zy/32yf30zf74z/z10f321P332f333f741P742OLr8uXt8+Tt9Orx9ezx9e/09+70+P774v765f366P377f786/787fD09/P2+PP3+vT3+fT3+vX4+vf6+v788v799fj5+fj5+vn6+fn6+vn7/Pv8+/r8/P39+vz8/P7+/f7+/gAAACDxZOcAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRFWHRTb2Z0d2FyZQBwYWludC5uZXQgNC4wLjIx8SBplQAABVxJREFUSEuFl3tck1UYx99BkJtzAY1BIQYaiGksu9v9YlqU3XHvu2JIsopLoCiWmCUU0f1u9ytWZKmVWhaS3dHuMcJmZEEmQ6PiA5MztuO7nnPOe9neTfbw+fDH4MvvOb/ncg5cMGpgjHwIQyD4Hv1Xglzk5wiLf7U3r24qvHTu3IJrG598pf0fjKLgkSjuefoCa37+tLypubnHZmVOzDgqPWPOF1GkI1DfCydZNWSaxWxp+DdCV4viF2cScjrVnEI109JSzSlHXDyoZbXonrOt1lOe//ihGVOBzGKkGUiT6VltzhoUtYPop6IoPpObA+REWdM0wTj5b42sBsVvWK3n+QD98XhmEc02GUhj0o6xUfSaNf+0/wD97jhmLj0nIQ2GTzQZa1S9a8Cih/3iYEFWZkYYqddvi4E2k4KeUXiqpGkxmyHbCUaDXj8uJspaQSpLKJnYNrYqas7LCykolMVEDgqaCQkxUO9n11w9b95lBZfMuWj27AvPtFCLDAb9uMSEww6JwoQEAhiDuWr0TKJloWR8fBuZJDJMUpGYw6O49/Wn7r+PRFNTU2Pj3Q0NDfX19VdaFM34uLi24Q+3kNjqYYemKOq998SInk+l5sqacYAO3bGCRN2KLQEZ9X1/Lu15Ym6ONGdKE5GyJMbH6XQyWle3ZMn7RBdUUc85CqlOi1JQek4VJeSimi5gAcWXzzwBRKdPg7LkqHOWrJhLSaZaR8jq6ppVkDIXRF8zMo+kOwX6L2RaaFkYSVEqWV1TVVW1CwE6+gghZ6gHTU8nE0paAUCF1MVtG1rJJKuqKivfI6h4frhFQErTEqqp0x2+fd8KSbKysmIZBrQ3siypIU3EsoU4ek8Xk7wFyIqK/iCHvtQuMWm2WfsppO7BwPrqGposgOVON+bwS9Qi7bQorSBp6k4f2L2IShKw3On8CNDHSFmIuZnUXJizFDahYZqz/ty/SiGdpaULNyAO3cXMJWXJUNZfSlKSyWgcPz6RxpGzXvXve0s+ZTkhF7aMcKOF8p4Hkpo7+fFvBlBYHBQDrtvlZJ2UXLAcc95C5YagZOoDg+L+37rCwvXBnZI/cEoKFjuWYk68R71bgLS8LO59hw4IC6nxpGRV0rEccfgJ5VYC0vyo+MvKcBAaTy0JlQRNR1ELoGvUnjebT/bt1ZAUpF0AFZGSdRQV2d/FXPBbuSykc587uD4k1zrSeGoxCUiOCaQg/IS44GAuLQs1N6W3L+yUlGSNp/jDSAEaMYjPghtC6vls/07FHnVKWP+oyV4vCHyZn8zraoU0Zfs7VWOj+ONgkjzPbyZDF/yB3S1m2AoyesiS0Fx53mbvZwvmKkomw3AzlG0R1R/ItVQqCZO08evYbkJ/ZNO7BdYCRZUtwkoinXIByZWRPF/skfYw/moSu0QNBI0pOZ8XOnzKCv/9CrLnjfpj/J0KGSoJtZT9sdn4m9x+ZfsH0ejAjs8htoud0uKiyS7u2uWWY6cSHnxAvTjUR8KIi/nDumCxZ2h4SInA2PfriEshtV0gdIjh7xDtW8IVukXCS9IR4y3hYsmGSdppF9hioVul+SJdIE2JY0PrWsHGx0RbtVNiL2qFa34jP5+PoYpcmmQFoaQf0D67jf95dEybgrvlwYTGY11Q3Adot8Dbu8d+6AUDyzSDydtaAuJwrY0vo6+AkNA+atGvTsUfOl/g7Q21JTb+um7tIz7iFT7ivpGsH7ll6aBAlLg1J5VeMGF5IM/bxWz9yBjPC2v7vTEf8OQXsGfjzUUsV/jihbJN/XRUYpyV/diLh7o2vXnr0trb1m12D0f9VyVawtLf9iF0AHnhK4oe++h/TdNqoVoaf1AAAAAASUVORK5CYII="/>

Observa que en el atributo src, al código base64 le hemos añadido el prefijo data:image/png;base64, para que el navegador sepa que los datos están codificados en base64 y que corresponden a una imágen de tipo png.

Si la imagen fuese de un formato distinto a png habría que indicar el mimetype correcto en src.

Podemos mejorar el script anterior para que detecte el mimetype de la imagen utilizando el módulo mimetypes:

import base64
import mimetypes

with open('python-logo.png', 'rb') as f:
    image = f.read()

encoded_bytes = base64.b64encode(image)
encoded_string = encoded_bytes.decode('utf-8')

mime = mimetypes.MimeTypes()
image_mimetype = mime.guess_type('python-logo.png')[0]

src = f'data:{image_mimetype};base64,{encoded_string}'

with open('python-logo-encoded.txt', 'w') as f:
    f.write(src)

Si ahora ejecutas el script obtendrás el atributo src para una etiqueta html img en formato base64:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA6CAMAAADWZboaAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMAUExURQAAAC5qmy5rnC9snTBtnTBtnjBunjRvnjFvoDJwoDNxojRwoDRyojVzpDZ0pDd0pjh1pTh1pjh2pjx1ozp3qDt4qDx4qDx4qj16qz97rEZ7p0B8rEB9rkF+rkV+rUh/q0J/sEmBrUyDrkOAsESAsUWBskWCskaDtEeEtUeEtkiEs0iFtkiGtkyGtUiGuEmIukuKvEyLvU6MvU+NvleLtFONvVaNuVWOvFyLsWeTtmKUvWmYvWmZv1WQwFeSwVmTwVyTwGGYxGSaxHCdwHKewXOfwnSfwnKgxHWgwXWgw3ShxXShxnWixXajxnemzHiiwnqjxHukxXikx3ilyH2nyX2oyv3TO/3TPP3UPP3WQf3WRf3XSv3YQ/3YRfzZSfzaTPzcTv3ZUf3aVfzcUfzdVfzfWPzfXv3eZv3fa/3fbfzgWvzhXfziYfzkYvzkZfvmavvnbPzhavzlaPvobf3hcv3hdP3ldf3ief3jff3kePvpcfvqdPzodfvrePvsfvzoePzpfYSqyYasyoWuz4itzImuzIivz4qwzoix0oyy0Y211JK0zpi3zpC00pK205G31Ze30JS41Zu60Zu81py71J691Zm82J2+2aG/2KbB16bC16LB2qLC26rH3qvI37HJ27PL37fM3LLM4LTN4LTN4rfP47vS5f3lhf3mi/3mjvzqhfzojv3nkfzukv3qmvzwl/7roP7vo/3spv7tqf7trfzwoP3wpfzyqf3zr/7ws/3xvf30vsPU4sLW5sTW48XX5MTY58fa6Mra5cvc6Mnc6s3d6M7e6tHe6NPg6tHg7dXi69Ti7dbj7tbk79/p8d/p8v7ywv7yx/30wf32xf7zy/32yf30zf74z/z10f321P332f333f741P742OLr8uXt8+Tt9Orx9ezx9e/09+70+P774v765f366P377f786/787fD09/P2+PP3+vT3+fT3+vX4+vf6+v788v799fj5+fj5+vn6+fn6+vn7/Pv8+/r8/P39+vz8/P7+/f7+/gAAACDxZOcAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRFWHRTb2Z0d2FyZQBwYWludC5uZXQgNC4wLjIx8SBplQAABVxJREFUSEuFl3tck1UYx99BkJtzAY1BIQYaiGksu9v9YlqU3XHvu2JIsopLoCiWmCUU0f1u9ytWZKmVWhaS3dHuMcJmZEEmQ6PiA5MztuO7nnPOe9neTfbw+fDH4MvvOb/ncg5cMGpgjHwIQyD4Hv1Xglzk5wiLf7U3r24qvHTu3IJrG598pf0fjKLgkSjuefoCa37+tLypubnHZmVOzDgqPWPOF1GkI1DfCydZNWSaxWxp+DdCV4viF2cScjrVnEI109JSzSlHXDyoZbXonrOt1lOe//ihGVOBzGKkGUiT6VltzhoUtYPop6IoPpObA+REWdM0wTj5b42sBsVvWK3n+QD98XhmEc02GUhj0o6xUfSaNf+0/wD97jhmLj0nIQ2GTzQZa1S9a8Cih/3iYEFWZkYYqddvi4E2k4KeUXiqpGkxmyHbCUaDXj8uJspaQSpLKJnYNrYqas7LCykolMVEDgqaCQkxUO9n11w9b95lBZfMuWj27AvPtFCLDAb9uMSEww6JwoQEAhiDuWr0TKJloWR8fBuZJDJMUpGYw6O49/Wn7r+PRFNTU2Pj3Q0NDfX19VdaFM34uLi24Q+3kNjqYYemKOq998SInk+l5sqacYAO3bGCRN2KLQEZ9X1/Lu15Ym6ONGdKE5GyJMbH6XQyWle3ZMn7RBdUUc85CqlOi1JQek4VJeSimi5gAcWXzzwBRKdPg7LkqHOWrJhLSaZaR8jq6ppVkDIXRF8zMo+kOwX6L2RaaFkYSVEqWV1TVVW1CwE6+gghZ6gHTU8nE0paAUCF1MVtG1rJJKuqKivfI6h4frhFQErTEqqp0x2+fd8KSbKysmIZBrQ3siypIU3EsoU4ek8Xk7wFyIqK/iCHvtQuMWm2WfsppO7BwPrqGposgOVON+bwS9Qi7bQorSBp6k4f2L2IShKw3On8CNDHSFmIuZnUXJizFDahYZqz/ty/SiGdpaULNyAO3cXMJWXJUNZfSlKSyWgcPz6RxpGzXvXve0s+ZTkhF7aMcKOF8p4Hkpo7+fFvBlBYHBQDrtvlZJ2UXLAcc95C5YagZOoDg+L+37rCwvXBnZI/cEoKFjuWYk68R71bgLS8LO59hw4IC6nxpGRV0rEccfgJ5VYC0vyo+MvKcBAaTy0JlQRNR1ELoGvUnjebT/bt1ZAUpF0AFZGSdRQV2d/FXPBbuSykc587uD4k1zrSeGoxCUiOCaQg/IS44GAuLQs1N6W3L+yUlGSNp/jDSAEaMYjPghtC6vls/07FHnVKWP+oyV4vCHyZn8zraoU0Zfs7VWOj+ONgkjzPbyZDF/yB3S1m2AoyesiS0Fx53mbvZwvmKkomw3AzlG0R1R/ItVQqCZO08evYbkJ/ZNO7BdYCRZUtwkoinXIByZWRPF/skfYw/moSu0QNBI0pOZ8XOnzKCv/9CrLnjfpj/J0KGSoJtZT9sdn4m9x+ZfsH0ejAjs8htoud0uKiyS7u2uWWY6cSHnxAvTjUR8KIi/nDumCxZ2h4SInA2PfriEshtV0gdIjh7xDtW8IVukXCS9IR4y3hYsmGSdppF9hioVul+SJdIE2JY0PrWsHGx0RbtVNiL2qFa34jP5+PoYpcmmQFoaQf0D67jf95dEybgrvlwYTGY11Q3Adot8Dbu8d+6AUDyzSDydtaAuJwrY0vo6+AkNA+atGvTsUfOl/g7Q21JTb+um7tIz7iFT7ivpGsH7ll6aBAlLg1J5VeMGF5IM/bxWz9yBjPC2v7vTEf8OQXsGfjzUUsV/jihbJN/XRUYpyV/diLh7o2vXnr0trb1m12D0f9VyVawtLf9iF0AHnhK4oe++h/TdNqoVoaf1AAAAAASUVORK5CYII=

En este ejemplo práctico hemos visto lo útil que es la codificación, pero no hemos hablado de la decodificación, ya que para este propósito (insertar imagenes en documentos html) solamente nos interesará en caso de querer modificar la imágen cuando hemos perdido el archivo de imagen original.

Con b64decode podemos reconstruir la imagen (decodificación) para editarla y posteriormente volver a codificarla para añadirla al documento html.


NOTAS FINALES

En esta web utilizo la codificación de imágenes en base64 para la mayoría de imágenes.

Solamente mantengo sin codificar aquellas imágenes que quiero que indexe el robot de google. Ten en cuenta que Google y otros rastreadores web no indexan las imágenes codificadas en base64, así que si quieres que la imagen sea visible en Google Images ya sabes lo que no tienes que hacer.

Normalmente, las imagenes que debes codificar son aquellas que forman parte de la estructura de un sitio web, no aquellas que son "ilustraciones específicas" de una página en concreto dentro del sitio.

Si quieres codificar tus imágenes sin picar código puedes utilizar la aplicación DOBase64 (Windows).

Hasta la próxima!