semapps icon indicating copy to clipboard operation
semapps copied to clipboard

Générer automatiquement des miniatures des images

Open srosset81 opened this issue 4 years ago • 11 comments

Tension Parfois les images uploadées sont énormes. Cela ralentit considérablement l'affichage des pages.

Proposition Lorsqu'un upload d'image est détecté, générer automatiquement les miniatures (thumbnails) du côté du middleware. Les lier à l'image principale via une ontologie spécifique à SemApps, pour ne pas dépendre de PAIR (cf cette issue où il a été décidé de ne pas intégrer la notion de thumbnails dans l'ontologie PAIR).

Alternatives Je n'en vois pas.

srosset81 avatar Jun 15 '21 16:06 srosset81

@simonLouvet Cette issue a-t-elle été analysée lors des travaux sur les upload d'image ?

fluidlog avatar Jan 25 '22 10:01 fluidlog

Je la transfert dans Archipelago car cela concerne les perfs, et je trouve qu'il est important d'avoir une version v1.0 ou v1.1 dans laquelle les perfs sont travaillées.

fluidlog avatar Jan 25 '22 10:01 fluidlog

Je ne suis pas d'accord, cela concerne le noyau et pas le produit

simonLouvet avatar Jan 25 '22 11:01 simonLouvet

Oui c'est noyau. Surtout que c'est une amélioration qui concerne essentiellement le middleware.

srosset81 avatar Jan 25 '22 11:01 srosset81

Je comprends votre point de vue, mais c'était de mon côté pour la mettre en priorité "Archipelago"... mais bon, tant pis, je n'insiste pas, vous êtes 2 ! :) Ou alors, on pourrait créer un label "A résoudre pour le produit archipelago" dans SemApps...

fluidlog avatar Jan 27 '22 13:01 fluidlog

Idéalement il faudrait reprendre le kanban, ça permettrait de mettre de la visibilité sur ce qui est important dans le noyau SemApps.

Malheureusement je crois pas qu'il est possible de faire des kanban cross-projets, sur une organisation. A vérifier, notamment avec la nouvelle gestion de projet Github, qui est en bêta.

srosset81 avatar Jan 27 '22 16:01 srosset81

Est-ce qu'il ne serait pas pertinent de convertir automatiquement toutes les images au format WebP ? Ce serait une belle politique écolo / basse conso non ?

https://nicolas-riviere.fr/2020/11/17/format-image-webp-performance-seo/ https://www.anthedesign.fr/creation-de-sites-internet/format-webp/

GuillaumeAV avatar Feb 14 '22 14:02 GuillaumeAV

@simonLouvet On va sans doute implémenter ça pour les Chemins de la Transition La solution qui a été implémentée dans l'ontologie PAIR (voir https://github.com/assemblee-virtuelle/pair/issues/176), c'est de définir un ImageType (p.ex. "thumbnail" pour l'image en miniature). Lorsqu'on upload une image, au lieu d'utiliser un semapps:File, on pourrait créer automatiquement plusieurs pair:Image: un pour la grande image, l'autre pour la petite image, etc. Je tagge cette issue avec "needs concertation" pour qu'on en discute à l'occasion.

srosset81 avatar Apr 29 '22 16:04 srosset81

Après réflexion, je pense que la manière la plus propre de gérer ça en évitant d'avoir du code trop spécifique (donc non standard) côté middleware, c'est de faire la compression du côté client. Il y a de bonnes librairies pour ça:

https://github.com/fengyuanchen/compressorjs (la plus populaire) https://github.com/WangYuLue/image-conversion https://github.com/Donaldcwl/browser-image-compression

Après il pourrait être intéressant de gérer automatiquement les différents formats, afin d'uploader à la fois l'image originale et l'image compressée. Mais ça pourrait être fait uniquement côté client.

Petit problème avec cette solution: cela ne permet pas de réduire les images déjà uploadées. Il faudrait donc un petit outil de migration pour le faire. Il existe plusieurs librairies sous NodeJS, mais la plus populaire et la mieux maintenue semble être https://github.com/lovell/sharp. Il y a aussi https://github.com/oliver-moran/jimp mais il n'est plus maintenu depuis 2 ans.

srosset81 avatar Jun 30 '22 10:06 srosset81

Plus concrètement, le composant ImageInput de React-Admin a une prop options dans laquelle on peut passer toutes les options de react-dropzone.

La bonne manière de faire semble être d'utiliser l'événement onDrop ou onDropAccepted pour compresser le fichier au moment où il est sélectionner.

L'autre solution serait de gérer la compression côté data provider, avec une option activable. Mais ça veut dire que toutes les images seraient compressées pareillement, alors que si on met la compression au niveau du composant, on peut avoir une gestion plus fine.

srosset81 avatar Jun 30 '22 11:06 srosset81

tu peux aussi t'nispirer de ce que j'avais fait dans collabaction, le logiciel de ParLePeuple. j'utilise Sharp

nikoPLP avatar Jun 30 '22 13:06 nikoPLP