25 votes

Quelle est la taille maximale d'un JPEG 640x480 ?

Je suis en train de créer un dispositif de stockage de données qui prend un certain nombre de photos du ciel nocturne pendant quelques heures, et les photos seront téléchargées juste après qu'elles aient été prises. La carte mémoire doit pouvoir stocker toutes les photos en même temps.

Les JPEG qui seront pris sont de 640x480 pixels, et il est essentiel qu'il y ait suffisamment de place sur la carte mémoire pour les 100 JPEG. Quelle est donc la taille maximale d'un JPEG 640x480 ?

J'ai pris quelques photos d'essai pour résoudre ce problème :

#1#2#3

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

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

Comment puis-je faire en sorte qu'il y ait suffisamment de place sur la carte mémoire pour y placer 100 JPEG 640x480, sans savoir à quel point ils seront compliqués et de quelle taille ils seront ? Je ne veux pas gaspiller de l'espace supplémentaire car je risque de fabriquer plusieurs de ces dispositifs de capture.

35voto

Ilmari Karonen Points 1609

Pour vérifier, je vais tester L'analyse de ForeverWintr de manière expérimentale.

Le pire type d'image d'entrée pour la compression JPEG (ou tous ) est un bruit RVB uniformément aléatoire, qui est théoriquement incompressible. Permettez-moi donc d'en générer à l'aide de la fonction netpbm des outils :

$ 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 RVB uniformément aléatoire, format PNG sans perte, 903 kb)

Note (mars 2017) : Je suis presque sûr que l'image ci-dessus était au format PNG lorsque j'ai rédigé cette réponse et l'ai téléchargée en 2013. (Il y a même un commentaire sur la gestion des couleurs ci-dessous qui implique fortement cela). Malheureusement, il semblerait qu'il ait été silencieusement converti en JPEG à un moment donné, ce qui rend la comparaison visuelle inutile.

J'ai essayé de retélécharger une nouvelle image de test au format PNG, mais apparemment elle atteint une sorte de limite arbitraire de taille de fichier PNG chez imgur et est automatiquement convertie en JPEG. Je ne suis pas sûr qu'il y ait un moyen de contourner 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. Quoi qu'il en soit, outre le fait qu'il empêche une comparaison visuelle directe de la qualité de la compression, ce problème n'invalide en rien l'analyse ci-dessous.

OK, le fichier PPM non compressé fait donc 640 × 480 × 3 = 921 600 octets, plus 15 octets pour l'en-tête PPM minimal, comme prévu. En essayant de le compresser sans perte à l'aide du format PNG, on finit par augmenter sa taille de 2157 octets, vraisemblablement occupés par les en-têtes et les métadonnées PNG et peut-être par une légère inefficacité de l'algorithme de compression qui tente de compresser des données incompressibles.

(Oui, c'est 3 octets par pixel, pas 4 ; même le format PPM, qui est à peu près aussi simple qu'un format de fichier graphique peut l'être, n'est pas assez stupide pour stocker un quatrième octet inutile par pixel sur le disque. Il y a peut Il y a un certain 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, qu'en est-il de la norme JPEG ? Essayons d'abord de minimiser les pertes de compression (qualité = 100, pas de sous-échantillonnage chromatique, DCT en virgule flottante). Malheureusement, la pnmtojpeg manuel n'explique pas clairement comment définir toutes les options pertinentes (en particulier, l'option -sample est listée dans la section "Options for wizards", qui fait simplement référence à un fichier dans la documentation de libjpeg), je vais donc le convertir dans le GIMP à la place. Le fichier résultant ressemble à ceci :

897249  rnd.jpg

JPEG compressed RGB noise, quality = 100, no chroma subsampling
(bruit RVB compressé en JPEG, qualité = 100, pas de sous-échantillonnage chromatique, 876 kb)

Quoi, comment peut-il être plus petit ? Ne viens-je pas de dire que le bruit pur était incompressible ? Le fait est que, même avec une qualité maximale, la compression JPEG normale ne permet pas de réduire la taille de l'image. tout à fait sans perte. En rouvrant l'image dans GIMP et en la comparant à l'original, on peut voir que certains pixels ont vu leur valeur de couleur décalée d'un ou deux pas (sur 256). Il s'agit des pixels pour lesquels l'algorithme de compression JPEG a "triché" et a supprimé un peu ici, un autre là, alors qu'il estimait que le changement ne serait pas perceptible. En effet, à l'œil nu, le résultat est pratiquement impossible à distinguer de l'original, mais ces bits supprimés représentent une diminution mesurable de la taille du fichier, même en tenant compte de l'en-tête et de la surcharge d'encodage.

Il s'agissait donc de la qualité maximale ; qu'en est-il des paramètres plus typiques, comme le pnmtojpeg les valeurs par défaut (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 RVB compressé en JPEG, qualité = 75, sous-échantillonnage chromatique, 184 kb)

Wow, de 901 à 184 kb ! C'est une compression assez agressive, cependant, et vous pouvez certainement voir la différence en comparant les images de près. Cela est dû en grande partie au sous-échantillonnage chromatique, qui jette 75% des données de couleur (teinte / saturation). En l'essayant dans le GIMP avec le sous-échantillonnage désactivé, on obtient un fichier de 350 618 octets qui reste (pour l'œil humain, du moins) assez proche de l'original, même lorsqu'on l'agrandit.

Quoi qu'il en soit, le but de tout ceci est de démontrer que, quel que soit le niveau de bruit de vos photos du ciel nocturne, et quelle que soit la qualité que vous choisissez, il n'y a qu'un seul moyen d'obtenir un résultat satisfaisant. pas question un fichier JPEG 640 × 480 peut dépasser largement les 900 kb. (À moins que votre appareil photo ne lui associe un profil de couleur Exif de plusieurs mégaoctets ou quelque chose d'aussi stupide). Et si vous utilisez des paramètres de compression JPEG plus classiques, la taille maximale plausible du fichier descend à environ 200 kb.

22voto

janet Points 549

Je propose ici une limite supérieure pour la taille des fichiers JPEG. Voir Réponse de Ilmari Karonen pour une discussion sur les tailles de jpeg les plus courantes.

L'espace de stockage des pixels pour une image bitmap 32 bits de 640X480 peut être calculé comme suit (sur la base de este réponse, mais corrigée sur la base du commentaire d'Ignacio Vazquez-Abrams et de l'avis de la Commission. este réponse) :

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

Si chaque pixel contient 32 bits d'information, alors

  1. 307 200 * 32 = 9 830 400 bits d'information
  2. Diviser par les 8 bits pour obtenir une valeur d'octet
  3. 9 830 400 / 8 = 1228800 octets (Ou 1.17 Mb)

Il s'agit de la taille d'une image bitmap non comprimée et, en tant que telle, elle devrait constituer une limite supérieure pour la taille d'un fichier JPEG (en réalité, parce que le format JPEG utilise le format compression Vos images devraient être beaucoup plus petites, surtout si vous prenez des photos du ciel nocturne, qui, j'imagine, contient beaucoup de noir. Notez que la plus grande image de votre question ne pèse que 0,14 Mo).

En ce qui concerne votre problème spécifique, même en utilisant cette limite supérieure, 100 images ne représentent que 117 Mo, et cela fait longtemps que je n'ai pas vu de carte mémoire d'une taille inférieure à 128 Mo. Je pense que n'importe quelle carte mémoire actuellement disponible aura une capacité suffisante pour répondre à vos besoins.

Apparemment, la question de la taille maximale des fichiers jpeg fait l'objet d'un débat. Le présent La réponse de Stack Overflow 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 délibérément abusive du système de compression du format jpeg, et il est donc extrêmement improbable qu'un appareil photo produise une telle image.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X