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

ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 - 3 nov. 2006 à 16:56
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 20 juin 2007 à 16:43
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/40189-rgb-a-r-g-et-b-et-vice-versa-tres-rapide

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 juin 2007 à 16:43
ravi que ca te plaise
darth3d Messages postés 6 Date d'inscription samedi 29 novembre 2003 Statut Membre Dernière intervention 8 avril 2009
20 juin 2007 à 16:34
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 ;)

@++
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
9 nov. 2006 à 11:03
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
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
9 nov. 2006 à 00:14
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) ?
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
9 nov. 2006 à 00:08
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
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
6 nov. 2006 à 16:34
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 !!!]
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
6 nov. 2006 à 15:28
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
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
6 nov. 2006 à 14:48
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 ;-)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
6 nov. 2006 à 14:01
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.
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
6 nov. 2006 à 13:49
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.
cs_lucgod1 Messages postés 10 Date d'inscription dimanche 17 septembre 2006 Statut Membre Dernière intervention 24 janvier 2007
4 nov. 2006 à 18:31
Excuses-moi RENFIELD, LUGOD1 rectifie, le site POUR INFO est ...
http://pourpre.com/colorbox/
...(interressant pour les équivalences).
Bye from Liège-BELGIUM.
cs_lucgod1 Messages postés 10 Date d'inscription dimanche 17 septembre 2006 Statut Membre Dernière intervention 24 janvier 2007
4 nov. 2006 à 18:03
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
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
3 nov. 2006 à 16:56
ABSOLUMENT AHURISSANT, SPLENDIDE !
C'est, je pense, exactement ce que je recherchais !!!
...
Rejoignez-nous