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

MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 - 22 oct. 2006 à 15:15
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 2 déc. 2006 à 18:59
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/40020-de-rgb-a-r-g-et-b-la-meilleur-technique-en-vb

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
2 déc. 2006 à 18:59
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 ?
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
2 déc. 2006 à 18:41
Comprends-tu au moins le but du problème ?
fierobe Messages postés 14 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 3 août 2010
1 déc. 2006 à 22:14
Je comprends rien ...
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
4 nov. 2006 à 01:27
Arf, aussi facile à dire qu'a faire !!! Grrr ce qu'il peut m'énerver ce EB avec tout c'qu'il sait ;-)
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
3 nov. 2006 à 23:30
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.

@+
GeneticW Messages postés 34 Date d'inscription samedi 3 juin 2006 Statut Membre Dernière intervention 23 avril 2011
3 nov. 2006 à 22:58
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.
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 à 22:46
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 !
GeneticW Messages postés 34 Date d'inscription samedi 3 juin 2006 Statut Membre Dernière intervention 23 avril 2011
3 nov. 2006 à 17:53
<<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.
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:44
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 ;]
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 nov. 2006 à 06:33
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)"
GeneticW Messages postés 34 Date d'inscription samedi 3 juin 2006 Statut Membre Dernière intervention 23 avril 2011
2 nov. 2006 à 23:09
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.
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
2 nov. 2006 à 23:08
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 )

@+
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
2 nov. 2006 à 23:07
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.

@+
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
2 nov. 2006 à 22:30
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 !)
GeneticW Messages postés 34 Date d'inscription samedi 3 juin 2006 Statut Membre Dernière intervention 23 avril 2011
31 oct. 2006 à 13:30
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.
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
24 oct. 2006 à 08:21
Oulalal Warning a utilisé une API !! Tu sorts !

lol ;)

@+
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 2
24 oct. 2006 à 01:14
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
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
22 oct. 2006 à 19:14
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..."]).
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 oct. 2006 à 18:45
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)
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
22 oct. 2006 à 17:23
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)

@+
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
22 oct. 2006 à 15:15
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 ;)
Rejoignez-nous