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

25

Je crée un périphérique de stockage de données qui prend un certain nombre de photos du ciel nocturne sur quelques heures, et les photos seront téléchargées juste après avoir été prises. La carte mémoire doit pouvoir stocker toutes les photos à la fois.

Les JPEG qui seront prises sont de 640x480 pixels, et il est essentiel qu'il y ait suffisamment de place sur la carte mémoire pour les 100 d'entre eux. Alors, quelle est la plus grande taille d'un JPEG 640x480?

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

#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 les horloges photo à damier est de 149 339 octets.

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

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

Glace bleue
la source
cela dépend du producteur d'images. Le JPEG de qualité 100 peut facilement exploser en taille. Quels sont votre appareil photo et les paramètres de l'appareil photo?
John Dvorak
L'appareil photo de test est un Canon Powershot A1100 IS. Pour plus d'informations, vous pouvez vérifier les métadonnées, car je ne suis pas sûr de ce que vous demandez.
Blue Ice
1
Avez-vous pris des exemples de photos du ciel nocturne au dif. Paramètres Q? Comme test?
Carl B
2
Quel est ce pour ? Êtes-vous sûr que jpeg est le bon choix de format.
Jack Aidley
3
Ajoutez un peu de fond au commentaire de Jack Aidleys: la compression JPEG change l'image. Il fait des hypothèses et supprime les informations afin d'obtenir une taille de fichier plus petite. (À moins qu'il ne soit réglé sur 100% de qualité, auquel cas vous pourriez aussi bien utiliser un format non compressé. Souvent, un appareil photo numérique a un tiff ou même un paramètre brut pour cela. Si vous souhaitez conserver tous les petits points tels que les étoiles, utilisez l'un des celles-ci). Cela rendra également la taille d'une image complètement prévisible.
Hennes

Réponses:

22

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

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

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

Si chaque pixel contient 32 bits d'informations, alors

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

Il s'agit de la taille d'un bitmap non compressé et, en tant que tel, devrait être une limite supérieure pour la taille du fichier jpeg (en réalité, parce que le format JPEG utilise la compression , vos images devraient être beaucoup plus petites, surtout étant donné que vous prenez des photos de la nuit ciel, qui j'imagine contient beaucoup de noir. Notez que la plus grande image d'exemple dans votre question n'est que de 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 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 du fichier jpeg fait l'objet d'un débat. Cette réponse Stack Overflow suggère une taille maximale théorique de 20,25 octets par pixel, ou 5,9 Mo dans votre cas, mais la production d'une image de cette taille nécessite une mauvaise utilisation délibérée du schéma de compression du format jpeg, il est donc extrêmement peu probable que vous voyiez un tel une chose produite par une caméra.

ForeverWintr
la source
1
Malheureusement, même la valeur bitmap non compressée est juste un peu faible, car elle suppose un emballage. Un bitmap décompressé utilise 32 bits par pixel (pour des raisons d' alignement ), augmentant la taille du fichier de 33%.
Ignacio Vazquez-Abrams
Merci @ IgnacioVazquez-Abrams. C'est ce que j'obtiens en supposant qu'une réponse acceptée est correcte.
ForeverWintr
1
@ IgnacioVazquez-Abrams - "Alignement" est un attribut dicté par le processeur (pas le support de stockage), et est pratique lorsque les données sont en RAM pour le traitement. À des fins de stockage, un alignement de mots sur 32 bits n'est pas une nécessité et certainement une extravagance. L'emballage des données est une opération courante avant l'écriture dans le stockage, en particulier pour une certaine économie de 25%. J'ai vu des appareils photo numériques qui stockent chaque pixel dans exactement 3 octets pour le format brut.
sciure de bois
1
"... certainement une extravagance." Aujourd'hui. Il y a de nombreuses lunes, il était considéré comme une fonction d'économie de cycle (pas besoin d'aligner sur la charge, compte tenu du temps qu'il faudrait).
Ignacio Vazquez-Abrams
3
En pratique, alors que certains systèmes peuvent stocker des données d'image RVB sous forme de 4 octets par pixel en mémoire , à peu près tous les formats de fichiers d' image utilisent au plus 3 octets par pixel (sauf s'il existe un canal alpha réel stocké dans le quatrième octet). Voir ma réponse ci-dessous.
Ilmari Karonen
35

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

Le pire type d'image d'entrée pour la compression JPEG (ou n'importe quelle compression, vraiment) est le bruit RVB uniformément aléatoire, qui est théoriquement incompressible. Alors laissez-moi en générer à l'aide des outils netpbm :

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

Bruit RVB uniformément aléatoire, format PNG sans perte
(Bruit RVB uniformément aléatoire, format PNG sans perte, 903 ko)

Remarque (mars 2017): Je suis presque sûr que l'image ci-dessus était au format PNG lorsque j'ai écrit cette réponse pour la première fois et que je 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, ce serait semble qu'il a été silencieusement converti en JPEG à un moment donné, ce qui rend la comparaison visuelle ici inutile.

J'ai essayé de télécharger une nouvelle image de test PNG, mais apparemment, elle atteint une sorte de limite de taille de fichier PNG arbitraire à imgur et est automatiquement convertie en JPEG. Je ne sais pas s'il y a un moyen de contourner ce problème, mais au moins si vous avez accès à une boîte Linux, vous pouvez toujours réexécuter les commandes données pour générer vos propres images de test. Dans tous les cas, à part empêcher la comparaison visuelle directe de la qualité de la compression, cela n'invalide en rien l'analyse ci-dessous.

OK, donc le fichier PPM non compressé mesure 640 × 480 × 3 = 921 600 octets, plus 15 octets pour l'en-tête PPM minimal, comme prévu. Essayer de le compresser sans perte en utilisant le format PNG finit par augmenter la taille de 2157 octets, vraisemblablement repris par les en-têtes et les métadonnées PNG et éventuellement une légère inefficacité de 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, 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 peut y en avoir avantage à le faire en mémoire pour des raisons d'alignement, surtout si vous devez également stocker un canal alpha, mais ces raisons ne s'appliquent pas lors de l'écriture de l'image dans un fichier.)

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

897249  rnd.jpg

Bruit RVB compressé JPEG, qualité = 100, pas de sous-échantillonnage de chrominance
(Bruit RVB compressé JPEG, qualité = 100, pas de sous-échantillonnage de chrominance, 876 ko)

Quoi, comment peut-il être plus petit? N'ai-je pas juste dit que le bruit pur était incompressible? Eh bien, même avec une qualité maximale, la compression JPEG normale n'est pas tout à fait sans perte. En rouvrant l'image dans GIMP et en la comparant à l'original, on peut voir que certains pixels ont vu leurs valeurs de couleur décalées d'un ou deux pas (sur 256). Ce sont les pixels où l'algorithme de compression JPEG a "triché" et jeté un peu ici, un autre là-bas, où il estimait que le changement ne serait pas perceptible. En effet, à l'œil humain sans aide, le résultat ne peut pas être distingué de l'original, mais ces bits jetés entraînent une diminution mesurable de la taille du fichier, même après avoir pris en compte l'en-tête et les frais généraux d'encodage.

C'était donc une qualité maximale; qu'en est-il des paramètres plus typiques, comme les pnmtojpegvaleurs par défaut (qualité = 75, sous-échantillonnage activé)? Essayons:

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

Bruit RVB compressé JPEG, qualité = 75, sous-échantillonnage de chrominance
(Bruit RVB compressé JPEG, qualité = 75, sous-échantillonnage de chrominance, 184 ko)

Wow, de 901 à 184 ko! C'est une compression assez agressive, cependant, et vous pouvez certainement faire la différence lorsque vous comparez les images de près. La majeure partie est due au sous-échantillonnage de la chrominance, qui jette simplement 75% des données de couleur (teinte / saturation). L'essayer dans le GIMP avec le sous-échantillonnage désactivé donne un fichier de 350 618 octets qui ressemble (au moins à l'œil humain) assez proche de l'original même lorsqu'il est agrandi.

Quoi qu'il en soit, le but de tout cela est de démontrer que, peu importe le niveau de bruit de vos photos du ciel nocturne, et quelle que soit la qualité que vous puissiez sélectionner, il n'y a tout simplement aucun moyen qu'un fichier JPEG 640 × 480 puisse être considérablement plus grand que 900 kb. (Eh bien, à moins que votre appareil photo ne lui associe un profil de couleur Exif de plusieurs mégaoctets ou quelque chose de tout aussi stupide.) Et si vous utilisez des paramètres de compression JPEG plus typiques, la taille de fichier maximale plausible descend à environ 200 ko environ. .

Ilmari Karonen
la source
4
théoriquement incompressible uniquement pour la compression sans perte, non?
Daniel Beck
1
@DanielBeck: D'accord. De toute évidence, vous pouvez compresser autant de données que vous le souhaitez si vous êtes prêt à en jeter des parties. (C'est essentiellement ce que fait la compression JPEG, il essaie simplement de le faire de telle sorte que les parties perdues ne soient pas visibles à l'œil humain, et que ce qui reste puisse être encodé de manière compacte. Le bruit est toujours un cas difficile pour lui, car le la seule chose qu'un algorithme de compression avec perte peut faire avec le bruit est d'en jeter des parties.)
Ilmari Karonen
C'est peut-être juste moi, mais la deuxième image semble plus lumineuse que la première.
Bogdacutu
@Bogdacutu: Cela ne devrait pas, bien qu'il soit toujours possible que votre navigateur fasse quelque chose de bizarre avec la gestion des couleurs, etc. Essayez de les charger tous les deux dans un éditeur graphique et de comparer les valeurs des couleurs.
Ilmari Karonen
Belle écriture @Ilmari.
ForeverWintr