Page 2 sur 2
Publié : ven. 18/juil./2008 11:20
par Thyphoon
tu devrais poster sur le forum anglais ton code avec 2-3 explications...L'avantage du forum anglais c'est qu'il y a plus de monde qu'ici et que Fred passe par là (contrairement a ici

)
histoire de faire avancé le problème ..car il y a quand même quelques choses de currieux...
Dans tout les cas ...ça ne m'aide pas pour mon code

Publié : ven. 18/juil./2008 16:52
par Gillou
J'ai pondu ça à l'arrache (donc le code n'est pas très propre, mais l'idée est là)
Donc code utilisant la lib gdi+ pour recup l'alpha
http://lggillou.free.fr/uploads/get_alpha.zip
Publié : ven. 18/juil./2008 17:03
par SPH
Erreur dans ton gdiplus_GUID.pbi
Publié : ven. 18/juil./2008 18:48
par Gillou
C'est quoi ton message d'erreur? ;(
Publié : ven. 18/juil./2008 19:23
par case
SPH a écrit :
je vais parler pour mon compte : c'est dut a de l'illogique qui veux que la largeur de la memoire de la carte graphique ne prend pas la meme largeur que le screen open... Alors, il faut bizzarement jongler avec l'inconnu...
ce n'est pas inconnu puisque pure basic te renseigne la dessus grace a
DrawingBufferPitch() pour connaitre la taille en octet d'une ligne du buffer utilisé par la carte graphique
DrawingBufferPixelFormat() pour connaitre le type de pixel utilises a savoir rrggbb ou bbggrr ou aabbggrr etc... 16 bits 8 bits ...
et ce n'est pas illogique c'est juste en raison de la rapidité de traitement pour la carte graphique.
lorsque tu utilise des nombres entiers on utilise un LONG (4 octet) et ce meme pour stocker le chiffre 1 qui ne prend qu'un seul bit en memoire.
ta carte graphique fonctionne sur le même principe elle utilise un buffer de x octets même si tu en utilise moins pour ton affichage.
Publié : ven. 18/juil./2008 19:31
par Anonyme2
Vite fait sur la couche alpha, moi j'utilise ce code qui va bien car il me semble que l'API SetDIBits n'accepte que le format RGB (donc pas d'alpha)
Code : Tout sélectionner
*pixels\l = GetAlphaBlendedColor(*pixels\l, Couleur_Fond, Niveau_Transparence_Image)
*pixels + 4
Next a
SetDIBits_(hDC, hBmp1, 0, ImageWidth, mem, bmi, #DIB_RGB_COLORS)
avec la procedure
Code : Tout sélectionner
Procedure.l GetAlphaBlendedColor(CouleurSource.l, CouleurFond.l, Alpha.l)
ProcedureReturn RGB((((Red(CouleurSource) * Alpha / 255) + ((Red(CouleurFond) * (255 - Alpha))) / 255)), (((Green(CouleurSource) * Alpha / 255) + ((Green(CouleurFond) * (255 - Alpha))) / 255)), (((Blue(CouleurSource) * Alpha / 255) + ((Blue(CouleurFond) * (255 - Alpha))) / 255)))
EndProcedure
A+
Denis
Publié : dim. 20/juil./2008 7:36
par Thyphoon
Merci beaucoup !!

Publié : dim. 20/juil./2008 9:14
par Backup
case a écrit :
ce n'est pas inconnu puisque pure basic te renseigne la dessus grace a
DrawingBufferPitch() pour connaitre la taille en octet d'une ligne du buffer utilisé par la carte graphique
DrawingBufferPixelFormat() pour connaitre le type de pixel utilises a savoir rrggbb ou bbggrr ou aabbggrr etc... 16 bits 8 bits ...
et ce n'est pas illogique c'est juste en raison de la rapidité de traitement pour la carte graphique.
lorsque tu utilise des nombres entiers on utilise un LONG (4 octet) et ce meme pour stocker le chiffre 1 qui ne prend qu'un seul bit en memoire.
ta carte graphique fonctionne sur le même principe elle utilise un buffer de x octets même si tu en utilise moins pour ton affichage.
donc ça c'est bon
Code : Tout sélectionner
Procedure rapide_Point(x,Y)
Select DrawingBufferPixelFormat()
Case #PB_PixelFormat_32Bits_RGB : PF=4:t=0
Case #PB_PixelFormat_32Bits_BGR : PF=4:t=1
Case #PB_PixelFormat_24Bits_RGB : PF=3:t=0
Case #PB_PixelFormat_24Bits_BGR : PF=3:t=1
Case #PB_PixelFormat_15Bits : PF=2:t=0 ; 2 octets par pixel
Case #PB_PixelFormat_16Bits : PF=2:t=0
Case #PB_PixelFormat_8Bits: PF=1
EndSelect
color= PeekL(DrawingBuffer() + (x * PF) +DrawingBufferPitch()* ( Y ) )
If t=1
Rouge=Red(color)
Vert=Green(color)
Bleu=Blue(color)
color=RGB(Bleu,Vert,Rouge)
EndIf
ProcedureReturn color
EndProcedure
Publié : dim. 20/juil./2008 10:40
par Anonyme2
J'ai oublié de préciser qu'il faut inverser les composantes rouge et bleue avant de créer la couleur finale ou l'on applique la transparence donc juste après l'API GetDIBits_().
C'est comme ça dans mon code qui remonte à 3 ans.
Il ya une API pour la transparence, AlphaBlend
voir ici
http://www.purebasic.fr/french/viewtopic.php?t=5512
A+
Denis