Encodage couleur

Résolu
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 - 3 août 2011 à 16:50
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

12 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
3 août 2011 à 18:11
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
3
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
3 août 2011 à 18:52
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
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
3 août 2011 à 19:13
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
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
3 août 2011 à 19:40
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
3 août 2011 à 19:52
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
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
3 août 2011 à 20:38
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
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
3 août 2011 à 21:03
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
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
3 août 2011 à 23:31
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
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
4 août 2011 à 00:53
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
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
4 août 2011 à 01:19
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
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
4 août 2011 à 12:44
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
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
4 août 2011 à 13:38
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
0
Rejoignez-nous