Quelle est la taille de fichier «optimale» des images JPEG par rapport à leurs dimensions?

10

J'ai l'intention d'écrire un script qui numérisera plus de 100 000 images JPEG et les recompressera si elles sont «trop grandes» en termes de taille de fichier. Les scripts sont la partie la plus facile, mais je ne sais pas comment catégoriser une image comme étant "trop ​​grande".

Par exemple, il existe une image 2400x600px avec une taille de fichier de 1,81 Mo. La commande Enregistrer pour le Web de Photoshop crée un fichier de 540 Ko avec une qualité de 60 et les mêmes dimensions. Cela représente environ 29% de la taille d'origine.

Maintenant, je pense à utiliser ces chiffres comme ligne directrice. Quelque chose comme 540 Ko / (2 400 * 600/1 000 000) = 375 Ko par mégapixel. Toute image plus grande que celle-ci est considérée comme grande. Est-ce la bonne approche ou y en a-t-il une meilleure?

Édition 1: les images doivent être optimisées pour être affichées sur des sites Web.

Edit 2: Je peux déterminer la qualité de sortie souhaitée en expérimentant, j'ai besoin de savoir si les images sont grandes en termes de taille de fichier par rapport aux dimensions et doivent être enregistrées en qualité inférieure.

Salman A
la source
1
Le premier commentaire de xiota devrait être la réponse! btw, quelle est votre priorité? si pour une raison quelconque vous avez juste besoin de petits fichiers, la qualité peut parfois en souffrir. il est facile de créer des fichiers jpeg déraisonnablement gros sans gain perceptible de qualité. détecter et recompresser de telles images est une bonne idée, utilisez simplement le paramètre de qualité jpeg, comme l'a dit xiota.
szulat le
18
"Optimal" dans quel but ? Même dire «utilisation du Web» est un peu large ces jours-ci. Les téléspectateurs attendus vont-ils regarder les images sur un téléphone compact? Un smartphone plus grand? Un pad ou une tablette? Un ordinateur portable? Un grand écran d'ordinateur? Un téléviseur 60K 8K? Un jumbotron?
Michael C
2
Si le script est la partie facile, voici ce que j'essaierais dans votre situation: définissez une limite définie numériquement à laquelle l'image compressée peut différer de l'original (par exemple, somme de la différence de luminosité de chaque pixel). Commencez avec une qualité inférieure (comme 60), exportez et si la différence par rapport à l'original est trop élevée, exportez à nouveau avec une qualité supérieure jusqu'à ce que votre condition de qualité soit satisfaite (vous devrez peut-être modifier le calcul - utilisez une échelle exponentielle ou quelque chose de plus sophistiqué pour obtenir le meilleur résultat).
Pavel

Réponses:

4

En moyenne , le sweet spot de JPEG est d'environ un bit par pixel .

Cela variera bien sûr en fonction du contenu de l'image, car certains types de graphiques (par exemple les zones planes et les dégradés lisses) se compressent mieux que d'autres (bruit, texte), ce n'est donc pas une méthode robuste pour appliquer aveuglément à chaque image.

Vous avez également un problème de ne pas avoir d'image de référence non compressée avec laquelle comparer, donc vous ne savez pas vraiment avec certitude quelle est la qualité actuelle des images que vous avez, et combien plus vous pouvez réduire la qualité pour être toujours acceptable. La qualité peut être devinée dans une certaine mesure à partir des tableaux de quantification en JPEG, mais ce n'est pas non plus une méthode fiable (en particulier, le jugement de qualité d'ImageMagick est très incorrect pour les JPEG avec des tableaux de quantification personnalisés et optimisés).

Cela dit, il existe une approche pratique raisonnable:

  1. Choisissez un paramètre de qualité JPEG maximum qui vous convient (quelque part dans une plage de 70 à 85).
  2. Recompressez les images à ce niveau de qualité.
  3. Si l'image recompressée est plus petite de plus de ~ 10% , conservez l'image recompressée.

Il est important de ne pas choisir simplement la plus petite taille de fichier et de demander à la place une baisse significative de la taille du fichier. En effet, la recompression du JPEG a tendance à toujours réduire légèrement la taille du fichier en raison de la perte de détails causée par la nature avec perte du JPEG et de la conversion en RVB 8 bits, donc de petites baisses de la taille du fichier peuvent avoir une baisse disproportionnée de la qualité qui ne vaut pas la peine il.

Kornel
la source
4
C'est exactement ce que j'ai fait au final. J'ai utilisé le bit par pixel comme guide pour filtrer 30 000 images sur 100 000+ et les recompresser en utilisant imagemagick avec une qualité de 85%. Si l'image résultante était plus de 50% plus petite, j'ai conservé la nouvelle. Cela a fonctionné dans mon cas car les "grandes images" ont été créées à l'aide de Photoshop en utilisant une qualité à 100%. Les 70 000 autres images étaient OK en termes de taille de fichier et leur recompression n'a pas généré suffisamment d'économies (en pourcentage) ou il y a eu une perte de qualité notable.
Salman A
1
J'aime votre deuxième paragraphe, mais avez-vous un support pour la règle empirique d'un bit par pixel (compression 24 ×) avec laquelle vous menez?
Veuillez lire mon profil le
30

La taille des fichiers compressés avec JPEG varie en fonction de la complexité de l'image. Si vous essayez de contrôler la taille des fichiers comme vous le décrivez, la qualité d'image perçue sera très variable.

Considérez plutôt les options suivantes:

  • L'approche suffisante.  Utilisez un paramètre de qualité que vous trouvez acceptable, comme 75. Comparez la taille du résultat avec l'image d'origine et conservez le fichier plus petit. Voir Quelle qualité choisir lors de la conversion en JPG?

  • Utilisez un minimiseur JPEG , comme JPEGmini ou à jpeg-recompresspartir de jpeg-archive . Ils sont essentiellement conçus pour faire ce que vous semblez essayer de faire, mais avec une meilleure connaissance des internes de l'algorithme JPEG.

  • Générez des miniatures de différentes tailles , comme le suggère Nathancahill , du point de vue du développeur Web.

xiota
la source
7
Ou si vous voulez aller "extrême" sur la minimisation JPEG, guetzli . Notez les besoins en mémoire et en temps.
Philip Kendall
2
J'ai essayé le guetzli, mais je n'ai pas été très impressionné. Il est très lent et ne réduit les tailles que de 20 à 30%. Avec jpeg-recompress, les fichiers peuvent être réduits de 80% avec l'algorithme smallfry.
xiota
18

Non, c'est une mauvaise approche.

La taille du fichier en pixels, oui, a quelque chose à voir avec le poids final, mais ce n'est pas le seul facteur.

Faites un test. Prenez un fichier complètement blanc du même 2400x600px et enregistrez-le en JPG.

Maintenant, prenez une photo d'une forêt (même 2400x600px) avec beaucoup de détails et enregistrez-la. Ce fichier sera plus volumineux en utilisant les mêmes paramètres de compression.

La taille finale dépend de ces 3 facteurs:

  • Taille de pixel
  • Paramètres de compression
  • Contenu (détail et complexité de l'image)

Vous ne pouvez donc pas et ne devez pas définir le poids en fonction de la taille des pixels.


Mais je comprends votre problème.

Sans analyser la compression actuelle de l'image, il est difficile de définir le poids "optimal" (qui est relatif à l'observateur, ou à l'utilisation des images)

Vous pouvez probablement définir un paramètre de compression et recompresser "chacun d'eux". Je ne sais pas si vous voulez le faire avant de "télécharger", ce qui vous fera probablement gagner plus de temps que le fait d'en ignorer certains.

Il existe des outils qui analysent une image et calculent le taux de compression actuel. Mais je doute que ce soit si important.

Rafael
la source
Je comprends la partie sur l'image blanche vs l'image de la forêt. Recommanderiez-vous que je prenne un échantillon aléatoire d'images, que je les enregistre à nouveau en utilisant Photoshop (qualité 70) et que j'utilise le plus grand rapport pixel: taille de fichier comme référence? J'imagine que ceux avec un ratio inférieur seraient ceux avec moins de détails.
Salman A
Concernant votre dernière phrase. Le taux de compression est en fait à peu près ce que l' OP est calculait car il est jpeg size / raw sizeet raw size = pixel size * number of pixel, pixel sizeétant 3 octets pour un espace colorimétrique RVB 24 bits. Et comme vous le dites vous-même, cette métrique ne suffit pas pour déterminer si une image est suffisamment compressée.
zakinster
9
@SalmanA Non, je suggère que vous abandonniez complètement cette approche. Les fichiers JPEG sont aussi grands qu'ils doivent l'être pour donner la qualité spécifiée. Votre proposition de voir la taille de la plus grande image de votre échantillon avec une qualité de 70% consiste simplement à choisir un niveau de complexité d'image et à dire "Tout ce qui est plus complexe que cela est trop complexe et sera dégradé." Cependant, si presque toutes les images sont plus petites que ce seuil à 70% de qualité, quel est le problème avec un petit nombre de fichiers "trop ​​gros"?
David Richerby
Cela semble correspondre à une conclusion à laquelle je suis arrivé lorsque j'envisageais une approche pour déterminer laquelle d'une série de photos d'un sujet identique mais de résolutions et de qualités différentes était la "meilleure" (par exemple, la plus proche de l'original).
Michael
10

Développeur Web ici. Voici comment j'aborderais ceci:

1. Déterminez les dimensions de l'image affichées et les résolutions d'écran requises.

Votre première tâche consiste à déterminer à quelle taille de pixel les images seront affichées. S'agit-il de photos de produits dans une boutique en ligne? Une galerie photo? Photos de profil d'utilisateur? Plusieurs tailles différentes? Faites une liste des dimensions en pixels dont vous aurez besoin. Vérifiez si vous aurez besoin d'images @ 2x pour les écrans haute résolution comme les téléphones et tablettes récents.

2. Utilisez un script de miniature pour créer de nouveaux fichiers image.

On les appelle des scripts de vignettes, mais ils peuvent être utilisés pour bien plus que de simples vignettes. Il existe de nombreux scripts ou vous pouvez écrire les vôtres. En ne redimensionnant pas les fichiers d'origine, vous pouvez le refaire si vous faites une erreur dans votre script ou réalisez que vous avez besoin d'une image de résolution supérieure. Une pratique courante consiste à spécifier un suffixe dans le nom du fichier de sortie. Par exemple:

lena.jpg (Original, 2000x3000)
lena-thumb.jpg (100x150)
[email protected] (200x300)
lena-product.jpg (400x600)
[email protected] (800x1200)

3. Compressez.

Le script de vignette doit spécifier la compression jpg lorsque vous coupez les nouveaux fichiers image. Cependant, il existe d'autres minificateurs qui pourraient réduire encore la taille du fichier.

nathancahill
la source
Voilà comment cela se passera à l'avenir: demandez aux photographes de placer des originaux haute résolution dans un répertoire, puis utilisez un script pour générer des tailles plus petites (miniatures de différentes tailles et plus grandes pour le bureau et le mobile) et placez-les sous www avec url réécriture. Mais pour l'instant, je n'ai pas accès aux originaux.
Salman A
6

Alors que la réponse de @ Rafael a expliqué les compressions JPEG entrantes et sortantes, je vais essayer de répondre à votre site Web et de télécharger problématique.

L'utilisation d'une image dans un site Web (pour la conception ou le contenu) dictera certains impératifs: à quoi mon image sera-t-elle utilisée? Logo, photo de couverture, miniature, photo dans un article de blog, photo plein écran pour une galerie ... Aussi, si vous l'utilisez à des fins multiples (par exemple une photo et sa miniature de galerie), vous souhaitez la décliner dans toutes les tailles requises. Cependant, à moins que vous ne construisiez votre propre site Web, la plupart des services Web génèrent de nos jours des images de plus petite taille à partir de votre image plus grande à utiliser sur place.

Maintenant que vous connaissez le but de votre image, le site Web (ou CMS ou Framework frontal) aura toujours besoin d'une taille maximale en pixels pour que votre image soit conforme. Les logos peuvent être 600x600px max, la couverture d'arrière-plan peut être 1280x720px max, la photo de contenu pour un affichage plein écran 1920x1080 ou la résolution native de la caméra pour une conservation absolue des détails. Vérifiez la taille correcte sur le site Web sur lequel vous souhaitez télécharger. Vous souhaitez correspondre au moins à la taille de pixel maximale requise, selon le rapport que vous souhaitez atteindre. Attention, certains services recadreront et étireront votre image si le rapport d'aspect n'est pas le même. Dans ce cas, vous devrez recadrer votre image pour l'adapter à la taille et au rapport maximum requis.

Ensuite, le site Web peut imposer une limite de taille de fichier (ou non, selon l'objectif de l'image). En ce qui concerne le temps de chargement des pages, le plus léger sera le mieux. Dans votre exemple d'image haute résolution à 2400x600px, 300 à 500 Ko est une taille totalement fine pour le temps de chargement. Les images de contenu (telles que les photos) peuvent être plus lourdes si l'objectif de l'image l'exige (par exemple un affichage plein écran), jusqu'à la résolution native de votre appareil photo si nécessaire. Si aucune indication n'est donnée, la taille limite du fichier peut être difficile à deviner, car elle peut dépendre de l'équipement du public (mobile, ordinateur de bureau ...), de la qualité du réseau du pays du public ... Pour une qualité et un service maximum, traitez les photos une par une pour obtenir la taille de fichier minimale sans artefacts visibles. Pour des raisons de commodité ou de vitesse, le script est redimensionné en utilisant un niveau de compression globalement satisfaisant (environ 70 devrait convenir).La réponse de @ xiota pourrait également être l'outil dont vous avez besoin. Définissez votre propre norme ici.

TL; DR l'objectif de l'image sur le site Web est essentiel pour la taille de redimensionnement / compression.

jihems
la source
3

Ce que vous calculez est la taille moyenne compressée d'un pixel d'image, si vous divisez cela par la taille du pixel brut (généralement 3 octets pour un RVB 24 bits), vous obtenez le taux de compression.

C'est une bonne métrique qui vous donne des informations sur l'état de compression de l'image, mais ce n'est pas suffisant pour juger si l'image est suffisamment compressée ou non car le taux de compression ne dépend pas uniquement du profil de compression (algorithme = JPEG, qualité = 60/100) mais aussi sur le potentiel de compression de l'image: des images différentes avec la même taille brute et le même profil de compression donneront une taille jpeg différente car les images sont plus ou moins faciles à compresser (une image vierge est très facile à compresser, blanc le bruit ne l'est pas).

Pour cette raison et parce que le profil de qualité «dernière utilisation» n'est pas stocké dans cette image (ni dans les métadonnées ni dans la structure d'en-tête jpeg), l'approche la plus utilisée lors de la republication d'images avec un profil de taille / qualité cible consiste en fait à recompresser (et redimensionner potentiellement) tout (automatiquement) quel que soit l'état initial de l'image.

Oui, vous pouvez recompresser quand ce n'est pas nécessaire, oui, vous pouvez même perdre de l'espace si vous recompressez avec un profil de qualité supérieure, mais ce sont des cas marginaux et à grande échelle, c'est la chose la plus simple à faire pour assurer un profil de qualité cible. Bien sûr, vous ne voulez le faire qu'une seule fois afin de ne pas dégrader progressivement les images, et vous devez probablement stocker deux bibliothèques d'images: la première "intacte" et la "à publier / recompresser".

Il existe de nombreux outils pour recompresser un tas de fichiers, vous pouvez également créer votre propre script et en utilisant la bonne pile technique (C ++ et libjpeg principalement), cela peut être sacrément rapide même pour des fichiers> 100k.

Si vous souhaitez implémenter un processus plus intelligent / plus complexe, vous pouvez essayer d'expérimenter une logique de recompression / comparaison itérative de la taille pour estimer le profil de qualité d'origine (la recompression avec la même qualité devrait donner à peu près la même taille, avec une la qualité devrait augmenter légèrement la taille et avec une qualité inférieure devrait diminuer considérablement la taille). Cela consommerait bien sûr beaucoup plus de puissance CPU.

zakinster
la source
Les images JPG sous-échantillonnent généralement la saturation avec 4: 2: 2 ou 4: 2: 0 ( en.wikipedia.org/wiki/Chroma_subsampling#4:2:2 ), donc les pixels "bruts" que JPG compresse ont 2x ou 4x autant de pixels luma que chaque canal de chrominance. (Coupé en deux horizontalement et peut-être aussi verticalement). Vous voudrez peut-être en tenir compte lorsque vous envisagez la "compression" d'une image. Mais oui, comme vous le dites, ce n'est pas une bonne métrique pour le contenu d'image inconnu.
Peter Cordes
+1 pour le redimensionnement. À un certain point, vous obtenez une meilleure qualité d'image en réduisant l'échelle qu'en réduisant encore plus les bits par pixel. Contrairement aux codecs vidéo modernes comme h.264 ou h.265 (qui peuvent signaler au décodeur de faire plus de lissage et de déblocage) ou la version d'image fixe, HEIF, qui est une image I HEVC (h.265) , JPEG ne fonctionne pas '' Je n'ai rien de tout cela et j'obtiendrai juste des blocs avec beaucoup d'artefacts de sonnerie si vous le privez de morceaux. Vous devez donc réduire l'échelle au lieu de simplement réduire la qualité si vous avez des images d'entrée à très haute résolution.
Peter Cordes
2
For example there is a 2400x600px image with a file size of 1.81MB.
Photoshop's save for web command creates a 540KB file at 60 quality and same dimensions.    
This is about 29% of original size.

La taille non compressée d'origine est de 2400 x 600 x 3 = 4 320 000 octets (4,1 Mo), car la couleur 24 bits correspond toujours à trois octets de données RVB par pixel . Il n'y a aucun moyen de contourner cette vérité absolue.

Cependant, la taille JPG dépend également des détails de l'image. Les grandes surfaces lisses (comme le ciel ou les murs peints) se compressent mieux, mais les zones plus détaillées (comme un arbre plein de feuilles) ne se compressent pas aussi bien. Il n'y a donc pas d'indicateur numérique absolu.

Mais 540 KB est 0,540 / 4,1 = 13% de 4,1 Mo taille d' origine . Il peut représenter 29% de la taille JPG précédente, mais il représente 13% de la taille non compressée d'origine. C'est donc 1/8 de la taille originale non compressée, ce qui est généralement considéré comme une qualité "décente". Pas optimale, pas de qualité maximale, mais généralement décente, peut-être assez bonne pour certaines utilisations. Je dis juste que c'est déjà petit.

Un fichier JPG plus volumineux offre une meilleure qualité d'image et plus petit une qualité d'image moindre. Vous devez décider de ce qui est assez bon, mais JPG n'est jamais "trop ​​grand", car la qualité de l'image diminue avec la compression JPG. La couleur 24 bits a trois octets par pixel non compressés.

La décision est donc de savoir si vous le voulez petit ou si vous le voulez bien.

Mais agrandir un JPG existant est encore pire, car plus d'artefacts JPG sont ajoutés, et une fois petits, les données sont modifiées et elles ne s'amélioreront jamais.

Les artefacts JPG montrent généralement deux manières, comme des blocs visibles de 8 x 8 pixels d'une couleur dans les zones lisses sans détail, ou comme des bords rugueux visibles autour des bords de détail.

Si vous modifiez et réenregistrez un JPG, des artefacts JPG supplémentaires sont ajoutés. Si cela est nécessaire, il est recommandé de toujours réenregistrer pour correspondre au paramètre de compression d'origine.

WayneF
la source
Le nombre de 4,1 Mo n'est vrai que s'il n'y a pas de compression du tout, cependant, même un JPEG avec une qualité parfaite peut avoir une taille de fichier plus petite en raison de la compression sans perte .
Marv
Oui, c'est pourquoi je l'ai appelé "non compressé", c'est ainsi que chaque image numérique commence, ce qui est bien sûr la taille réelle et originale des données, c'est pourquoi c'est important. Oui, même le JPG 100 de plus haut niveau est compressé sensiblement plus petit, pas sans perte. JPG sans perte est un terme impropre. Nous n'avons aucun programme l'offrant. Ses utilisations l'appellent quelque chose d'autre (Wikipedia dit DNG et certains Raw). Cependant, JPEG2 peut offrir une compression sans perte, mais qui présente d'autres problèmes, par exemple, les navigateurs Web ne prennent pas en charge l'affichage de JPEG2, et les imprimeries photo ne l'acceptent probablement pas.
WayneF
Il n'y a aucun moyen de contourner cette vérité absolue. ... sauf pour le sous-échantillonnage de chrominance, que JPEG utilise. JPEG compresse dans l'espace colorimétrique YUV (luminosité + deux composantes de couleur), pas RVB. Habituellement 4: 2: 2 ou 4: 2: 0, réduisant le nombre de pixels dans chacun des deux canaux de chrominance de 2x ou 4x. en.wikipedia.org/wiki/Chroma_subsampling#4:2:2 . Après la transformation de RVB en YUV et le sous-échantillonnage, ces informations de résolution de couleur ont totalement disparu, et ne font pas partie de ce que JPEG dépense des bits pour coder. Si vous voulez regarder les bits / pixels, ils doivent être au format couleur du JPEG que vous envisagez.
Peter Cordes
2
Allez, lisez le texte. La deuxième vérité absolue est qu'il a spécifiquement dit et fait référence à "non compressé" et a dit que la couleur 24 bits était toujours de trois octets par pixel. :)
WayneF
0

"Enregistrer pour le Web" de Photoshop est en fait un assez bon compromis entre la taille et la qualité des fichiers, donc à moins d'avoir des exigences plus spécifiques, vous devriez y aller. Un conseil typique pour les développeurs Web est de s'en tenir à une gamme de qualité de 50 à 70%. Bien sûr, il y a des exceptions: vous voudrez une qualité de 90 à 95% sur un logo d'entreprise qui doit toujours être beau (ou même le convertir en un format sans perte), et aller jusqu'à 30% sur un grand mais à peine fond de page visible.

N'oubliez pas non plus de redimensionner vos images. Une image 2400x600 aura fière allure sur un écran 4K, mais sera redimensionnée sur des écrans plus petits, gaspillant la bande passante des données sans amélioration visuelle pour l'utilisateur. Vérifiez le modèle de site Web que vous utiliserez pour connaître la largeur optimale des images. En règle générale, au moment de la rédaction, cela se situera autour de 1200-1300 pixels (voir la résolution la plus populaire ici ).

N'oubliez pas de conserver les originaux des images que vous convertissez en qualité Web. Si vous avez besoin de retravailler ou d'imprimer ce matériau, vous regretterez de ne l'avoir qu'en qualité 60% et en résolution 1 Mpix.

Dmitry Grigoryev
la source