Bitmaps
Un bitmap (BMP) est essentiellement ce que vous décrivez, un tableau de nombres représentant les couleurs des pixels. Quelque chose comme
1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1
Compression sans perte
Définissons maintenant un schéma de compression. Dans notre schéma de compression, nous aurons un tableau de paires de nombres. Par exemple
3, 1, 1, 0, 7, 1
La première chose que je veux souligner est que ce schéma de compression représente les mêmes pixels que le premier tableau. Le premier tableau a trois 1 suivis d'un seul 0 puis de sept 1. Et c'est ce que nous représentons ici. Ce format est plus court car il représente plusieurs pixels avec deux nombres. Le format bitmap doit utiliser un nombre pour chaque pixel.
De toute évidence, il s’agit d’une vue quelque peu simplifiée d’une image (par exemple, une seule ligne) et d’un schéma de compression. Mais, espérons-le, cela vous permettra de voir comment un schéma de compression modifie le format d'une image. Voici comment un GIF se rapporte à un BMP. GIF utilise un schéma de compression appelé Lempel-Ziv-Welch au lieu de celui simpliste.
Ce que nous avons décrit ici est un schéma de compression sans perte. Un problème avec les schémas de compression sans perte est que pour certaines entrées, la forme encodée peut être plus longue que l'original. Par exemple pour
1, 0, 1, 0, 1
L'encodage est
1, 1, 1, 0, 1, 1, 1, 0, 1, 1
Eh bien, c'était inutile. Nous avons fait l'entrée deux fois plus longtemps.
Une autre compression sans perte
Considérons maintenant un schéma de compression différent. Dans celui-ci, nous allons représenter l'image en tant que cercles superposés. Pour chaque cercle, nous définirons un centre, un rayon et une couleur.
Notre premier bitmap deviendrait
5, 5, 1, 3, 0, 0
C'est la même longueur que notre première méthode de compression.
Et notre deuxième pourrait être soit
2, 2, 1, 2, 1, 0, 2, 0, 1
Il s’agit de trois cercles centrés sur l’élément central (qui, dans le décompte des ordinateurs, est le numéro 2, car les ordinateurs commencent à compter à 0). Un cercle a un rayon de 2 et une couleur 1. Ensuite, nous ajoutons un cercle de couleur 0 et un rayon 1. Enfin, nous avons un cercle de couleur 1 et de rayon 0. En étapes, ce serait
1, 1, 1, 1, 1
1, 0, 0, 0, 1
1, 0, 1, 0, 1
Ou
2, 2, 1, 1, 0, 0, 3, 0, 0
C'est le même cercle initial mais couvert par deux cercles de points. En étapes, ce serait
1, 1, 1, 1, 1
1, 0, 1, 1, 1
1, 0, 1, 0, 1
Ce sont à la fois une version plus courte que la première version codée mais toujours plus longue que la version originale.
Vous vous demandez peut-être pourquoi je parle de cercles et non de plages. La raison principale est que les cercles sont plus proches de ce que les vraies images bidimensionnelles utilisent.
La compression avec perte
Nous avons également le concept de schémas de compression avec perte. Ces schémas de compression sans perte peuvent être rétablis dans le tableau bitmap d'origine. Les schémas de compression avec perte peuvent ne pas être réversibles.
Considérons une version avec perte de notre méthode des cercles. En cela, nous allons utiliser une règle simple. Nous ne stockerons aucun cercle de rayon inférieur à 1. Ainsi, lors de nos deux derniers encodages, nous aurions plutôt
2, 2, 1, 2, 1, 0
et
2, 2, 1
qui convertis à nouveau en pixels sont
1, 0, 0, 0, 1
et
1, 1, 1, 1, 1
La première version est seulement un élément plus long que l'original. La deuxième version est plus courte. Les deux sont valables, donc l'algorithme est libre de développer les deux et de choisir le plus court.
Nous décrivons les images avec des règles plus restrictives comme étant de qualité inférieure.
Cette représentation des images sous forme de collections superposées de formes circulaires est similaire au fonctionnement du format Joint Photographic Experts Group ou JPEG . Ses formes sont des ellipses plutôt que des cercles, mais l'idée est similaire. Plutôt que notre méthode simpliste, il utilise la transformation en cosinus discrète pour coder les images.
Contrairement au format GIF, le format JPEG est en réalité une manière différente de représenter l’image. GIF est toujours en pixels. Ils sont juste stockés d'une manière différente. JPEG est des formes. Pour afficher un fichier JPEG, nous convertissons ensuite les formes en pixels, car c’est ainsi que fonctionnent les écrans. En théorie, nous pourrions développer un écran qui ne fonctionnerait pas de cette façon. Au lieu de pixels, il pourrait produire des formes afin de mieux correspondre au format JPEG. Bien sûr, cet écran ne serait pas capable d'afficher des bitmaps. Pour afficher un fichier BMP ou GIF, nous devons convertir en JPEG.
Si vous convertissez un fichier GIF standard, par exemple 300 x 300 pixels, le convertissez au format JPEG et réduisez le niveau de qualité, les formes de base qu'il utilise doivent être visibles. De nombreux fichiers JPEG évitent ces artefacts en commençant par une image de résolution beaucoup plus élevée.
Les images JPEG sont bien dimensionnées car ce sont des formes plutôt que des pixels. Ainsi, si vous commencez avec une image 8000x8000, convertissez-la au format JPEG et affichez-la au format 300x300, une grande partie des détails perdus auraient de toute façon été perdus. Si vous avez d'abord converti le bitmap 8000x8000 au format 300x300, puis au format JPEG, les résultats seront souvent de qualité inférieure.
MPEG
Nous avons parlé d'images fixes. Le format MPEG ou Moving Picture Experts Group utilise le même type de compression que le JPEG, mais il fait aussi autre chose. Alors qu’un moyen simple de faire de la vidéo est d’envoyer une séquence d’images fixes, MPEG envoie en fait une image, suivie d’un certain nombre d’images répertoriant les modifications et se terminant par une image de fin. La plupart des images étant similaires à l'image précédente, la liste des modifications est souvent plus petite qu'une seconde image.
La séquence normalement n'est pas si longue, disons cinq images. Mais cela contribue à rendre le flux plus petit qu'il ne le serait autrement.
Des simplifications
J'ai beaucoup ignoré. Mes images ne comportent que deux couleurs (1 bit), pas le 256 d'une image 8 bits et certainement pas les 4 294 967 296 d'une image 32 bits. Même avec des images 8 bits, notez que vous pouvez souvent choisir différentes palettes pour l'image. Donc, deux bitmaps 8 bits avec les mêmes séquences peuvent représenter des images qui semblent différentes (même forme mais couleurs différentes).
Mes images sont des lignes simples et non pas en deux dimensions. La plupart des images auront une taille de ligne spécifique stockée, ce qui rendra les tableaux bidimensionnels.
Je n'ai pas essayé de représenter les encodages réels du tout. Ils sont beaucoup plus complexes que les simples que j'ai utilisés. Je l'ai fait parce que je voulais pouvoir décrire les encodages de ce post. Je ne suis pas convaincu de pouvoir expliquer Lempel-Ziv encore moins le raffinement plus complexe de Lempel-Ziv-Welch en une seule réponse. Et je ne comprends pas suffisamment bien la transformation de Fourier pour pouvoir les expliquer en détail.
Il s'agit en réalité d'une version simplifiée de la gestion des images. Cependant, j’estime qu’à des fins didactiques, il est plus facile à comprendre que la réalité plus complexe tout en touchant les points essentiels.