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 !

DE RGB À R, G ET B, LA MEILLEUR TECHNIQUE EN VB !


Information sur la source

Catégorie :Graphique Classé sous : rgb, couleur, 24 Niveau : Initié Date de création : 22/10/2006 Vu : 3 129

Note :
Aucune note

Commentaire sur cette source (21)
Ajouter un commentaire et/ou une note

Description

Voici, bien humblement, la façon la plus rapide de décomposer une couleur 24-bits en ses composantes colorimétriques (8-bits) sous VB6. Elle allie en réalité les deux façons les plus courantes d'appréhender le problème.
J'ai juste modifié le calcul de la composante colorimétrique bleue qui, habituellement, nous est présenté sous cette forme :
B= (C& And &HFF0000) \ &H10000
et l'ai simplifié sous celle-ci :
B = C& \ &H10000

Pour la compréhension, référez-vous aux trop nombreuses sources déjà présentes à ce sujet sur Codes-Sources et VBFrance.

Tout ce que je peux vous rappeler c'est que :

- "\" est un division ne renvoyant que la sa partie entière (autrement dit, tronquant la partie décimale, le reste de la division... l'inverse du modulo quoi !)

- &Hxxx& sont des nombres sous forme hexadécimale (base 16) dont voici ceux utilisé présentement :
    Hexa     Dec       Bin    R           G           B     --
        FF =        255 = 0000'0000 | 0000'0000 | 1111'1111.--
       100 =        256 = 0000'0000 | 0000'0001 | 0000'0000.--
      FF00 =     65'280 = 0000'0000 | 1111'1111 | 0000'0000.--
     10000 =     65'536 = 0000'0001 | 0000'0000 | 0000'0000.--
    FF0000 = 16'711'680 = 1111'1111 | 0000'0000 | 0000'0000.--

- Que la fonction logique AND (ET en français) est :
   0 and 0 = 0
   0 and 1 = 0
   1 and 0 = 0
   1 and 1 = 1

 

Source

  • 'A vous de mettre ça sous forme de fonction ou de procédure !
  • Dim C As Long 'Couleur codée en 24 bits [mot de 3 octets] (de 0 à 16'777'215)
  • Dim R As Byte 'Composante Rouge ( Red en anglais) codée sur 1 octet (de 0 à 255)
  • Dim G As Byte 'Composante Vert (Green en anglais) codée sur 1 octet (de 0 à 255)
  • Dim B As Byte 'Composante Bleu ( Blue en anglais) codée sur 1 octet (de 0 à 255)
  • R = C& And &HFF&
  • G = (C& And &HFF00&) \ &H100&
  • B = C& \ &H10000 'au lieu de B= (C& And &HFF0000) \ &H10000
 
 'A vous de mettre ça sous forme de fonction ou de procédure !
 
 Dim C As Long  'Couleur codée en 24 bits [mot de 3 octets] (de 0 à 16'777'215)

 Dim R As Byte  'Composante Rouge (  Red en anglais) codée sur 1 octet (de 0 à 255)
 Dim G As Byte  'Composante Vert  (Green en anglais) codée sur 1 octet (de 0 à 255)
 Dim B As Byte  'Composante Bleu  ( Blue en anglais) codée sur 1 octet (de 0 à 255)
  
 R = C& And &HFF&
 G = (C& And &HFF00&) \ &H100&
 B = C& \ &H10000  'au lieu de B= (C& And &HFF0000) \ &H10000
 

Conclusion

Si vous trouvez plus "rapide" (à part faire en sorte de ne pas avoir à décomposer la couleur), je suis preneur !
 

Commentaires et avis

signaler à un administrateur
Commentaire de MadM@tt le 22/10/2006 15:15:09

Renfield avait utilisé un CopyMemory une fois, mais bon aucune idée si c'est plus rapide ou pas, car cela nécessite de déclarer l'api et d'y faire appel. Mais aucun calcul, il faisait un copymemory du premier octet dans l'octet R, le second dans G et le troisième dans B.


Voilà, en tout cas cette source est incontestablement une bonne idée (si c'est effectivement la méthode la plus rapide ;), car il en existe des tonnes à ce sujet et impossible de savoir laquelle choisir.

Je me tiens au courant ;)

signaler à un administrateur
Commentaire de EBArtSoft le 22/10/2006 17:23:54 administrateur CS

Voici un eautre methode ni plus rapide et pas forcement plus simple mais c'est toujours bon a savoir :

Type RGBA
R as byte
G as byte
B as byte
End Type

Type RGBL
X as long
End Type

dim x as RGBL
dim y as RGBA

'========================
'passé de long a RGB
'========================

x = vbGreeb 'vbRed 'vbBlue
lset y = x

'========================
'ou inversement
'========================

y.r = 255
lset x = y

Donc en resumé aucune api aucun operateur juste une affectation de variable (dans l'exe ce sera un peu different mais bon on va s'arreter la)

@+

signaler à un administrateur
Commentaire de Renfield le 22/10/2006 18:45:23 administrateur CS

LSet est une sorte de copie mémoire...
étrange que cela passe, je vois 3 bits d'un coté, dans ta structure, mais quatre, dans l'autre structure, qui contient le long :/

si ce genre de conversion devient une habitude, dans le code, je pense que le plus rapide est de greffer un tableau de bits sur l'espace mémoire d'un long...

ainsi, modifier les bits du tableaux impacteront également le long, sans aucune opération directe (ou en coulisses, d'ailleurs) supplémentaire...

(voir doc sur les SafeArray)

signaler à un administrateur
Commentaire de ScSami le 22/10/2006 19:14:27

Arf, c'est vrai, y'a en effet plus rapide si on ne fait même pas de calculs en bossant avec la mémoire (j'avais oublié). Mais bon, disons que ma source n'est qu'un petit erratum par rapport aux nombreuses sources utilisant cette technique.

Il serait intéressant de faire un bon tuto la-dessus... je trouve que c'est un très bon moyen de mieux appréhender les manipulations du bit et de l'octet... Seulement voilà, je ne maitrise pas toutes les techniques liées à la manipulation de la mémoire (CopyMemory, ...)...

Mais je trouve la solution d'EBArt sympa !!!
(Pi dans la série "réinventer la roue", prochaines sources : le WuPixel et Traçage d'une Ligne [et non "prisage d'une li..."]).

signaler à un administrateur
Commentaire de Warning le 24/10/2006 01:14:33 administrateur CS

Et pour prendre en compte les couleurs système:

Private Declare Function OleTranslateColor Lib "olepro32.dll" (ByVal OLE_COLOR As Long, ByVal hPalette As Long, pccolorref As Any) As Long

Private Sub Command1_Click()
Dim bRGB(0 To 3) As Long
Dim lColor As Long

OleTranslateColor lColor, 0, bRGB(0)

End Sub

signaler à un administrateur
Commentaire de EBArtSoft le 24/10/2006 08:21:38 administrateur CS

Oulalal Warning a utilisé une API !! Tu sorts !

lol ;)

@+

signaler à un administrateur
Commentaire de GeneticW le 31/10/2006 13:30:22

J'utilise depuis des années la methode d'Ebart,

mais la methode de ScSami, utilisant les bit pourrais je crois etre amélioré et devenir "la methode" comme il dit.

La gestion de Bit etant plus rapide que tout en Vb ca c'est la base.

signaler à un administrateur
Commentaire de ScSami le 02/11/2006 22:30:43

Oulala... je m'engagerais pas là perso !!!
Non, a mon avis, la technique d'EB est la meilleur et de loin (même si les structures de types sont pas aisées à manipuler) parce que je fais appelle a des opérateurs arithmétiques.
Ceci dit, là, franchement, vous m'avez foutu le doute... Alors je vais tester tout ça très vite parce qu'en plus, là, je suis en plein dans un gros code d'infographie et je dois tout optimiser à fond.
Juste pour info, le petit truc que je vous prépare va tout déchirer... WuPixel, Anti-Aliasing, lignes et triangles avec motifs, le tout gérant l'Alpha (translucidité), ... Je vous en dis pas plus... La révolution est en marche ;D
N'empêche que je voulais demander à EB ce qu'il pensait de la technique peu orthodoxe de Warning ???
(Genetiw, dit, comment tu penses pouvoir améliorer ça ??????? Pas possible, tout est optimisé à fond dans ce povre code !!! Je vois pas quoi faire de plus si ce n'est changer de technique !)

signaler à un administrateur
Commentaire de EBArtSoft le 02/11/2006 23:07:46 administrateur CS

Ce que je pense de la methode de Warning ?
Et bien deja moi ... Warning je l'aime bien ! lol :p

Nan en fait c'est bien dans un prog à priorité "normal" mais si tu fait du code "critique" alors la meilleur methode n'est surement pas celle ci. Deja oublie les couleurs systeme c'est inutile dans un prog graphique autant utilisé un RGBA traditionnel et si vraiment t'as besoin des syscolor fait une boite de dialogue et une fonction de conversion.

Dans ton code si tu veux optimisé tu va devoir choisir "LA" methode qui correspond a ton algo. Par exemple si tu brasses des pixel a la volé autant créer un tableau a x dimension de type RGBA la manoipulation sera naturelle. Si tu travailes au coup par coup un copymemory sera la plus simple des methodes. Puis surtout n'oublie pas que l'optimisation est pyramidale c'est a dire que l'on part du plus generique au plus precis. Souvent en repanssant entierement son algo on y gagne plus qu'en optimisant par ci par la.

@+

signaler à un administrateur
Commentaire de EBArtSoft le 02/11/2006 23:08:48 administrateur CS

M'ouai je viens de relire ma remarque... je sais pas ci c'est très clair ! lol (en tout cas c'est clair que c'est plein de fautes ;P )

@+

signaler à un administrateur
Commentaire de GeneticW le 02/11/2006 23:09:47

alors voila, j'ai fait quelques test...
en éliminant les operation arithmetique dans la methode de
ScSami (en les remplacceant par du bit shifting)
la methode de ScSami est PLUS rapide que la conversion de type.

le seul HIC c'est que Vb N'offre pas de facon de faire du bit shifting alors j'ai fait une DLL en C++ pour faire l'operation de Bit Shift.  Alors... la methode est plus rapide, mais pas forcement parce que c'est plus rapide, mais peut etre parce que le C++ est plus rapide que le Vb.  vaut peut etre mieux s'en tenir a la conversion de type qui est une excellente methode.. et pas de DLL a trainer.

signaler à un administrateur
Commentaire de Renfield le 03/11/2006 06:33:38 administrateur CS

Je viens de poster :

http://www.vbfrance.com/code.aspx?ID=40189

pour illustrer la technique que j'ai exposée plus haut :

"[...] je pense que le plus rapide est de greffer un tableau de bits sur l'espace mémoire d'un long...

ainsi, modifier les bits du tableaux impacteront également le long, sans aucune opération directe (ou en coulisses, d'ailleurs) supplémentaire...

(voir doc sur les SafeArray)"

signaler à un administrateur
Commentaire de ScSami le 03/11/2006 16:44:55

Warf, merchi Renfield !!! Franchement t'assure trop grave (les autres aussi, mais perso, si j'aime bien Warning, je trouve que EB, Renfield et Brunews sont quand même les meilleurs !!! Respect les mecs : on a besoin d'vous ;-)

Du bit shifting... avec une dll... hum... Non, je préfère coder mon truc en "pure VB/APIwin32" !
Donc, pour résumer, voici toutes les techniques dont ont dispose :
- Le calcule avec des bonnes vieilles variables et chiffres en décimal ;
- Un calcul similaire (ma méthode) mais en Hexa avec des fonctions logiques et optimisé (le dernier calcul - la spécificité de ma source donc)
- Utiliser un "transfère" octal via Lset et deux structures de types (stcColor.Value en Long et stcRGB.R .G .B en Byte)
- CopyMemory, le fameux, dont j'ignore toujours l'utilisation (et l'utilité du même coup... [si on bonne âme pouvait me résumer clairement son utilisation et surtout son rôle...])
- Et enfin, en exclusivité mondiale (pour moi tout du moins... je sais, chuis pas l'centre du monde...) SafeArray

Ai-je fais le tour de toutes les stechniques envisageables ou en avez-vous d'autres cachées sur vos disques durs les amis ????
Si y'a bien que ça, qu'attendons-nous pour faire un tuto complet ???

EB] C'est, en effet, comme tu peux te l'imaginer, un prog critique et cette fois (contrairement à mes sources sur VBF) a but plus utile que pédagogique. J'utilise les API a outrance. Et je me suis rendu compte que dessiner une ligne via Line est presque plus lent que de passer par son propre code de dessin de ligne - avec toutes les améliorations qu'on peut y apporter, vous imaginez bien !!! Du coup, cette fois, je me lance pour de bon. Direction, à terme, moteur 3D perso en VB&API, juste pour le défit, mais aussi, softs de déformations vectorielles de Bitmaps (corrections cartographiques, photos panoramiques, morphing et cie), 3D pixelique (ou réelle) [invention perso], ..., ..., ...

J'aurais d'ailleurs besoin de tous vos conseils et recommandations pour l'améliorer par la suite [si le code n'est pas... TROP PARFAIT ;-))) modestie, quand tu nous tiends ,].


[c'est con que les liens internet soient pas automatiques dans les commentaires des sources !!! C++ chiant à la longue ;]

signaler à un administrateur
Commentaire de GeneticW le 03/11/2006 17:53:42

<<Du bit shifting... avec une dll... hum...
<<Non, je préfère coder mon truc en "pure VB/APIwin32

hmmm...  ma DLL est une API Win32  VS 6.0 utilisant VC

tu as sans doute voulu dire pure VB tout court.
malheureusement, Vb n'offre pas directement de bit shifting, ce qui est bien domage parce que c'est ultra rapide.

signaler à un administrateur
Commentaire de ScSami le 03/11/2006 22:46:21

Je n'ais pas voulu d'offenser Genetic, c'est juste que je préfère tout faire moi-même, garder le contrôle de mon code en quelque sorte... En tant que codeur, je pense que tu peux comprendre cet attachement à tout faire soit-même !

signaler à un administrateur
Commentaire de GeneticW le 03/11/2006 22:58:01

Non, pas offensé du tout... c'est juste qu'une API de bit shift est facile a faire, ca ma pas pris 5 minutes.

il n'y a pas de secret dans ce genre de sources...
comme tu le mentionnais, Vb a avantage a utiliser les API a cause de la vitesse.

signaler à un administrateur
Commentaire de EBArtSoft le 03/11/2006 23:30:48 administrateur CS

On peux faire du tres bon code avec VB, il suffit de comprendre la machine et d'utiliser les bon type et les bon operations. Oublier les fonctions de script, les variants, les fonction de conversion et cocher toutes les options d'optimisation. Rien que ça permet de ce rapprocher d'un code similaire en C/C++. Apres on ce heurte a l'initialisation de la stack frame, aux quelques appels inevitable a la machine virtuelle et autre gestion du code d'erreur.

Mais on peut outrepasser tout cela avec une petite injection de code assembleur bien placer et tout roule.

@+

signaler à un administrateur
Commentaire de ScSami le 04/11/2006 01:27:14

Arf, aussi facile à dire qu'a faire !!! Grrr ce qu'il peut m'énerver ce EB avec tout c'qu'il sait ;-)

signaler à un administrateur
Commentaire de fierobe le 01/12/2006 22:14:43

Je comprends rien ...

signaler à un administrateur
Commentaire de ScSami le 02/12/2006 18:41:35

Comprends-tu au moins le but du problème ?

signaler à un administrateur
Commentaire de Renfield le 02/12/2006 18:59:22 administrateur CS

Résumons...

Pour éxprimer une couleur, on utilise un nombre (Long)
par exemple, du rouge vif, sera du 16711680
et du vert, du 65280

en fait, chacune des trois couleurs (rouge vert bleu) sont mélangées, afin d'obtenir ce nombre. Nous souhaitons ici simplement retrouver la quantité de rouge, de vert et de bleu utilisée pour une couleur donnée...

est-ce plus clair ?

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Que de couleurs impossible [ par Charles Racaud ] C'est peut-être pas possible mais je chercherait un moyen pour savoir si une couleur est situer entre 2 couleur (Les couleurs sont Rouge et Rouge fonc valeur rgb d'une couleur [ par vb6fr.dll ] comment connaitre la valeur rgb d'une couleur?je voudrasi faire un showcolor(commondialog)et pouvoir conneitre la valeur rgb de la couleur choisieMerc Couleur clé et DirextX7 [ par turnam ] Voila je voudrai utilisé la couleur rouge (en fait la valeur RGB 252,0,0) comme couleur clé pour afficher une image avec de la transparence , le probl RGB Excel VB [ par eldim ] Bonjour,J'ai un petit soucis :Lorsque je r&#233;cup&#232;re la couleur d'un control VB et que j'essai de l'affecter &#224; une cellule excel la couleu changer pixels(1, 1, 1) en HLS [ par poldere ] Bonjour et bon WE de p&#226;ques, je voulais savoir si il y a une fa&#231;on facile pour un d&#233;butant pour convertir une couleur en byte d'un tabl Couleur RGB en couleur web ? [ par La biode ] Bonjour j'aimerais bien connaitre une méthode simple pour passer d'une couleur sélectionné à l'aide d'une common dialogue à un code couleur HTML pour  couleur en rgb [ par Zachs ] Bonjour, j'aimerai mettre une couleur de fonds de cellule de gridview Me.dgvEventTitle.CurrentRow.DefaultCellStyle.SelectionBackColor = Color.Redet j' Common Dialog Couleur ! - Led Rgb [ par MaaaGik ] Bonjour, j'ai réalisé un ptit montage electronique qui permet de gérér des leds rgb ( hoauouu c beau !!! ) , Est il possible de recuperer en temps ree couleur HEX vers RGB [ par petchy ] bonsoir j'ai une couleur en HEX (&amp;H00CF9874&amp;),et je voudrais trouver l'équivalence en RGB.j'ai beau chercher mais je ne trouve pas.mercipetc [?] Couleur RGB et luminosité [ par Ghislain ] Bonjour à tous,Je cherche à récupérer à partir d'une couleur (rgb ou long) la valeur des trois composantes de luminosité, teinte et contraste.Une idée


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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 : 0,437 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é.