begin process at 2012 02 16 09:17:07
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Optimisation du code

 > RGB À R,G ET B (ET VICE VERSA) TRÈS RAPIDE

RGB À R,G ET B (ET VICE VERSA) TRÈS RAPIDE


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Optimisation du code Classé sous :rgb, rapide, couleur, color, safearray Niveau :Débutant Date de création :03/11/2006 Date de mise à jour :03/11/2006 06:36:23 Vu / téléchargé :6 057 / 376

Auteur : Renfield

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note


 Description

Sous ce titre un peu obscur, ma solution à la problématique soulevée par la source de ScSami :
http://www.vbfrance.com/code.aspx?ID=40020

En fait, l'idée est de manipuler la couleur (un Long) directement via un tableau de Byte (R,G et B)

ainsi, aucun calcul, masquage de bit ou autres ne sont nécessaires à la décomposition d'une couleur, ou à sa reconstitution d'ailleurs...

Source

  • '# Une fois initialisée...
  • ModRGB.Initialize
  • '# vous pouvez manipuler les propriétés :
  • '# Modifier une couleur
  • ModRGB.Color = &HF002AA
  • Debug.Print "ModRGB.Color = &HF002AA"
  • Debug.Print "Couleur : " & ModRGB.Color
  • '# Et lire la valeur des différents canaux :
  • Debug.Print "R : " & ModRGB.Red, ;
  • Debug.Print "G : " & ModRGB.Green, ;
  • Debug.Print "Blue : " & ModRGB.Blue
  • Debug.Print
  • '# Et si l'on modifie la couleur d'une des composantes
  • ModRGB.Green = 43
  • Debug.Print "ModRGB.Green = 43"
  • '# La valeur RGB est bien mise à jour
  • Debug.Print "Couleur : " & ModRGB.Color
  • '# Ou bien exploiter le tableau des canaux :
  • Debug.Print "R : " & ModRGB.ColorChannel(0), ;
  • Debug.Print "G : " & ModRGB.ColorChannel(1), ;
  • Debug.Print "Blue : " & ModRGB.Blue
  • Debug.Print
    '# Une fois initialisée...
    ModRGB.Initialize
    
    '# vous pouvez manipuler les propriétés :
    '# Modifier une couleur
    ModRGB.Color = &HF002AA
    Debug.Print "ModRGB.Color = &HF002AA"
    Debug.Print "Couleur : " & ModRGB.Color
    '# Et lire la valeur des différents canaux :
    Debug.Print "R : " & ModRGB.Red, ;
    Debug.Print "G : " & ModRGB.Green, ;
    Debug.Print "Blue : " & ModRGB.Blue
    Debug.Print
    
    '# Et si l'on modifie la couleur d'une des composantes
    ModRGB.Green = 43
    Debug.Print "ModRGB.Green = 43"
    '# La valeur RGB est bien mise à jour
    Debug.Print "Couleur : " & ModRGB.Color
    '# Ou bien exploiter le tableau des canaux :
    Debug.Print "R : " & ModRGB.ColorChannel(0), ;
    Debug.Print "G : " & ModRGB.ColorChannel(1), ;
    Debug.Print "Blue : " & ModRGB.Blue
    Debug.Print


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

03 novembre 2006 06:36:23 :
Ajout de commentaires dans le zip

 Sources du même auteur

Source avec Zip Source avec une capture ENUMERATION DES PORTS TCP ET IDENTIFCATION DU PROCESS (PID) ...
Source avec Zip Source avec une capture JSON PARSER - ANALYSE DE CHAINES JSON
Source avec Zip Source avec une capture MODULE DE TÉLÉCHARGEMENT DE FICHIER BASIQUE (SYNCHRONE / ASY...
Source avec Zip COURS DE PILOTAGE........D'APPLICATIONS
Source avec Zip CSOCKET - REMPLACEZ WINSOCK PAR LA VERSION 2 DES API

 Sources de la même categorie

Source avec Zip FONCTIONS PRATIQUE POUR LISTVIEW par Galactus13
Source avec une capture Source .NET (Dotnet) HISTOGRAMME - SUITE - GRAPHIQUE DE BARRES VERTICALES POUR UN... par tchconst
Source .NET (Dotnet) HISTOGRAMME (BIS) BARRES VIA DATATABLE 100 % PERSONNALISÉ par tchconst
Source avec une capture Source .NET (Dotnet) AFFICHER UN HISTOGRAMME PERSONNALISÉ par tchconst
Source avec une capture Source .NET (Dotnet) PROFIL BINAIRE D'UN OBJET par tchconst

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture COLOR PICKER par EBArtSoft
Source avec Zip Source .NET (Dotnet) SIMPLE BOITE À COULEUR par youma85
Source .NET (Dotnet) CONVERSION DE COULEUR RGB VB6 EN COULEUR ARGB .NET par PHILIPPO
Source avec Zip Source avec une capture Source .NET (Dotnet) [.NET 2] COMBOCOLOR : TOUTES LES COULEURS DANS UN COMBOBOX par Nicorombe
Source avec Zip Source avec une capture Source .NET (Dotnet) AFFICHER LA LISTE DES COULEURS UTILISER EN .NET par ManuAntibes

Commentaires et avis

Commentaire de ScSami le 03/11/2006 16:56:48

ABSOLUMENT AHURISSANT, SPLENDIDE !
C'est, je pense, exactement ce que je recherchais !!!
...

Commentaire de lucgod1 le 04/11/2006 18:03:27

Merci, RENFIELD... ce qui suit ne remplace en rien ton travail...
Pour les internautes divers (INFO)...
http://www.01net.com/telecharger/windows/Multimedia/outils_internet/fiches/17864.html

Commentaire de lucgod1 le 04/11/2006 18:31:14

Excuses-moi RENFIELD, LUGOD1 rectifie, le site POUR INFO est ...
http://pourpre.com/colorbox/
...(interressant pour les équivalences).
Bye from Liège-BELGIUM.

Commentaire de ScSami le 06/11/2006 13:49:33

Heu... dit Renfield, en fait, j'ai bien une question là qui me taraude... Dans ton code :
Public Sub Initialize()
With mlpColorValueSA
.intDimensions = 1 '# Tableau une dimension
.lngElements = 1  '??????????????????? Pourquoi ????????????????????
.lngElements = 3  '> pour la forme, le style ???
.intFeatures = cstSAfeatAuto Or cstSAfeatStatic Or cstSAfeatFixedSize
.pvData = VarPtr(Color)
End With

Pi dit moi... c'est bien de nous inviter à consulter la doc mais... dit moi tout... d'où tu tires les infos sur l'API ArrPtr ??? Perso j'utilise, peut-être à tort API-Guide et elle n'y est pas.

Pi dit, comme je n'ai encore jamais eu l'occasion de manipuler les pointeurs, dit moi, ne faut-il pas les détruire en sortie de code ???
Enfin, ce que je veux dire par là c'est que, comprenant ton code mais ne le maitrisant pas réellement, est-il fiable à 100% ? Peut-on encore l'améliorer ? Parce que je compte l'utiliser pour la source dont je vous ai parlé l'autre jour.

Commentaire de Renfield le 06/11/2006 14:01:33 administrateur CS

l'API Guide ne donne pas tout ^^

concernant ArrPtr, dis toi simplement que ca renvoie un pointeur vers un tableau.

concernant les champs du SafeArray :
'# Tableau une dimension
.cDims = 1
'# Un octet par élément (normal, pour un tableau de byte :p)
.cbElements = 1
'# Notre tableau comporte trois éléments
.cElements = 3

en gros, on déclare simplement un tableau a une dimension, de trois octets...
(donc trois éléments prenant chaqun un octet.)

en sortie, dans l'absolu, il faudrait sans doute remettre l'entête du tableau qui était là, à l'origine...
mais rien de bien méchant.

Commentaire de ScSami le 06/11/2006 14:48:44

Arf, j'ai peur de pas avoir tout compris... Soyont clair :
cbElements = 1 c'est pour dire => 1 octet
cElements = 3 c'est pour dire => 3 élément
ou alors l'inverse ???
Et si c'est bien ça, est-ce que mettre cbElements = 4 nous donnera 3 éléments de type Long ???

Je sais bien que API-Guide n'a pas tout... mais alors... D'OÙ TU TIRES TOUTES CES INFOS ??? De la MSDN sur le site de Ms ???

Pi j'ai pas non plus très bien compris ta suggestion... Remettre l'entête du tableau en sortie !?!?!? De quel tableau, pi quelle entête ???

Sami l'newbie ;-)

Commentaire de Renfield le 06/11/2006 15:28:57 administrateur CS

cbElements = 1 c'est pour dire => 1 octet
cElements = 3 c'est pour dire => 3 élément

mettre cbElements = 4 nous donnera 4 éléments de type Byte

un tableau, en VB est un SafeArray
un SafeArray, c'est :

Private Type SafeArray
    cDims As Integer
    fFeatures As Integer
    cbElements As Long
    cLocks As Long
    pvData As Long
    rgsaBound() as SafeArrayBound '(selon le nombre de dimensions)
End Type

Private SafeArrayBound
     cElements As Long
     lLbound As Long
End Type

pour une dimension, on peut n'utiliser qu'une seule structure

ici, nous fabriquons un entête, en spécifiant les dimensions de notre tableau.
ensuite, nous faisons en sorte que le tableau ColorChannel() utilise notre entête personnalisé. (le CopyMemory...)

Doc dispo sur :
http://msdn2.microsoft.com/en-us/library/ms221482(VS.80).aspx

Commentaire de ScSami le 06/11/2006 16:34:22

Je te remercie pour ces quelques explications - même si j'ai pas encore vraiment compris la dif entre le cEl. et le cbEl. [je pige vite mais faut m'expliquer lontemps...], je n'auserais pas t'en demander plus. Oh pi ça irra, le principal c'est que je comprenne à peu prêt ce que je fais, les détails, on s'en fout ;-)  [warf l'newbie !!!]

Commentaire de ScSami le 09/11/2006 00:08:05

Remoi. Eh oui, je vais encore t'embêter un peu... Faut bien, parce qu'après tout, ce code est vraiment à la base de mon projet et faut donc qu'il soit le plus "parfait" possible.

J'ai modifier ton code comme ceci (module de classe) :
(Les principales modifications : rename des éléments, utilisation de la procédure événementielle _Initialize, Gestion des erreurs de Couleur

Option Explicit

Private Type typSafeArray
intDimensions As Integer
intFeatures   As Integer
lngElements   As Long
lngLocks      As Long
lngData       As Long
lngNbrBytes   As Long
lngLbound     As Long
End Type

Private Const cstSAfeatAuto = &H1
Private Const cstSAfeatStatic = &H2
Private Const cstSAfeatFixedSize = &H10

Private Declare Function ArrPtr ...
Private Declare Sub CopyMemory ...

Private lngColor           As Long
Private tblComponentRGB()  As Byte
Private stcSafeArrayCvalue As typSafeArray

Private Sub Class_Initialize()
With stcSafeArrayCvalue
  .intDimensions = 1
  .lngElements = 1
  .lngNbrBytes = 3
  .intFeatures = cstSAfeatAuto Or cstSAfeatStatic Or cstSAfeatFixedSize
  .lngData = VarPtr(lngColor)
End With
CopyMemory ByVal ArrPtr(tblComponentRGB), VarPtr(stcSafeArrayCvalue), 4
End Sub

Public Property Get R() As Byte: R = tblComponentRGB(0): End Property
...G puis B
Public Property Get C() As Long: C = lngColor: End Property

Public Property Let R(ByVal Value As Byte): tblComponentRGB(0) = Value: End Property
... G puis B

Public Property Let C(ByVal Value As Long)
On Error GoTo ErrorManagement
If Value < 0 Then Value = Abs(Value)
If Value > 16777215 Then
  Value = Value Mod 16777215
Else
  lngColor = Value
End If
Exit Property

ErrorManagement:
Err.Raise Err.Number, "zzzGDI.clsRGBC", Err.Description
End Property


Dit moi, ne crois-tu pas nécessaire de gérer la couleur via l'interface Get/Let plutot qu'en variable Long public ???
Selon toi, la gestion d'erreur est bonne ou ça risque de poser des problèmes (à cause de l'utilisation d'API par exemple...) ???
Selon toi, quelles sont les retentissements de ces modifs tant sur l'utilisation de la mémoire que sur la vitesse (bénignes, ...) ???

Pi y'a toujours un truc que je pige pas avec CopyMemory... Là, ça te crée bien un "lien mémoire", mais ce lien, que devient-il à la destruction de l'objet ??? Parce que sinon on a aussi _Terminate !

Comme je vais utiliser pas mal d'instances de cet objet (jusqu'a une quinzaine simultanément), cela ne risque-t-il pas de poser un quelconque problème ?


Je sais, chuis chiant pour pas dire casse-cou***e :D

Commentaire de ScSami le 09/11/2006 00:14:42

En fait, là, j'ai carrément un doute (bon, le code fonctionne mais...).
Le fait de faire ça :  (assigner des valeurs à l'arguments de la procédure)
If Value < 0 Then Value = Abs(Value)
If Value > 16777215 Then
  Value = Value Mod 16777215
Est-ce que ça pompe plus de mémoire (normalement non mais...) ???
Il faut que le truc soit vraiment très rapide... Vois-tu une autre optimisation possible (dans l'ordre des tests par exemple, ou alors, les éviter carrément par on ne sait trop quelle malicieuse astuce) ?

Commentaire de Renfield le 09/11/2006 11:03:57 administrateur CS

pas utiles ces verifs...
VB va s'assurer tout seul que tu places bien un Long

evites de renommer a ton gout les variables, constantes et type issus d'API

Commentaire de darth3d le 20/06/2007 16:34:41

Yaaaar !

Justement ce que je cherchais :)
Ca va me faire gagner du temp ce petit code !
Dans tout les cas ca merite une bonne note ;)

@++

Commentaire de Renfield le 20/06/2007 16:43:41 administrateur CS

ravi que ca te plaise

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

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' 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  recupere la color paplette et modifier une couleur [ par fdo ] BonjoursJ'aimerais recupere la color palette d'une picture box et changer certaine couleurmerci d'avence fonction "police" [ par badboy93120 ] Salut, j'aimerai faire une procédure ou fonction qui prend comme paramètre d'entrée " nom" qui es une cellule ou partie de cellule, "gras" un boolean, couleur vb en couleur Web [ par pcpunch ] Slt je cherche un moyen de transformer une couleur vb en courleur Web (format RRGGBB Hex : Code couelur pour Skin Bsplayer)G bien une source mais ca f [?] 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 VB.NET faire comprendre au programme un code couleur [ par Valgar33 ] En fait j'ai une chaine de caract&#232;res comme ca&nbsp;&nbsp; : &nbsp; "Color [A=255, R=0, G=128, B=64]" et je voudrais assigner cette chaine &#224 Convertir String contenant Color : [couleur] en Color.couleur... [ par tinux ] Bonjour à tous !Voilà dans un fichier .ini j'ai enregistré les valeurs ForeColor d'un Label1  et BackColor d'un Label2 ainsi qu' une catégorie que l'o Sauvegarde de couleur impossible ? [ par capuccino_fr ] Bonjour, je cherche a sauvegarder des couleurs pour l'utilisateur, mùais je n'y arrive pas . Je m'explique : je peux les sauvegarder dans un fichier . Couleur de fond d'une cellule excel [ par lorre0041 ] Bonjour,Je suis débutant en vb et réalise des programme sur exel 97.Je souhaite changer la couleur de fond d'une cellule depuis un bouton :Private Sub


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,841 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales