Encodage couleur [Résolu]

Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
- - Dernière réponse : cs_cheyenne
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
- 4 août 2011 à 13:38
Bonjour,

Je cherche le moyen de coder une palette de 256 couleurs de la manière la plus compacte pour l'inscrire dans un fichier ini.

Pour l'instant j'encode chaque couleur en héxa sur 6 caractères.
   For i = 0 To 240 Step 16
      txt vbNullString: k 0
      For j = i To i + 15
         k = k + 1
         hexa = Hex$(GetPixel(picPALETTE(.hdc, j, 10))
         hexa = String$(6 - Len(hexa), "0") & hexa & IIf(k < 16, " ", "")  '	évite l'espace en bout de chaine
         txt = txt & hexa
      Next
      Call WritePrivateProfileString(section, Format$(n, "00"), txt, fichier)
      n = n + 1
   Next

Cela se présente ainsi :

[Nom de la couleur]
00=FFEDCA FFFFFF ABCDEF....
...
15=005000 9ABC8E 884433...

soit 16 lignes de 16 groupes.
A la lecture je procède ainsi :
   For i = 0 To 15
      strDATA = String(255, Chr$(0))
      taille = GetPrivateProfileString(section, Format$(i, "00"), "", strDATA, 255, fichier)
      txt = Left$(strDATA, taille)
      t() = Split(txt, " ")

      For j = 0 To 15
         hexa = t(j)
         pal(n, 0) = Val("&H" & Right$(hexa, 2))   '   rouge
         pal(n, 1) = Val("&H" & Mid$(hexa, 3, 2))  '   vert
         pal(n, 2) = Val("&H" & Left$(hexa, 2))    '   bleu
         n = n + 1
      Next
   Next

Cela fonctionne très bien mais je voudrais coder chaque couleur avec seulement 3 caractères.
Si il n'y avait pas de valeurs inférieures à 32 j'utiliserais l'ASCII pour coder chaque octet de la couleur.

Il y a t-il d'autre possibilités pour compacter ces données ?

Merci d'avance pour vos éventuelles réponses,

Cheyenne
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
14423
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 avril 2019
155
3
Merci
Bonjour,

Tu peux le faire en une ligne genre :
Palette=FFFFFF000000FFFFFF000000...

Comme 6 car=1 couleur.
Sinon, tu peux aussi dire que les poids faibles sont négligeable et que FxBx0X est strictement équivalent à FFBB00, tu peux diviser par 2 la taille des couleurs.

---------------------------------------------------------------------
[list][*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu, pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 116 internautes nous ont dit merci ce mois-ci

Commenter la réponse de NHenry
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
Bonjour NHenry,

Merci pour ta réponse.

Mais en une ligne cela représente 4068 caractères pour l'ensemble de la palette, ce qui m'est refusé.
A moins que tu ne veuilles dire pas d'espace sur chaque ligne, oui cela réduit, mais complique le décodage pour gagner seulement 285 octets.
(15 espaces/ligne * 16 lignes) + 15 * 3 octets pour les clés (09=)

Oui, certes les poids faibles sont négigeables, FF est égal à 0000FF, mais en ayant 6 octets cela m'évite de faire un test de longueur sur chaque groupe.

Cheyenne
Commenter la réponse de cs_cheyenne
Messages postés
14423
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 avril 2019
155
0
Merci
Bonjour,

Certes, mais tu peux aussi attaquer en faisant une boucle et en en prenant que les x premier caractère d'une chaine et les retirer, et ainsi de suite, jusqu'à obtenir une chaine vide.

---------------------------------------------------------------------
[list][*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu, pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
Re,

Tu peux développer, s'il te plait ?

Le x premiers, mais comment vais-je m'y retrouver si par exemple j'ai FFFF00FF0000 pour coder un rouge un vert et un bleu pour pour 3 couleurs au lieu de FF FF00 FF0000.
Comment vais-je déterminer que les premiers caractères utiles (qui sont en fait le premier groupe) sont bien FF et non pas FFFF ?

Merci.

Cheyenne
Commenter la réponse de cs_cheyenne
Messages postés
14423
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 avril 2019
155
0
Merci
Bonjour,

Si MaChaine contient la valeur :
MaChaine=Replace(MaChaine," ","")
Ensuite, pour chaque éléments :
Do while len(MaChaine)>0
Valeur=left$(MaChaine,6)
MaChaine=Mid$(MaChaine,7)
'Traitement de Valeur
Loop


Après, tu peux encore plus filtrer pour éviter les caractères non Hexa.

---------------------------------------------------------------------
[list][*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu, pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
Re,

Ah oui, d'accord, mais là on est dans la configuration d'une couleur sur 6 caractères.
En fait, avec ton idée, à chaque boucle la chaine à traiter (pour chaque ligne) diminue de 6 caractères. On peut aussi faire une boucle avec un pas de 7 et lire avec Mid$(chaine,i,6) et au départ ne pas mettre d'espace dans chaque ligne pour séparer les groupes.

C'est bien mais ça ne compacte pas beaucoup.
J'avais vu, à l'époque avec Fractint, que les couleurs étaient sauvées en ASCII avec les paramètres de la fractales. En tant que palette, c'était dans un fichier du type :
0 255 128
12 24 32
etc... pour les 256 couleurs.

Bonne soirée,

Cheyenne
Commenter la réponse de cs_cheyenne
Messages postés
14423
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 avril 2019
155
0
Merci
Bonjour,

Pour les 3 caractères :
Do while len(MaChaine)>0
Valeur=left$(MaChaine,3)
MaChaine=Mid$(MaChaine,4)
'Traitement de Valeur
R=left$(Valeur,1)
G=Mid$(Valeur,2,1)
B=Right$(Valeur,1)
MaCouleur=RGB(val("&h"&r&r),val("&h"&g&g),val("&h"&b&b)
Loop


Il te faudra mémoriser les différentes valeur dans un tableau, mais là, je suppose que tu sais faire.

Sinon, pour l'encodage, tu vois, il y a plusieurs méthodes à toi de choisir celle qui te va le mieux.

---------------------------------------------------------------------
[list][*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu, pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
Re,

Oui, ne t'inquiètes pas, tout ça je sais le faire. C'est inscrit dans un tableau "pal(255,2)" comme indiqué dans mon premier post.
C'était juste un moyen de rendre les données plus compactes que je cherchais.
Tu indiques : R=left$(Valeur,1)
Sauf que dans la sauvegarde à partir de la couleur capturée avec GetPixel le rouge ne se trouve pas à gauche mais à droite (VB6 écrit BVR) et de plus je n'ai pas besoin de la couleur mais de ses composantes. Enfin bon je ne vais pas chipoter !
Finalement nous en sommes toujours au même point on n'a pas compacté des masses !!!
Donc, ne t'offusques pas si je ne valide pas car, en fait, la question d'un compactage vraiment efficace n'est pas solutionnée.

Merci quand même de l'intérêt que tu as porté à ma question.

Cheyenne
Commenter la réponse de cs_cheyenne
Messages postés
14423
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 avril 2019
155
0
Merci
Bonjour,

Sinon, tu peux gérer en fichier binaire, un octet = 1 composante
3 octets une couleurs et donc tu auras 3*256 octets dans ton fichiers.
Ou si tu ne gardes que les poids forts, 2 méthodes :
2 octets par couleur (permettre plus tard d'ajouter un Alpha et d'adresser directement 2 octets) ou alors 3 octets=2 couleurs.

A toi de voir.

Mode d'ouverture du fichier = Binary

---------------------------------------------------------------------
[list][*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu, pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
Re de chez Re,

Bonne idée MAIS c'est pour aller dans un fichier ini.
Je me suis fait un programme de fractales dans lequel il y a un éditeur de palettes et lorsque qu'un motif me plait je sauvegarde ses paramètres dans un fichier ini. Pour la palette il y a 2 possibilités.

1) C'est une palette générale déjà créée se trouvant dans un autre fichier ini, alors la section se présente ainsi :
[Fractale Toto]
MinMax=blablabla
...
couleur=le nom de la palette

2) c'est une palette créée ou modifiée pour aller uniquement avec cette fractale :
couleur=palette
00=AABBCC...
01=DD8866...

Lors de la lecture des param si je trouve le mot palette en lieu et place d'un nom de palette je lis les 16 lignes d'hexa qui suivent.

Voilà pour le fin mot de l'histoire.

Cheyenne
Commenter la réponse de cs_cheyenne
Messages postés
14423
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 avril 2019
155
0
Merci
Bonjour,

Je persiste donc dans mes propos (les 2 derniers du 03/08).
Sinon, tu fais une ligne par couleur, mais je ne vois pas que te proposer de mieux ou encore, un coup de Base64 avec un tableau d'octet représentant l'ensemble des couleurs, mais je ne vois pas d'autres alternatives.

---------------------------------------------------------------------
[list][*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu, pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
0
Merci
Bonjour NHenry,

Bon...ben... si tu ne vois rien d'autre, tant pis !

Je crois que je vais retenir la solution qui consiste à ne pas inscrire les Ø non significatifs. Je vais donc valider cette réponse.

Ainsi au lieu d'extraire avec Left$ Mid$ et Right$ un groupe de 6 caractères je vais décomposer la couleur ainsi :
couleur Val("&H" & hexa))   ' hexa groupe de X caractères
pal(n,0) = couleur Mod 256
pal(n,1) = (couleur \ 256) And 255
pal(n,2) = (couleur \ 65536) And 255

Je vais tester quel est le plus rapide, il va falloir choisir entre allégement du fichier et vitesse d'éxécution. Mais à priori je pense que le calcul l'emportera sur l'extraction de chaine et je serai peut-être gagnant sur les deux !

Bonne journée à toi,

Cheyenne
Commenter la réponse de cs_cheyenne

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.