Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DÉVELOPPEMENT D'UN CODEC DE COMPRESSION/DÉCOMPRESSION D'IMAGES


Information sur la source

Description

Cliquez pour voir la capture en taille normale
    Le zip contient:
        - Les sources du codec
        - Les sources du programme de test utilisant le codec
        - La documentation compléte du projet
 

Conclusion

SPECIFICATIONS CVC (document présent dans le zip)




I Format brut
A - Définition

B - Format



II Compression CVC

A - Principes

B - Notion de variation

C - Compression
C1 - Méthodes de balayage
C2 - Normalisation du flux
C3 - Matrice des variation
C4 - Atténuation de la perte de données
C5 - Compression de la matrice des variations
C6 - Ecriture dans le fichier

D - Décompression



Annexes :

1 - Compression CVC de base
2 - Compression RLE (24 bits)
3 - Format cvc

I Format brut

A - Définition
Le format brut d'une image est un flux de pixels ordonnés non compressé. Il correspond à une représentation d'une image sous sa forme la plus simple. Peu importe le format d'image source utilisé, le format brut d'une image sera toujours le même.


B - Format
Une image peut être transcrite en informatique comme un tableau à 2 dimensions contenant des pixels ; chaque pixel est caractérisé par une couleur. Suivant la profondeur de couleur choisie (8, 16, 24 ou 32 bits), nous pourront attribuer une plage plus ou moins importante de couleurs à chaque pixel.
8 bits : 256 couleurs
16 bits : 65'536 couleurs
24 bits : 16'777'216 couleurs
32 bits : 4'294'967'296 couleurs

Dans l'étude de la compression CVC, nous allons nous limiter au mode 24 bits RGB(Red Green Blue) même si les autres modes peuvent être implémentés.

Le mode 24 bits permet de stocker chaque pixel sur 3 octets ; chacun de ces octets correspond à une couleur (Rouge, Vert et Bleu RVB ou RGB en Anglais). Chacune de ces composantes contient une valeur comprise entre 0 et 255. Il est alors possible, pour chaque pixel, de connaître la valeur de chacune des composantes de sa couleur.

II Compression CVC

A - Principes
La compression CVC repose sur la notion de variation de couleurs qu'il existe dans un flux de pixels (format brut) RGB. En plus de compresser les variations, CVC utilise aussi la technologie RLE (Run Lenght Encoding) afin d'obtenir des ratios de compression plus importants.


B - Notion de variation
Une variation est la différence numérique qui sépare deux couleurs. Elle peut être positive mais aussi négative. Pour pouvoir calculer la variation, il faut regrouper les composantes (rouge, verte et bleue) afin d'obtenir un nombre codé sur 3 octets ; ce nombre est appelé valeur numérique.

Valeur numérique d'une couleur :
La valeur numérique d'une couleur est notée Vn.
Voici la formule utilisée pour obtenir la valeur numérique d'une couleur(notation c++) :
Vn = (Bleu<<16) | (Vert<<8) | Rouge


Exemple 1:
Valeur numérique de la couleur grise (Rouge : 128 / Vert  128 / Bleu  128)
Vn=(128<<16) | (128<<8) | 128
Vn= 8'421'504


Variation numérique :
La variation numérique qu'il existe entre deux couleurs x et y est notée Va(x Þ y)

Voici la formule utilisée pour calculer la variation de deux couleurs :
Va(x Þ y) = Vn(y) - Vn(x)

Exemple 2:
Variation numérique entre la couleur bleue(Rouge 0 / Vert 0 / Bleu 255) et rouge (Rouge 255 / Vert 0 / Bleu 0).
Soit b = bleu
Soir r = rouge

Vn(b) = (255<<16) | (0<<8) | 0
Vn(b) = 16'711'680

Vn(r) = (0<<16) | (0<<8) | 255
Vn(r) = 255

Représentation binaire :
Bleu Vert Rouge   Valeur
Bleu   = 11111111 00000000 00000000 = 16'711'680
Rouge   = 00000000 00000000 11111111 = 255

Va(b Þ r) = Vn(r) - Vn(b)
Va(b Þ r) = 255 - 16'711'680
Va(b Þ r) = -16'711'425

Une variation est relative et elle peut donc être négative ou positive. Le principe de base de la méthode CVC est de stocker la variation de couleur entre chaque pixel et non pas la couleur du pixel.


C - Compression
Nous allons maintenant étudier les différentes étapes de la compression CVC. Pour des informations complémentaires, reportez-vous aux annexes 1,2 et 3.

C1 - Méthodes de balayage
Avant de créer la matrice des variations (voir C2), il faut choisir une méthode de balayage. Il en existe 2. La méthode de balayage verticale scanne le flux de pixel verticalement tandis que la méthode de balayage horizontale le scanne horizontalement.
Le ratio de compression final pourra être différent en fonction du mode de balayage retenu car il en résultera une matrice des variations totalement différente.


C2 - Normalisation du flux
La toute première opération à effectuer est une normalisation du flux. L'utilité de cette normalisation sera expliquée plus tard dans le paragraphe C4. Pour le moment nous allons juste voir comment cette normalisation est implémentée.
La compression CVC est une compression avec perte de données (même si elle reste négligeable). Cette perte a une valeur décimale égale à 8. (la nature de cette perte sera expliquée au paragraphe C4). La normalisation du flux permet de prendre en compte cette perte de données et d'éviter toute erreur lors de l'étape d'aténuation d'erreurs.
La normalisation vérifie pour chaque composante rouge, verte et bleue de chaque pixel si un dépassement de capacité (débordement si la valeur d'une composante est <0 ou >255) est possible lors de l'étape d'aténuation d'erreurs. Si un dépassement est possible, la couleur du pixel est corrigée.
Voici la formule utilisée :

Soit PERTE = 8 (perte de données maximale)
Soit pixel.Composante une composante de couleur (rouge, verte ou bleue comprise entre 0 et 255) du pixel courant pixel.

SI(pixel.Composante < PERTE)
pixel.Composante = PERTE;
SINON SI(pixel.Composante > (255-PERTE))
pixel.Composante = (255-PERTE);


C3 - Matrice des variations
La matrice des variation est un tableau à une dimension (mais pouvant être représenté comme un tableau à deux dimensions pour se rapprocher de la représentation d'une image) contenant la liste des variations de couleurs du flux de pixel. Ce flux peut être balayé de deux façons différentes (voir C1), selon la méthode retenue, on obtiendra une matrice différente avec une capacité de compression différente.
Pour créer cette matrice, on calcule pour chaque pixel la variation avec le pixel qui le précède dans le flux normalisé. Pour le premier pixel, la couleur de référence est le noir (Vn=0).

C4 - Atténuation de la perte de données
La perte de données maximale de la compression CVC est égale à 8 (valeur décimale) Les 3 bits réservés lors de la compression correspondent à une capacité de stockage égale à 8 ce qui explique cette perte de données.
Comme CVC utilise la variation de couleur comme mode de stockage (les variations sont interdépendantes les unes des autres), la perte de donnée s'additionne au fil de la compression. Il est alors nécessaire de réduire au maximum cette perte de données.
Pour cela, on ajoute à la variation courante le résultat du modulo 8 appliqué sur la variation précédente. Ainsi, la perte de données est atténuée car on récupère la perte de données de la variation courante sur les variations suivantes :
Variation_courante += Variation_precedente % 8

C5 - Compression de la matrice des variations
Maintenant que la matrice des variations est prête, nous pouvons commencer à la compresser. Réportez-vous à aux annexes 1, 2 et 3 pour plus d'informations.
La compression de la matrice reprend les règles ennoncées dans les annexes de ce document. Pour chaque variation, on determine le nombre d'octets necessaires à son enregistrement, on vérifie ensuite si la compression RLE peut être utilisée. Il suffit ensuite d'encoder la variation, de paramètrer convenablement les 3 bits de poids faible du premier octet et d'enregistrer octet par octet le résultat.

C6 - Enregistrement dans le fichier
Une fois la matrice compréssée, il suffit de générer le header du fichier. Ensuite, il faut enregistrer le header dans le fichier puis la matrice compressée. Le fichier cvc est alors enregistré.

D - Décompression
Nous n'étudirons pas les diférentes étapes de la décompression de fichier cvc. Il suffit juste d'implementer le processus inverse de la compression CVC.
Annexe 1 : Compression CVC de base

Une variation peut prendre une valeur comprise entre -16'777'215 et 16'777'215 (Va(Noir Þ Blanc) et Va(Blanc Þ Noir)).
Si l'on considère uniquement la valeur absolue de la variation maximale possible, il nous faudrait au maximum 3 octets pour la stocker. Par contre, le stockage du signe de cette variation reste obligatoire, on réserve donc le bit de poids faible du premier octet pour stocker le signe de la variation.

Chaque variation pourra être stockée sur un nombre d'octets différents en fonction de sa valeur numérique. Voici le tableau explicatif :
Valeur décimale de la variation : Nombre d'octets nécessaires : Ratio (par rapport au format brut)
<=256 1 66
>256 ET <=65536 2 33
> 65536 3 0

Exemple :

Flux brut (format RGB):
255 ;0 ;0 0 ;0 ;255
0 ;255 ;0 0 ;255 ;0


Calcul des valeur numériques :
255 16'711'680
65'280 65'280


:
255 16'711'425 -16'646'400 0
Matrice des variations en balayage horizontal :

Annexe 2 : Compression RLE

La compression CVC utilise RLE afin d'atteindre des ratios encore plus élevés. Il arrive parfois que plusieurs variations voisines (dans la matrice des variations) aient la même valeur numérique (il s'agit souvent d'une variation égale à 0 et donc de plusieurs pixels continus de même couleur). Sans RLE, il faudrait coder chacune de ces variations ce qui représente une perte de place non négligeable. RLE permet de coder jusqu'à 224 variations continues identiques en seulement 4 octets. Lorsque plusieurs variations qui se suivent sont identiques, l'utilisation de RLE devient possible.
RLE demande 4 octets pour être utilisé (1 octet réservé et 3 octets pour enregistrer le nombre de variations, on parle alors de RLE 24 bits), il faut donc l'utiliser uniquement si une compression est possible. C'est pour cela que l'on a défini des seuils à partir desquels la compression RLE devient avantageuse :

Seuils pour une variation codée sur:
- 1 octet  = 5
- 2 octets = 2
- 3 octets = 3

Annexe 3 : Format cvc

Dans cette partie nous allons définir la structure du fichier. Celui-ci portera par défaut l'extension cvc (*.cvc).

Le header est l'en tête du fichier, il contient des informations relative au fichier CVC (version, méthode de compression utilisée etc.)
Header :
IDFichier : 1 octet (tag permettant d'identifier un fichier cvc)
Version :   1 octet (version de CVC utilisée lors de la compression)
Reservé1 : 1 octet (réservé pour une utilisation ultérieure)
Reservé2 : 1 octet (idem)
Image_Info : Hauteur : 4 octets
Largeur : 4 octets

Taille totale du header : 12 octets.

La partie Image_Info contient les informations relatives à l'image compressée (dimensions). Résolution maximale : 4'294'967'296 x 4'294'967'296 (soit une image de plusieurs millions de teraoctets en format brut)

Après le header, on trouve la matrice compressée.

Chaque variation compressée est enregistrée à l'envers dans le fichier (octet de poid faible en premier) car le premier octet doit contenir les 3 bits réservés qui sont indispensables pour l'étape de décompression.

Dans ce tableau, on ne s'occupe que des 3 bits de poids faible, les autres bits sont grisés.
Bit réservé Utilisation
00111000 Signe de la variation (0 si positive, 1 si négative)
00111000 Les deux bits suivants peuvent prendre plusieurs valeurs :  00 : Flag RLE, indique que les 3 prochains octets contiennent le nombre de variations identiques. Dans ce cas, tous les autres bits de cet octet valent 0.  01 : Variation <= à 256 qui sera donc codée sur un octet.  10 : Variation > à 256 et <= 65536 qui sera donc codée sur deux octets. (dont un octet situé après celui-ci)  11 : Ce  pixel possède une variation > 65536 qui sera donc codée sur trois octets. (dont deux octets situés après celui-ci)

Exemple 1 :
Nous avons une variation x qui vaut 211 (11010011 en binaire)
Celle-ci nécessite un seul octet pour être enregistrée
Voici donc comment sera codée la variation : 11010010
Il y a ici une perte de donnée (valeur : 3).

Exemple 2 :
Nous avons une variation y qui vaut -15000 (00111010 10011000 en binaire, on ne stocke pas le signe)
Celle-ci nécessite deux octets pour être enregistrée
Voici donc comment sera codée la variation :  10011101 00111010
Le bit de poid faible du premier octet prend la valeur 1 lorsque la variation est négative.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Crazyht le 17/06/2004 09:48:24 administrateur CS

Bon, j'ai pas encore regarder le code dans son integralité, mais apparement il est commenté, en plus la doc est super :) Donc 10 :)

Continu comme ca

signaler à un administrateur
Commentaire de crack_xp le 17/06/2004 21:02:48

trés sympa. comme principe
Bon Courage pour ta prog...
A bientot

signaler à un administrateur
Commentaire de khenshin le 18/06/2004 18:47:55

Bon travaille,


Tu pourrais en faire quelque chose de tres bien ;)

Ne lache pas

signaler à un administrateur
Commentaire de ccarniel le 21/06/2004 07:53:16

pas mal.
Deux commentaires:
Dans btnCompress_Click(),
       const string tempFile = @"c:\temp.cvc";
c'est pas génial, même si j'ai effectivement un disque C:, il faudrait utiliser les variables d'environnement pour trouver le chemin de TEMP (ou TMP).

Deuxièmement, concernant le mode de compression, pourquoi utiliser RLE qui est très peu efficace alors que LZW l'est nettement plus et que le brevet est tombé il y a quelques temps. Et concernant la matrice, pourquoi faire directement une variation RVB et comprimer cela plutot que de compresser indépendemment les différentes composantes, parce qu'avec ta méthode actuelle, le chaque composante déborde à coté (du fait de la retenue) et nuit donc à une bonne compression.

Voila, simples idées et suggestions.


Ah si j'oubliais: Le code est bien commenté :)

signaler à un administrateur
Commentaire de cobra84 le 21/06/2004 10:59:35

ccarniel, je tient à te remercier pour tes remarques très pertinentes.

Pour le fichier temporaire, je suis tout à fait d'accord avec toi. Je m'était contenté de cette solution vraiment peu fiable car le fichier temporaire est utilisé uniquement dans le programme d'étude... Tu me diras ce n'est pas une bonne excuse... ;-)

Il est clait que la compression CVC peut être sujete à de très nombreuses améliorations; et c'est pour cela que j'ai distribué ces sources. A la base, ce projet était simplement une activité pour mon BTS. Maintenant, à vous de l'améliorer car je n'aurait certainement plus le temps et le courage de le faire ;-)

Bonne prog
;-)

signaler à un administrateur
Commentaire de Kikuts le 23/01/2007 11:13:06

ouap ! chu en bts aussi et mes activités sont loin d'être aussi bonnes que la tienne ^^ chapeau ! t'as eu combien ?
merci grâce à toi j'ai compris le concepts de compression d'image ^^

signaler à un administrateur
Commentaire de Zeroc00l le 05/09/2007 20:43:01

Ca serait sympa de génerer le fichier bmp équivalent à la décompression de ton format.
Parce que la à part générer un fichier qu'on peut pas utiliser ... ça sert à rien :(
L'image est trop petite dans l'application ... pour qu'on puisse vraiment comparer :(
Aller j'attend la mise à jour  ... :)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

[C#] Compression d'image [ par bibicool ] Bonjour &#224; tous, Dans mon projet, je dois faire des acquisitions d'image, tout fonctionne nickel, l'acquisition de mon image se passe bien et m Probleme de fichier utilisé [ par MorpionMx ] Bonjour, J'ai une appli qui me permet de loader un image dans une PictureBox. Cette image est copiée ensuite dans un Bitmap. Avec une trackBar, j'appl la compression d'image numerique par diagrammes de Voronoi [ par aoubid ] bnj,quelqu'un a une application pour la compression d'image numerique par diagrammes de Voronoimerci d'avance. Désire créer un nouveau CODEC (Audio) comme OGG Étapes à suivre? [ par LHUPA ] Code-Sources,Je désire créer un nouveau CODEC (Audio) pour le plaisir de la chose et la satisfaction d'avoir créé un nouveau degré de compression de f Rotation d'image [ par olibara ] BonjourJ'aimerais faire une rotation d'image (90°)Mais comme l'image est rectangulaire, j'aimerais que l'image rotée reste dans le meme cadreImage.Rot Clear d'une image [ par olibara ] BonjourJ'utilise une image asser grande (2048 x 1024) avec fond transparent (pas défini)Je dois parfois effacer cette image avant de la redessinerActu pictureBox bords arrondis [ par ChamY ] Bonjour,J'ai fais pas mal de recherche pour essayer de trouver une réponse à mon probleme (qui me parait pas tres compliqué), mais je n'ai rien trouvé Convertir to JPEG [ par ymas00 ] Bonjour,SVP, je cherche comment convertir une image bmp,tiff... en  jpeg sans enregistrer l'image dans le disque, car il y a la methode save de la cla Capture d'un picturebox à sa MAJ "visuelle" [ par GUNNM4575 ] Bonjour à vous,Je dois prendre une photo, avec une webcam, l'image d'un picturebox que je viens de changer.Cela doit être fait le plus rapidement poss


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 1,123 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.