COPIER UNE IMAGE AVEC COULEUR DE TRANSPARENCE COMPATIBLE AVEC WINDOWS 95/98 CE Q

VeRs_iOn Messages postés 22 Date d'inscription jeudi 11 mars 2004 Statut Membre Dernière intervention 26 mars 2004 - 25 mars 2004 à 21:05
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Derniè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.

https://codes-sources.commentcamarche.net/source/21482-copier-une-image-avec-couleur-de-transparence-compatible-avec-windows-95-98-ce-qui-n-est-pas-le-cas-avec-transparentblt

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
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és 22 Date d'inscription jeudi 11 mars 2004 Statut Membre Dernière intervention 26 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és 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
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és 22 Date d'inscription jeudi 11 mars 2004 Statut Membre Dernière intervention 26 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és 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
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és 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
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és 67 Date d'inscription mercredi 27 février 2002 Statut Membre Derniè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...

http://www.rookscape.com/vbgaming/GBeebe/bitblt.php
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
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és 232 Date d'inscription samedi 11 mai 2002 Statut Membre Dernière intervention 27 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és 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
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és 232 Date d'inscription samedi 11 mai 2002 Statut Membre Dernière intervention 27 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és 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
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és 22 Date d'inscription jeudi 11 mars 2004 Statut Membre Dernière intervention 26 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és 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
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és 22 Date d'inscription jeudi 11 mars 2004 Statut Membre Dernière intervention 26 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
Rejoignez-nous