Comment Prendre la valeur de l'Alpha sur une Image 32 Bit

Programmation d'applications complexes
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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 :roll:
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message 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
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Erreur dans ton gdiplus_GUID.pbi
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message par Gillou »

C'est quoi ton message d'erreur? ;(
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message 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.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Merci beaucoup !! :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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

Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Répondre