web-dev-qa-db-fra.com

Quelle est la plus grande taille d’un fichier JPEG 640x480?

Je crée un dispositif de stockage de données qui prend un certain nombre de photos du ciel nocturne en quelques heures et les photos seront téléchargées juste après leur prise. La carte mémoire doit pouvoir stocker toutes les images à la fois.

Les images JPEG prises sont de 640 x 480 pixels et il est essentiel que la carte mémoire dispose de suffisamment de place pour les 100 d'entre elles. Alors, quelle est la plus grande taille d'un fichier JPEG 640x480?

J'ai pris quelques photos de test pour le comprendre:

#1#2#3

  • La taille de fichier de l'image "stackoverflow" est de 73 774 octets.
  • La taille de fichier de l'image blanche n'est que de 36 607 octets.
  • Mais la taille du fichier pour la photo en damier est de 149 339 octets.

Je suppose que la taille du fichier augmente avec la complexité.

Comment créer suffisamment d'espace sur la carte mémoire pour contenir 100 JPEG 640x480, sans savoir à quel point et quelle taille ils seront compliqués? Je ne veux pas gaspiller d'espace supplémentaire car je fabrique peut-être plusieurs de ces dispositifs de capture.

23
Blue Ice

Ici, je suggère une limite supérieure pour la taille des fichiers JPEG. Voir la réponse de Ilmari Karonen pour une discussion sur les tailles jpeg plus typiques.

L'espace de stockage de pixels pour une image bitmap 640X480 32 bits peut être calculé comme suit (en fonction de cette réponse , mais corrigée en fonction du résultat obtenu par Ignacio Vazquez-Abrams ' comment et cette réponse):

En supposant qu'aucune compression n'ait été appliquée au fichier, il y a 307 200 pixels, ce qui correspond à 0,3 MP. Table de consultation pratique

Si chaque pixel contient 32 bits d’information, alors

  1. 307,200 * 32 = 9 830 400 bits d'information
  2. Divise par les 8 bits pour devenir une valeur d'octet
  3. 9 830 400/8 = 1228800 octets (ou 1,17 Mo)

Il s’agit de la taille d’un bitmap non compressé et doit donc constituer une limite supérieure pour la taille du fichier jpeg (En réalité, le format JPEG utilise la compression , vos images devraient être beaucoup plus petites, d'autant plus que vous prenez des photos du ciel nocturne, ce qui, j'imagine, contient beaucoup de noir (notez que l'exemple le plus grand de votre question ne représente que 0,14 Mo).

En ce qui concerne votre problème spécifique, toutefois, même en utilisant cette limite supérieure, 100 images ne représentent que 117 Mo. Cela fait longtemps que je n’ai pas vu une carte mémoire aussi petite que 128 Mo. Je soupçonne que toute carte mémoire actuellement disponible aura une capacité suffisante pour répondre à vos besoins.

Apparemment, la question de la taille maximale des fichiers JPEG est sujette à discussion. Cette réponse suggère une taille maximale théorique de 20,25 octets par pixel, soit 5,9 Mo dans votre cas, mais la production d'une image de cette taille nécessite une utilisation abusive délibérée. du schéma de compression du format jpeg, il est donc extrêmement improbable de voir une telle chose produite par une caméra.

21
ForeverWintr

Juste pour vérifier, laissez-moi tester l'analyse de ForeverWintr à titre expérimental.

Le pire type d'image d'entrée pour la compression JPEG (ou any compression, en réalité) est le bruit RVB uniformément aléatoire, théoriquement incompressible. Alors laissez-moi en générer avec les outils netpbm :

$ rawtoppm < /dev/urandom 640 480 > rnd.ppm
$ pnmtopng < rnd.ppm > rnd.png
$ du -b rnd.*
923772  rnd.png
921615  rnd.ppm

Uniformly random RGB noise, lossless PNG format
(Bruit RGB uniformément aléatoire, format PNG sans perte, 903 kb)

Note (mars 2017): Je suis à peu près sûr que l'image ci-dessus was au format PNG lorsque j'ai écrit cette réponse pour la première fois et que je l'ai transférée en 2013 (un commentaire sur la gestion des couleurs ci-dessous l'indique fortement .) Malheureusement, il semblerait qu’il ait été converti silencieusement en JPEG à un moment donné, rendant la comparaison visuelle inutile.

J'ai essayé de télécharger à nouveau une nouvelle image de test PNG, mais apparemment, elle correspond à une limite de taille de fichier PNG arbitraire chez imgur et est automatiquement convertie en JPEG. Je ne sais pas s'il est possible de résoudre ce problème, mais au moins, si vous avez accès à une machine Linux, vous pouvez toujours réexécuter les commandes données pour générer vos propres images de test. Dans tous les cas, hormis le fait d'empêcher une comparaison visuelle directe de la qualité de la compression, cela n'invalidera en aucun cas l'analyse ci-dessous.

OK, le fichier non compressé PPM contient 640 × 480 × 3 = 921 600 octets, plus 15 octets pour l'en-tête minimal PPM, comme prévu. Essayer de le compresser sans perte en utilisant le format PNG finit par en augmenter la taille de 2157 octets, probablement repris par des en-têtes et des métadonnées PNG et éventuellement par une légère inefficacité dans l'algorithme de compression essayant de compresser des données incompressibles.

(Oui, c'est 3 octets par pixel, pas 4; même le format PPM, aussi simple qu'un format de fichier graphique peut être obtenu, n'est pas assez stupide pour stocker un quatrième octet inutile par pixel Disque Il y a peut avoir un avantage à le faire en mémoire pour des raisons d'alignement, en particulier si vous devez également stocker un canal alpha, mais ces raisons ne s'appliquent pas à l'écriture de l'image dans un fichier.)

OK, alors qu'en JPEG? Essayons d’abord de minimiser les pertes de compression (qualité = 100, pas de sous-échantillonnage de la chrominance, DCT à virgule flottante). Malheureusement, le manuel pnmtojpeg n'explique pas clairement comment définir toutes les options pertinentes (en particulier, l'option -sample est répertoriée dans les "Options pour les assistants" section, qui fait simplement référence à un fichier dans la documentation de libjpeg), je vais donc le convertir dans GIMP à la place. Le fichier résultant ressemble à ceci:

897249  rnd.jpg

JPEG compressed RGB noise, quality = 100, no chroma subsampling
(Bruit RGB compressé JPEG, qualité = 100, pas de sous-échantillonnage de la chrominance, 876 kb)

Quoi, comment peut-il être plus petit? N’ai-je pas simplement dit que le bruit pur était incompressible? En réalité, même avec une qualité maximale, la compression JPEG normale n’est pas plutôt sans perte. En rouvrant l’image dans GIMP et en la comparant à l’original, on peut voir que la valeur des couleurs de certains pixels a été décalée d’un ou deux pas (sur 256). Ce sont les pixels où l’algorithme de compression JPEG "triché" et jeté un peu ici, un autre là, où il a estimé que le changement ne serait pas perceptible. En effet, pour l’œil humain nu, le résultat est quasiment identique à l’original, mais ces bits ignorés entraînent une diminution mesurable de la taille du fichier, même en tenant compte de la surcharge de l’en-tête et du codage.

C'était donc une qualité maximale. Qu'en est-il des paramètres plus typiques, tels que les valeurs par défaut pnmtojpeg (qualité = 75, sous-échantillonnage activé)? Essayons:

$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128  rnd2.jpg

JPEG compressed RGB noise, quality = 75, chroma subsampling
(Bruit RGB compressé JPEG, qualité = 75, sous-échantillonnage de la chrominance, 184 kb)

Wow, de 901 à 184 kb! Cependant, la compression est assez agressive et vous pouvez certainement faire la différence lorsque vous comparez les images de près. Cela est principalement dû au sous-échantillonnage de la chrominance, qui élimine en fait 75% des données de couleur (teinte/saturation). L'essayer dans GIMP avec le sous-échantillonnage désactivé donne un fichier de 350 618 octets qui a toujours l'air (à l'œil humain, du moins) d'être assez proche de l'original, même agrandi.

Quoi qu'il en soit, le but de tout cela est de démontrer que, même si vos photos de ciel nocturne sont bruyantes et quelle que soit la qualité de votre sélection, il n'y a qu'un fichier impossible un fichier JPEG 640 × 480 peut être considérablement plus grand que 900 kb. (Eh bien, à moins que votre caméra ne contienne un profil de couleur Exif de plusieurs mégaoctets ou quelque chose d'aussi stupide, c'est ça.) Et si vous utilisez des paramètres de compression JPEG plus typiques, la taille de fichier plausible maximale descend à environ 200 ko .

34
Ilmari Karonen