web-dev-qa-db-fra.com

Est-il possible de connaître le niveau de qualité d'un JPEG?

C'est vraiment une question en deux parties, car je ne comprends pas encore comment ces choses fonctionnent:

Ma situation: j'écris une application web qui permet à l'utilisateur de télécharger une image. Mon application se redimensionne ensuite en un élément affichable (par exemple: 640x480-ish) et enregistre le fichier pour une utilisation ultérieure.

Mes questions:

  1. Étant donné un fichier JPEG arbitraire, est-il possible de dire quel est le niveau de qualité, afin que je puisse utiliser cette même qualité lors de l'enregistrement de l'image redimensionnée?
  2. Est-ce que cela importe même ?? Dois-je enregistrer toutes les images à un niveau décent (par exemple: 75-80), quelle que soit la qualité d'origine?

Je ne suis pas sûr de cela parce que, comme je le pense: (prenons un exemple extrême), si quelqu'un avait une image de 5 mégapixels enregistrée en qualité 0, ce serait un bloc comme n'importe quoi. En réduisant la taille de l'image à 640x480, le bloc serait lissé et à peine moins perceptible ... jusqu'à ce que je l'ai à nouveau enregistré avec la qualité 0 ...

À l'autre extrémité du spectre, s'il y avait une image qui était 800x600 avec q = 0, le redimensionnement à 640x480 ne changera pas le fait qu'il ressemble à de la merde totale, donc enregistrer avec q = 80 serait redondant.

Suis-je même proche?

J'utilise la bibliothèque Gd2 sur PHP si cela est utile

61
nickf
  1. JPEG est un format avec perte. Chaque fois que vous enregistrez une même image JPEG, quel que soit le niveau de qualité, vous réduisez la qualité réelle de l'image. Par conséquent, même si vous avez obtenu un niveau de qualité à partir du fichier, vous ne pouvez pas conserver cette même qualité lorsque vous enregistrez à nouveau un JPEG (même avec une qualité = 100).

  2. Vous devez enregistrer votre JPEG avec une qualité aussi élevée que possible en termes de taille de fichier. Ou utilisez un format sans perte tel que PNG.

Les fichiers JPEG de faible qualité ne deviennent pas simplement plus blocs. Au lieu de cela, la profondeur des couleurs est réduite et les détails des sections de l'image sont supprimés. Vous ne pouvez pas compter sur des images de qualité inférieure qui sont en bloc et qui semblent correctes dans des tailles plus petites.

Selon le spécification JFIF le numéro de qualité (0-100) n'est pas stocké dans l'en-tête d'image, bien que la densité de pixels horizontale et verticale soit stockée.

27
Ash

Vous pouvez afficher le niveau de compression par ImageMagick. Les instructions de téléchargement et d'installation sont disponibles sur le site officiel .

Après l'avoir installé, exécutez la commande suivante à partir de la ligne de commande:

identify -format '%Q' yourimage.jpg

Et vous devriez obtenir la valeur de 0 (faible qualité, petite taille de fichier) à 100 (haute qualité, grande taille de fichier).

Source d'information

95
DuyLuc

Pour les futurs visiteurs, en vérifiant la qualité d'un jpeg donné, vous pouvez simplement utiliser les outils imagemagick:

$> identify -format '%Q' filename.jpg
   92%
11
JAR.JAR.beans

L'algorithme de compression Jpeg a certains paramètres qui influencent la qualité de l'image résultante.

L'un de ces paramètres sont les tableaux de quantification qui définissent le nombre de bits qui seront utilisés sur chaque coefficient. Différents programmes utilisent différentes tables de quatisation.

Certains programmes permettent à l'utilisateur de définir le niveau de qualité 0-100. Mais il n'y a pas de définition commune de ce nombre. L'image réalisée avec Photoshop avec une qualité de 60% prend 46 Ko, tandis que l'image réalisée avec GIMP ne prend que 26 Ko.

Les tables de quantification sont également différentes.

Il existe d'autres paramètres tels que le sous-échantillonnage, la méthode dct, etc.

Vous ne pouvez donc pas tous les décrire par numéro de niveau de qualité unique et vous ne pouvez pas comparer la qualité des images jpeg par numéro unique. Mais vous pouvez créer un tel nombre comme Photoshop ou Gimp qui décrira le compromis entre la taille et la qualité.

Plus d'informations: http://patrakov.blogspot.com/2008/12/jpeg-quality-is-meaningless-number.html

La pratique courante est que vous redimensionnez l'image à la taille appropriée et appliquez jpeg après cela. Dans ce cas, les images énormes et moyennes auront la même taille et la même qualité.

8
ton4eg

Comme il y a déjà deux réponses en utilisant identify, en voici une qui génère également le nom du fichier (pour analyser plusieurs fichiers à la fois) :

Si vous souhaitez avoir une sortie simple de filename: quality pour une utilisation sur plusieurs images, vous pouvez utiliser

identify -format '%f: %Q' *

à afficher le nom de fichier + compression de tous les fichiers dans le répertoire courant.

5
serv-inc

Donc, vous vous souciez essentiellement de deux cas:

  1. Si la qualité d'une image entrante est trop élevée, elle peut occuper un espace inapproprié. Par conséquent, vous voudrez peut-être, par exemple, réduire le q = 99 entrant à q = 85.

  2. Si la qualité d'une image entrante est trop basse, cela peut être une perte d'espace d'augmenter sa qualité. Sauf qu'une image contenant une grande quantité de données supprimées ne prendra pas plus de place par magie lorsque la qualité est élevée - les images en blocs se compresseront très bien même avec des paramètres de haute qualité. Donc, à mon avis, il est parfaitement correct d'augmenter q = 1 entrant à q = 85.

À partir de là, je pense que forcer un réglage de qualité décent est une chose parfaitement acceptable.

3
Eric Seppanen

Voici une formule que j'ai trouvée bien fonctionner:

  1. jpg100size (la taille ne doit pas dépasser en octets pour une qualité de 98 à 100%) = largeur * hauteur/1,7

  2. jpgxsize = jpg100size * x (x = pour cent, par exemple 0,65)

vous pouvez donc les utiliser pour découvrir statistiquement la qualité de votre dernier jpg. si vous voulez le réduire à une qualité disons de 65% et si vous voulez éviter le rééchantillonnage, vous devez comparer la taille au départ pour vous assurer qu'elle n'est pas déjà trop faible, puis seulement réduire la qualité

3
Raul Popa

Chaque nouvelle sauvegarde du fichier diminuera encore la qualité globale, en utilisant des valeurs de qualité plus élevées, vous préserverez davantage d'image. Quelle que soit la qualité d'image d'origine.

2
Alexander Taran

Cela peut être une question stupide, mais pourquoi seriez-vous préoccupé par la microgestion de la qualité du document? Je crois que si vous utilisez ImageMagick pour effectuer la conversion, il gérera la qualité du JPEG pour vous pour le meilleur effet. http://www.php.net/manual/en/intro.imagick.php

1
bryanjonker

Si vous réenregistrez un JPEG en utilisant le même logiciel qui l'a créé à l'origine, en utilisant les mêmes paramètres, vous constaterez que les dommages sont minimisés - l'algorithme aura tendance à jeter les mêmes informations qu'il a jetées la première fois. Je ne pense pas qu'il y ait moyen de savoir quel niveau a été sélectionné simplement en regardant le fichier; même si vous le pouviez, différents logiciels garantissent presque différents paramètres et arrondis, ce qui rend une correspondance presque impossible.

1
Mark Ransom