COPIER UNE IMAGE AVEC COULEUR DE TRANSPARENCE COMPATIBLE AVEC WINDOWS 95/98 CE Q
VeRs_iOn
Messages postés22Date d'inscriptionjeudi 11 mars 2004StatutMembreDernière intervention26 mars 2004
-
25 mars 2004 à 21:05
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013
-
28 mars 2004 à 20:50
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 28 mars 2004 à 20:50
ben à mon avis, c'est du au fait qu'à chaque appel de GetPixel, la fonction API doit d'abord récupèrer tout les bits de l'image puis renvoyer les bits correspondant au pixel voulu. Avec la méthode d'optimisation que je publierais d'ici peu, je fais de même, mais je garde en mémoire le tableau de bits correspondant à l'image, d'où un gain assez important lors de plusieurs appels de demande d'une couleur par rapport à un GetPixel classique !
DarK Sidious
VeRs_iOn
Messages postés22Date d'inscriptionjeudi 11 mars 2004StatutMembreDernière intervention26 mars 2004 28 mars 2004 à 20:38
c vrai ça, si qq1 sait pourquoi y'a une telle différence, ce serait bien qu'il nous instruise...
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 28 mars 2004 à 20:25
oui en effet, ca doit être possible de faire ca rapidement, à tester ! malheureusement, je n'ai pas le temps pour cà : je vous prépare une autre source concernant le graphisme pour accèlérer le traitement des pixels (c'est surprenant la différence de rapidité de GetDIBits par rapport àGetPixel : de l'ordre de 7x plus rapide !)
DarK Sidious
VeRs_iOn
Messages postés22Date d'inscriptionjeudi 11 mars 2004StatutMembreDernière intervention26 mars 2004 28 mars 2004 à 20:14
l'avantage est qu'une fois le masque fait, on peut le réutiliser autant de fois que voulu, rapidement, ce qui est souvent bienvenu, étant donné que ce genre de copie avec transparence est surtout utilisée pour les jeux...
quand à l'établissement du masque...peut-être serait-il possible de le faire facilement, dans le cas où la couleur transparente est le noir :
on crée un bitmap avec un bit par pixel, puis on blit l'image dessus...étant donné que bitblt effectue les conversions de couleur, il est possible que dans ce cas toutes les couleurs sauf le noir deviennent blanches...resterait alors à inverser le résultat avec un deuxième bitblt...à vérifier...
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 28 mars 2004 à 18:14
bidoch78 : la méthode proposée par le site marche bien, mais je lui trouve un inconvénient majeur : le fait de devoir passer par 2 images pour copier avec transparence : la première étant le sprite avec fond noir, la seconde avec le sprite en noir sur fond blanc : tu me dira que c'est possible à faire avec une seule image : le sprite avec un fond de n'importe quel couleur, puis de manipuler l'image pour obtenir les images qu'il faut, cependant, niveau rapidité pour la seconde solution, c'est vraiment pas top !
Par contre, si on applique la copie avec l'image de base sur fond noir, et l'image du masque, alors ca marche bien, et c'est plus rapide que ma méthode, mais c'est un peu plus fastidieux à mon goût !
DarK Sidious
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 28 mars 2004 à 15:31
Ah, merci bidoch78, je vais regarder cà tout de suite pour voir ce que ca donne niveau rapidité !
DarK Sidious
bidoch78
Messages postés67Date d'inscriptionmercredi 27 février 2002StatutMembreDernière intervention 2 décembre 2005 27 mars 2004 à 16:36
Il y a bien possibilité avec BitBlt de faire la meme chose, en passant par la création d'un mask etc...
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 26 mars 2004 à 13:47
J'utilise justement cette fonction dans cette source pour comparer la rapidité des deux méthodes !
DarK Sidious
cs_psycho
Messages postés232Date d'inscriptionsamedi 11 mai 2002StatutMembreDernière intervention27 octobre 2007 26 mars 2004 à 13:16
oki, en fait, faut que je me renseigne un peu sur cet api, parce que je ne parvient pas a la comprendre, et le peu d aide que j ai pu trouver ne m a pas aider(d ou ma fameuse dll en C lol).
Sinon, faut croire que ce sont efectivement les memes personnes qui commentent tes sources....
allez, continue comme ca!
@+
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 26 mars 2004 à 13:05
Salut psycho, décidément, il faut croire que c'est toujours les même qui ose commenter mes sources, lol ;-)
Cette méthode c'est pour garder la compatibilité avec Windows 95, 98 et NT4. Sinon, sous XP et Windows 2000, il est conseillé d'utilisé la fonction API TransparentBlt qui est un peu plus rapide (voir la capture)
En fait, comme je l'ai expliqué, j'utilisais TransparentBlt pour un programme qui n'était pas compatible avec Win95/98, et ce qui était très génant ! Grâce à cette méthode, je peux maintenant rendre mon prog compatible avec tout les Windows (ou presque)
DarK Sidious
cs_psycho
Messages postés232Date d'inscriptionsamedi 11 mai 2002StatutMembreDernière intervention27 octobre 2007 26 mars 2004 à 11:50
Salut!
cette méthode c juste pour faire marcher sous win98? Il existe pas d api permettant de faire ca tout seul sous winXP?
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 26 mars 2004 à 06:48
Oula, je vais tester cà, mais ca m'étonnerai tout de même que ce soit plus rapide : dans ma source, je ne fais que deux copie de l'image source et destination dans un tableau de bits, puis une copie d'un tableau de bit dans le DC de destination.
Avec ta méthode : copie de l'image source dans un tableau de bits, puis copie de ce tableau dans un autre DC, et enfin application d'une autre copie ! A mon avis, ce sont les copie les plus longues et non les traitements sur les pixels. Enfin bon, je teste cà dans l'après midi.
Merci pour cette méthode.
DarK Sidious
VeRs_iOn
Messages postés22Date d'inscriptionjeudi 11 mars 2004StatutMembreDernière intervention26 mars 2004 25 mars 2004 à 22:41
tiens, il m'est venu une idée sur le sujet, rien ne dit que ça fonctionne, mais ça vaut peut-être le coup d'essayer :
première étape
tu crées un masque noir et blanc de l'image : blanc quand l'image source est de couleur transparente, noir sinon, et en même temps tu définis à la couleur noire les pixels transparents de la source, avec les fonctions DIB
deuxième étape : tu colles ce masque sur la cible avec bitblt, en utilisant le rasterop vbsrcand (ça préserve les zones de la cible où la source est transparente, et elle devient noire ailleurs)
dernière étape : tu colles l'image originale avec bitblt et le rasterop vbsrcpaint (qui effecture un ou logique : on colle la source là ou la cible est devenue noire, et comme les zones transparentes de la source sont maintenant noires, elles ne modifient pas la cible)
je sais pas si j'ai été très clair, mais à mon avis ça peut marcher dans le principe, et ça pourrait être plus rapide...à tester
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013131 25 mars 2004 à 21:11
Merci VeRs_iOn pour tes conseils pour la récupèration des composantes de couleurs, cela est sûrement bien plus rapide que ma méthode !
Je ne pense pas que ce soit possible d'obtenir le même résultat en utilisant des combinaisons d'opcodes de bitblt, et obtenir la même rapidité, cependant, si toi, ou quelqu'un d'autres, trouve comment faire, je suis preneur !
C'est vrai que c'est assez compliqué de passer par des DIBits, mais ca permet d'avoir une bonne rapidité tout de même !
DarK Sidious
VeRs_iOn
Messages postés22Date d'inscriptionjeudi 11 mars 2004StatutMembreDernière intervention26 mars 2004 25 mars 2004 à 21:05
ouhlàlà ça me paraît très compliqué pour ce que ça fait !
à mon avis quelques combinaisons d'opcodes de bitblt suffisent, mais je suis pas sûr et ça fait longtyemps que g pas touché à ça
mais une chose est sûre, il y a vraiment plus simple pour tes fonctions getred, green, et blue
il suffit d'effectuer un AND : rouge = couleur and &hFF
vert = (couleur and clng(&hFF00))/256
bleu = (couleur and clng(&hFF0000))/(65536)
...tu masques simplement les bits qui ne t'intéressent pas
28 mars 2004 à 20:50
DarK Sidious
28 mars 2004 à 20:38
28 mars 2004 à 20:25
DarK Sidious
28 mars 2004 à 20:14
quand à l'établissement du masque...peut-être serait-il possible de le faire facilement, dans le cas où la couleur transparente est le noir :
on crée un bitmap avec un bit par pixel, puis on blit l'image dessus...étant donné que bitblt effectue les conversions de couleur, il est possible que dans ce cas toutes les couleurs sauf le noir deviennent blanches...resterait alors à inverser le résultat avec un deuxième bitblt...à vérifier...
28 mars 2004 à 18:14
Par contre, si on applique la copie avec l'image de base sur fond noir, et l'image du masque, alors ca marche bien, et c'est plus rapide que ma méthode, mais c'est un peu plus fastidieux à mon goût !
DarK Sidious
28 mars 2004 à 15:31
DarK Sidious
27 mars 2004 à 16:36
http://www.rookscape.com/vbgaming/GBeebe/bitblt.php
26 mars 2004 à 13:47
DarK Sidious
26 mars 2004 à 13:16
Sinon, faut croire que ce sont efectivement les memes personnes qui commentent tes sources....
allez, continue comme ca!
@+
26 mars 2004 à 13:05
Cette méthode c'est pour garder la compatibilité avec Windows 95, 98 et NT4. Sinon, sous XP et Windows 2000, il est conseillé d'utilisé la fonction API TransparentBlt qui est un peu plus rapide (voir la capture)
En fait, comme je l'ai expliqué, j'utilisais TransparentBlt pour un programme qui n'était pas compatible avec Win95/98, et ce qui était très génant ! Grâce à cette méthode, je peux maintenant rendre mon prog compatible avec tout les Windows (ou presque)
DarK Sidious
26 mars 2004 à 11:50
cette méthode c juste pour faire marcher sous win98? Il existe pas d api permettant de faire ca tout seul sous winXP?
26 mars 2004 à 06:48
Avec ta méthode : copie de l'image source dans un tableau de bits, puis copie de ce tableau dans un autre DC, et enfin application d'une autre copie ! A mon avis, ce sont les copie les plus longues et non les traitements sur les pixels. Enfin bon, je teste cà dans l'après midi.
Merci pour cette méthode.
DarK Sidious
25 mars 2004 à 22:41
première étape
tu crées un masque noir et blanc de l'image : blanc quand l'image source est de couleur transparente, noir sinon, et en même temps tu définis à la couleur noire les pixels transparents de la source, avec les fonctions DIB
deuxième étape : tu colles ce masque sur la cible avec bitblt, en utilisant le rasterop vbsrcand (ça préserve les zones de la cible où la source est transparente, et elle devient noire ailleurs)
dernière étape : tu colles l'image originale avec bitblt et le rasterop vbsrcpaint (qui effecture un ou logique : on colle la source là ou la cible est devenue noire, et comme les zones transparentes de la source sont maintenant noires, elles ne modifient pas la cible)
je sais pas si j'ai été très clair, mais à mon avis ça peut marcher dans le principe, et ça pourrait être plus rapide...à tester
25 mars 2004 à 21:11
Je ne pense pas que ce soit possible d'obtenir le même résultat en utilisant des combinaisons d'opcodes de bitblt, et obtenir la même rapidité, cependant, si toi, ou quelqu'un d'autres, trouve comment faire, je suis preneur !
C'est vrai que c'est assez compliqué de passer par des DIBits, mais ca permet d'avoir une bonne rapidité tout de même !
DarK Sidious
25 mars 2004 à 21:05
à mon avis quelques combinaisons d'opcodes de bitblt suffisent, mais je suis pas sûr et ça fait longtyemps que g pas touché à ça
mais une chose est sûre, il y a vraiment plus simple pour tes fonctions getred, green, et blue
il suffit d'effectuer un AND : rouge = couleur and &hFF
vert = (couleur and clng(&hFF00))/256
bleu = (couleur and clng(&hFF0000))/(65536)
...tu masques simplement les bits qui ne t'intéressent pas