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:
- 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.
la source
Réponses:
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):
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.
la source
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 :
(Bruit RVB uniformément aléatoire, format PNG sans perte, 903 ko)
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
pnmtojpeg
manuel n'explique pas clairement comment définir toutes les options pertinentes (en particulier, l'-sample
option 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:(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
pnmtojpeg
valeurs par défaut (qualité = 75, sous-échantillonnage activé)? Essayons:(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. .
la source