Un utilitaire pour encoder vos images en Base64

Anthony Nelzin-Santos |

Comme son nom l'indique, Base64 Image Encoder permet d'encoder vos images en Base64 [1.0 - 0,6 Mo - 2,99 €]. Il est plus agréable à utiliser que la ligne de commande ou les services en ligne, permettant de glisser-déposer l'image, de la redimensionner et de choisir le format (PNG, JPG avec divers profils).



Base64 Image Encoder



Le codage des images en Base64 augmente leur poids, mais il permet d'inclure la ressource directement dans les fichiers HTML ou CSS : le serveur réalise ainsi un appel de moins, ce qui peut accélérer le chargement des pages web. Ces appels étant en général assez rapides, le gain n'est sensible que sur les petites images : on utilise surtout le codage Base64 pour les petites icônes ou certains détails de la charte graphique d'un site, et pas pour les grosses images utilisées une seule fois dans un article.



Après avoir encodé une image, Base64 Image Encoder permet de récupérer directement le code HTML, CSS, XML ou l'URL de la ressource et d'ainsi ne pas oublier la syntaxe spécifique à l'inclusion des images en Base64. Cette application a été développée par Oecoway, à qui l'on doit aussi Friendly, le client Facebook pour OS X.

avatar Eaglelouk (non vérifié) | 
Mouais, le problème c'est que ça pollue le code.. Je n'ose pas imaginer si les dev d'applications OS X / iOS faisaient pareil pour les ressources de leurs apps xD
avatar Gueven | 
Au pire on utilise un design pattern du style proxy pour ne pas calculer à chaque appel la représentation base64 d'un élément. Ça évite ces optimisations peu élégantes ...
avatar Domsou | 
Une autre technique – sprites CSS – consiste à regrouper toutes les images de la charte graphique (pas le contenu) en une seule image.
avatar fornorst | 
Ben justement, on fait ce calcul une fois au moment du développement, on met ça dans une feuille de style qu'on va compresser et concaténer au moment du commit, du déploiement ou du premier accès (pour éviter de le faire à chaque requête). Cette méthode évite les gros sprites qui posent souvent des problèmes de consommation mémoire. Avec certains framworks de développement web, il est même possible de mettre l'URL de l'image dans le CSS et de laisser le pre-processor s'occuper de remplacer cette URL par l'équivalent en base64. @Eaglelouk : en quoi ça pollue le code ?
avatar Domsou | 
@fornorst : Merci pour cette technique que je ne connaissais pas.
avatar Sephi-Chan | 
[quote=Eaglelouk] Mouais, le problème c'est que ça pollue le code.. Je n'ose pas imaginer si les dev d'applications OS X / iOS faisaient pareil pour les ressources de leurs apps xD [/quote] Oui mais à ce compte là, la minification pollue le code également. Mais le fait est qu'on s'en fout : ce n'est pas le code qu'on édite. Ces opérations se font généralement par des hooks au commit ou au déploiement (avec Capistrano, par exemple), généralement appuyés par les outils du framework (l'assets pipeline dans Rails, par exemple). Au final, tu édites un code lisible et maintenable, puis tu configures tes outils pour produire le résultat le plus efficace possible, moche ou non.
avatar marc_os | 
Y en a qui ont oublié que le navigateur met des images en cache local ! Ainsi, au lieu de ne télécharger chaque image de la charte graphique qu'une seule fois, ce images seront téléchargées* à chaque nouvelle page/nouveau contenu HTML ! Donc à part être une fausse bonne idée en termes de quantité de données à télécharger et de performances, c'est quoi l'avantage d'inclure ces images dans le code HTML ? (*) ces images base64 étant inclues dans le code HTML sont téléchargée à chaque fois que le code HTML est chargé.
avatar Anonyme (non vérifié) | 
les inconvénients de l'inclusion d'images en Base64 : - au premier chargement, la CSS est plus lourde et le navigateur attend la CSS pour démarrer le rendu d'une page. Il faut donc en avoir très, très peu pour que la vitesse e chargement soit quasiment la même que sans, sinon la page s'affiche plus lentement malgré quelques requêtes économisées. - si vous vous mettez au Retina, soit vous mettez les deux versions dans votre CSS et ça alourdit d'autant la CSS, soit vous ne mettez qu'une version (la devicePixelRatio = 1) et dans ce cas les appareils Retina chargent ces données pour rien. Bref, à utiliser avec beaucoup de parcimonie. Et vérifier que les gains théoriques se vérifient en pratique avec webpagetest.org, par exemple.
avatar fornorst | 
Tu n'as effectivement que peu d'intérêt à mettre ces données dans le HTML mais si tu mets ces données dans ton CSS et que ton CSS est mis en cache par le navigateur, tu auras le même niveau de cache que si tu avais mis ces images en externe. Tu auras juste une amélioration à la première visite sur la page où ton navigateur aura eu moins de resources à charger. Prenons l'exemple d'une page avec une feuille de style et 3 images. Toutes les resources ont une bonne politique de cache hormis la page HTML elle même qui n'a aucun cache. On peut distinguer 4 cas : 1/ toutes les resources sont chargées séparément 2/ les images sont mises dans un sprite 3/ les images sont stockées en base64 dans la CSS 4/ tout est stocké dans le HTML (CSS + images en base64) Cas 1 - première requête : 5 requêtes : la page HTML, la CSS et les 3 images Cas 1 - requêtes suivantes : 1 requête : la page HTML Cas 2 - première requête : 3 requêtes : la page HTML, la CSS et le sprite Cas 2 - requêtes suivantes : 1 requête : la page HTML Cas 3 - première requête : 2 requêtes : la page HTML et la CSS Cas 3 - requêtes suivantes : 1 requête : la page HTML Cas 4 - première requête : 1 requêtes : la page HTML Cas 4 - requêtes suivantes : 1 requête : la page HTML Dans les 3 premiers cas, les requêtes suivantes téléchargent le même volume d'information (une page HTML simple). La distinction se fait donc sur la première requête où la technique avec les images en base64 est meilleure que la technique avec les sprites. Dans le cas 4, la première requête est plus performante que les premières requêtes des autres cas (une seule connexion à ouvrir) mais elle est moins performante sur les requêtes suivantes (on demande au navigateur de tout re-télécharger). Par contre, dans le cas où cette page est prévue pour n'être vue qu'une seule fois, ça peut valoir le coup de tout inclure dans le HTML.
avatar mathiasr | 
Est-ce qu'on peut l'utiliser sur des images optimisées par par JPEGmini, ImageOptim ou CryoPNG sans qu'il ne touche aux optimisations déjà réalisées et se contente de faire l'encodage Base64 ?
avatar neiluj2 | 
Sass & Compass FTW http://compass-style.org/reference/compass/helpers/inline-data/
avatar Anonyme (non vérifié) | 
mathiasr : c'est le principe même de l'inclusion en base64, qui permet d'encapsuler un fichier. C'est pas un format d'image, par conséquent plus tu optimises et plus ta chaine base64 sera courte : sa taille est fonction du poids du fichier inclus.
avatar Anonyme (non vérifié) | 
fornorst : c'est plus compliqué que ça. le nombre de requêtes et le poids c'est une chose, mais pour optimiser vraiment il ne faut jamais perdre de vue le fonctionnement des navigateurs (sur le parallélisme, principalement) et la fenêtre de congestion TCP (et, quand on a plus d'un fichier HTML, une CSS et trois images, le nombre maximal de connexions simultanées par domaine, et j'en oublie). par exemple, il peut être plus intéressant d'avoir plusieurs fichiers plutôt qu'un seul s'ils peuvent être téléchargés en parallèle. mais pas forcément s'ils sont petits et que le navigateur n'a pas de connexion "chaude" de libre, ou doit en initier de nouvelles. bref, c'est compliqué.
avatar fornorst | 
@sunjohn : oui bien sûr que c'est plus compliqué que ce que j'ai noté mais bon, je n'allais pas réécrire les règles déjà bien expliquées par l'équipe Exceptionnal Performances de Yahoo! (équipe qui a réellement tracé la voie sur les perfs web) dans un post sur MacG :) J'expliquais juste qu'en fonction des cas, l'inclusion de certaines images dans la feuille de style voire dans le markup pouvait améliorer les perfs. Mais c'est évident que quand on cherche à faire un très gros site avec des temps de réponse optimaux, on se pose plein de questions ;)
avatar xDave | 
Marrant je cherchais ce genre de soft il y a 15 jours... C'est surtout intéressant dans le cadre de développement mobile web où les connexions sont plus lentes et plus instables que les "classiques" ADSL par exemple. Même si on y gagne que quelques millisecondes , le cumul est bon à prendre Maintenant l'intégration de ces optimisations n'est pas évidente dans le maintien et la lecture du code, je trouve. C'est vraiment la dernière optimisation que je ferai avant compression. Et en s'assurant un bon doublon avec les références des images.
avatar fornorst | 
@xDave : voilà à quoi ressemble un bout d'une de mes CSS sur un projet Symfony2 utilisant Assetic pour la gestion des CSS et JS et utilisant le filtre cssembed pour gérer les images en data-uri : #opening-hours-layer h3 { background: transparent url('/bundles/kbrwregularwebsite/images/opening-hours-layer-blue-arrow.png') 0 } Ca ne me semble pas si problématique pour "le maintien et la lecture du code", si ? :) Au moment, du déploiement, je n'ai qu'à lancer la commande "php app/console assets:deploy" et c'est fini. Et vu que je déploie en automatique, aucun risque que j'oublie de le faire. Ainsi mes utilisateurs voient le site s'afficher plus vite et ça ne me coûte rien à moi développeur :)
avatar Malcolmm | 

zut erreur

CONNEXION UTILISATEUR