(Résolu) Fonction Point(x,y) et Alpha

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

(Résolu) Fonction Point(x,y) et Alpha

Message par kernadec »

bsr à tous
voilà, j'ai écris un ptit bout de code pour tester Point(x, y) avec l'Alpha,
après un click Gauche dans la fenêtre les couleurs sont bien identiques,
quand on demande à point(x, y) la valeur des couleurs de la Box supérieure
pour mettre la couleur obtenue dans la box d'en bas, c'est ok..

maintenant je n'ai pas trouvé le calcul pour obtenir des valeurs RGBA
identique à la couleur d'origine depuis Point(x,Y)
si quelqu'un connait l'astuce... 8O merci

Cordialement
ps: Pour obtenir une couleurs = avec 32 bits (256*256*256*256)-1 hex = $FFFFFFFF, dec = 4294967295
je pense qu' il manque à la valeur négative points() 16bits en hex = $0000FFFF, dec = 65535
c'est probablement pour cela que cette valeur est négative :!:

Code : Tout sélectionner

Procedure Affiche_image(x, y,Rouge$, Vert$, Bleu$, Lux$ )
  Protected *couleur
  If StartDrawing(ImageOutput(0))
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    ; Affiche box d'en haut de la fenetre avec Alpha
    Box(0, 0, 400, 150, RGBA(Val(Rouge$), Val(Vert$), Val(Bleu$), Val(Lux$)))    ; Box supérieure couleur aléatoire
                                                                                 ;affiche box d'en bas de la fenetre avec Alpha à 255
    Box(0, 340, 400, 150, RGBA(Val(Rouge$), Val(Vert$), Val(Bleu$), 255))        ; Box supérieure couleur aléatoire
                                                                                 ; Affiche dans debug la valeur globale de la couleur
    Debug "Point() : " + Point(50, 50) 
    ; Remarque importante la valeur retour de Point() est toujours négative 
    couleur.l = Point(50, 50)                                                   ; Récupère la couleur supérieure
                                                                                ; Affiche box du milieu de la fenetre avec Alpha depuis la valeur capturée par point()
    Box(0, 170, 400, 150, couleur)                                              ;Affiche la Box du mileu avec la couleur de la box d'en haut
    Debug "ARGB : $" + RSet(Right(Hex(@couleur), SizeOf(integer)*2), 8, "0")
    StopDrawing()
    ImageGadget(0, 0, 0, 400, 490, ImageID(0))
    SetGadgetState(0, ImageID(0))
  EndIf
  
  ; Couleurs de retour avec la valeur de Point(x, y) avec les fonctions couleurs red() Green() Blue() Alpha()
  Red$   = Right("00" + Str(Red(Couleur)),3)
  Green$ = Right("00" + Str(Green(Couleur)),3)
  Blue$  = Right("00" + Str(Blue(Couleur)),3)
  Alpha$ = Right("00" + Str(Alpha(couleur)),3)
  ; Semble pas être la bonne formule pour car on récupère pas les couleurs RGBA envoyée au départ
  Debug "----------------------------------------"
  Debug "Origine RGBA : ( " + Rouge$ + ", " + Vert$ + ", " + Bleu$ + ", " + Lux$ +" )"
  capture$ = "Retour Point() : ( " + Red$ + ", " + Green$ + ", " + Blue$ + ", " + Alpha$ +" )"
  Debug capture$
  Debug "========================="
  SetWindowTitle(0, "Points click Fenêtre Couieur " + "( " + Red$ + ", " + Green$ + ", " + Blue$ + ", " + Alpha$ +" )")
  
EndProcedure

If OpenWindow(0, 0, 0, 400, 490, "Points click Fenêtre", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CreateImage(0, 400, 490,32,#White)
  ImageGadget(0, 0, 0, 400, 490, ImageID(0))
  Repeat
    event = WaitWindowEvent()
    x = WindowMouseX(0)
    y = WindowMouseY(0)
    Select Event
      Case #PB_Event_Gadget
        Select EventType()
          Case #PB_EventType_LeftClick
            Rouge$ = Right("00" + Str(Random(255)), 3)
            Vert$  = Right("00" + Str(Random(255)), 3)
            Bleu$  = Right("00" + Str(Random(255)), 3)
            Lux$   = Right("00" + Str(Random(255)), 3)
            ;Affiche_image(x, y, "001", "001", "001", "255") ; Point() affichera une valeur noire négative de -16711423
            Affiche_image(x, y, Rouge$, Vert$, Bleu$, Lux$)
        EndSelect
    EndSelect 
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf
Dernière modification par kernadec le jeu. 08/avr./2021 10:47, modifié 4 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Fonction Point(x,y) et Alpha

Message par Ar-S »

Salut Kernadec.
Je ne crois pas qu'un imagegadget gère la transparence. Du coup lorsque tu dessines ta couleur transparente, cela peint une image, mais celle ci devient opaque. Le "point()" ne pourra te renvoyer que 255.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Fonction Point(x,y) et Alpha

Message par kernadec »

bsr Ar-S
merci, mais comme tu vois dans mon exemple la fonction point() récupére
physiquement la transparence puisque cette valeur permet de colorier
la box du mileu la preuve est faite que la valeur alpha est bonne avec point().

la transparente à bien été transmise à la box du mileu puisque les deux box
sont identique en couleur, et comme la première à un taux de transparence
qui change a chaque click on peut vérifié que le message Alpha passe..

Le problème est que je n'arrive pas a trouvé la conversion mathématique des
couleurs en RGBA depuis la valeur retour. puisque la box inférieure l'utilise, c'est
simplement la formule du retour à la case couleur de départ RGBA que j'aimerais connaitre

Cordialement

ps:
j'ai ajouter une troisième box à mon code pour montrer la couleur de la box supérieure
avec l' alpha qui change et celle d'en bas les mème valeurs RGB avec un alpha fixé à 255
comme cela on peut voir que la box du milieu récupère bien l'alpha de la première box.
Dernière modification par kernadec le mar. 06/avr./2021 9:24, modifié 1 fois.
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Fonction Point(x,y) et Alpha

Message par kernadec »

Code précédent à été mis à jours
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Fonction Point(x,y) et Alpha

Message par Ar-S »

Regarde ce que je veux dire.
Dans le débug tu vois NewCol qui est la couleur de la boite bas. Le resultat est visuellement identique à celle du haut mais la palette s'est adapté à un alpha 255 alors qu'à chaque clic il se met en random

En gros dis toi qu'un Point() de RGBA : ( 255, 0, 0, 150) retournera un RGBA (255, 105, 105, 255)
Visuellement c'est pareil.
J'ai eu ce soucis dans mon ascii 2 pixel qui marchait en RGB. J'ai voulu l'adapter pour le RGBA, j'ai eu ce même soucis.

Code : Tout sélectionner

Global R,G,B,A
R = 200
G = 100
B = 50
A = Random(200)

Procedure DrawBox()
    
    
    If StartDrawing(ImageOutput(0))
        DrawingMode(#PB_2DDrawing_AlphaBlend )
        
        Box(0,0,400,145,$0)
        
        Box(0, 0, 400, 145, RGBA(R,G,B,A) )   ; Box supérieure couleur aléatoire
        
        Debug "Point() : " + Point(50, 50)
        couleur.l = Point(50, 50)                           ; Récupère la couleur supérieure
        Box(0, 150, 400, 150, couleur)                      ;Affiche la Box Inférieure avec la couleur supérieure
        StopDrawing()
        ;         ImageGadget(0, 0, 0, 300, 300, ImageID(0))
        SetGadgetState(0, ImageID(0))
    EndIf    
    
    
    
    ; ---- couleurs de retour ----
    If StartDrawing(ImageOutput(0))
        DrawingMode(#PB_2DDrawing_AlphaBlend)
        
        NewCol = Point(50,200) ; pointe un pixel de la box bas
        StopDrawing()
    EndIf
    NewR   = Red(NewCol)
    NewG   = Green(NewCol)
    NewB   = Blue(NewCol)
    NewA   = Alpha(NewCol)
    
    Debug "----------------------------------------"
    Debug "Origine RGBA : ( " + Str(R) + ", " + Str(G) + ", " + Str(B) + ", " + Str(A) +") "
    Debug "capture$ :    ( " + Str(newR) + ", " + Str(newG) + ", " + Str(newB) + ", " + Str(newA) +" )"
    Debug "========================="
    
    
    
EndProcedure


If OpenWindow(0, 0, 0, 400, 300, "Points click Fenêtre", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CreateImage(0, 400, 300,32,#White)
    ImageGadget(0, 0, 0, 300, 300, ImageID(0))
    
    DrawBox()
    
    
    Repeat
        event = WaitWindowEvent()
        x = WindowMouseX(0)
        y = WindowMouseY(0)
        Select Event
            Case #PB_Event_Gadget
                Select EventType()
                    Case #PB_EventType_LeftClick
                        
                        DrawBox()
                        
                        
                        
                EndSelect
        EndSelect 
        Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
EndIf
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Fonction Point(x,y) et Alpha

Message par kernadec »

bjr Ar-s
Désolé pas pu répondre avant, j'ai eu une panne de réseau :?
Merci de ton aide, mais j'arrive pas à comprendre ce mystère à 32bits :mrgreen:

Tu m'as fait remarquer que je devrais utiliser un CanvasGadget
pous l'Alpha, donc voici un code Canvas comme le premier code
avec ImageGadget j'obtient le même fonctionnement :wink:

infos sur les codes:
1) La box du haut est colorée avec une couleur aléatoire RGBA

2) La box du milieu récupère la valeur de la couleur fonction PureBasic Pointx,y)
comme on peut le voir dans les deux box leurs couleur sont identique, donc Point()
retourne bien l'Alpha car la fonction Box(x, y ,xx ,yy, Point()) à rendu la couleur de l'Alpha

3) La box du bas est la mème couleur RGB que la Box d'en haut sauf
que l'Alpha est mis à 255 pour comparer

maintenant le problème est le suivant comment la valeur Alpha de Point() est
transmise à la box du milieu avec une valeur qui ne peut être lue par les fonctions
Red() Green() Blue() Alpha() .... puisque en retour Alpha() est mis a zéro.. mystère?

Alors que ce code simple le fait:

Code : Tout sélectionner

Couleur = RGBA(128,128,128,128)
Debug "Test retour de cette couleur = RGBA(128,255,128,128)" 
Debug "Valeur int de la couleur" + couleur
Debug "retour RGBA : ( " + Str(Red(Couleur)) + ", " + Str(Green(Couleur)) + ", " + Str(Blue(Couleur)) + ", " + Str(Alpha(couleur)) + " )"
voici un site pour vérifié la couleur aléatoire et son Alpha
https://web-color.aliasdmc.fr/convertis ... c-resultat
je précise que pour ce site il faut diviser la couleur alpha pour en obtenir un pourcentage
100 / 255 * Alpha = valeur%

ps: autre remarque
La valeur de couleur Point() depuis un ImageGadget est négative et positive avec CanvasGadget.

Cordialement

Code : Tout sélectionner

Procedure Affiche_image(x, y,Rouge$, Vert$, Bleu$, Lux$ )
  Protected couleur, C_aleatoire$, C_Point$
  If StartDrawing(CanvasOutput(1))
    DrawingMode(#PB_2DDrawing_AlphaClip)
    Box(0, 0, 400, 150, RGBA(Val(Rouge$), Val(Vert$), Val(Bleu$), Val(Lux$)))    ; Box supérieure couleur aléatoire
    couleur = Point(50, 50)
    
    Debug "Point() : " + couleur
    
    DrawingMode(#PB_2DDrawing_Default )
    C_aleatoire$ = " Origine RGBA : ( " + Rouge$ + ", " + Vert$ + ", " + Bleu$ + ", " + Lux$ + " )"
    DrawText(1, 20," RGBA aléatoire " +  C_aleatoire$, #Black, couleur)
    StopDrawing() 
    
    ; Restaure Couleurs RGBA
    ; Couleurs de retour avec la valeur de Point(x, y) avec les fonctions couleurs red() Green() Blue() Alpha() 
    Red$   = Right("00" + Str(Red(Couleur)),3)
    Green$ = Right("00" + Str(Green(Couleur)),3)
    Blue$  = Right("00" + Str(Blue(Couleur)),3)
    Alpha$ = Right("00" + Str(Alpha(couleur)),3)
    Debug "Alpha" + Alpha(couleur)
    ; Semble pas être la bonne formule pour car on récupère pas les couleur RGBA envoyée au départ
    C_Point$ = "Point()  RGBA : ( " + Red$ + ", " + Green$ + ", " + Blue$ + ", " + Alpha$ + " )"
  EndIf 
  
  If StartDrawing(CanvasOutput(3))                          ; Box du bas couleur box du haut avec transparence fixe = 255
    DrawingMode(#PB_2DDrawing_Transparent)
    Box(0, 0, 400, 150, RGBA(Val(Rouge$), Val(Vert$), Val(Bleu$), 255))        
    DrawingMode(#PB_2DDrawing_Default )
    C_aleatoire$ = "Origine RGBA : ( " + Rouge$ + ", " + Vert$ + ", " + Bleu$ + ", " + 255 + " )"
    DrawText(1, 20, "Origine RGB ( " + Rouge$ + ", " + Vert$ + ", " + Bleu$ + ", " + "Alpha = 255" , #Black, RGBA(Val(Rouge$), Val(Vert$), Val(Bleu$), 255))
    StopDrawing() 
  EndIf                                                                           
  
  ; resultat box du milieu la couleur alpha est la identique mais pas les en valeurs 
  If StartDrawing(CanvasOutput(2))
    DrawingMode(#PB_2DDrawing_Transparent)
    Box(0, 0, 400, 150, Couleur)                     ;Affiche la Box du mileu avec la couleur de la box d'en haut
    DrawingMode(#PB_2DDrawing_Default )
    DrawText(1, 20, " Couleur identique à la box 1 depuis point() avec alpha bon", #Black, Couleur)
    DrawText(1, 40, " La fonction Box(x,y,xx,yy, point()) a recu l'Alpha comment ?", #Black, Couleur)
    DrawText(1, 60, " Pas compris la formule de retour des valeurs depuis Point()", #Black, Couleur)
    DrawText(1, 80, " La conversion des valeurs Point() en RGBA donne", #Black, Couleur)
    DrawText(1, 100, " ces valeurs de Couleurs de Point() ( " + Red$ + ", " + Green$ + ", " + Blue$ + ", " + Alpha$ +" )" , #Black, Couleur)
    DrawText(1, 120, " Red() Green() Blue() Alpha(), ne fonctionne pas ??", #Black, Couleur)
    StopDrawing() 
  EndIf
  
  Debug "----------------------------------------"
  Debug "Origine RGBA : ( " + Rouge$ + ", " + Vert$ + ", " + Bleu$ + ", " + Lux$ +" )"
  Debug C_Point$
  Debug "========================="
  SetWindowTitle(0, "click Points Box 1 Couieur  " + "( " + Red$ + ", " + Green$ + ", " + Blue$ + ", " + Alpha$ +" )??")
  
EndProcedure



If OpenWindow(0, 0, 0, 400, 490, "Points click Fenêtre", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(1, 0, 0, 400, 150 , #PB_Canvas_ClipMouse)
  CanvasGadget(2, 0, 170, 400, 150 , #PB_Canvas_ClipMouse)
  CanvasGadget(3, 0, 340, 400, 150 , #PB_Canvas_ClipMouse)
  Repeat
    event = WaitWindowEvent()
    x = WindowMouseX(0)
    y = WindowMouseY(0)
    Select Event  
      Case #PB_Event_CloseWindow
        End     
      Case #PB_Event_Gadget    
        Select EventType() 
          Case #PB_EventType_LeftClick 
            Rouge$ = Right("00" + Str(Random(255)), 3)
            Vert$  = Right("00" + Str(Random(255)), 3)
            Bleu$  = Right("00" + Str(Random(255)), 3)
            Lux$   = Right("00" + Str(Random(255)), 3)
            ; Affiche_image(x, y, "001", "001", "001", "255") ; Point() affichera une valeur noire négative de -16711423
            Affiche_image(x, y, Rouge$, Vert$, Bleu$, Lux$)  
        EndSelect
    EndSelect  
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Fonction Point(x,y) et Alpha

Message par blendman »

Salut

Concernant l'alpha, il est précisé que la fonction point() et alpha() ne fonctionne que sur des surfaces 32 bits qui gèrent la transparence.

SI j'ai bien compris, les imagegadget() et canvasgadget() ne gèrent pas l'alpha (c'est d'ailleurs noté dans la doc : "Ce gadget (canvas) offre une surface de dessin sans canal alpha").
On peut afficher des images avec alpha dessus, mais la surface en elle-même ne gère pas la transparence.

Pour récupérer l'alpha d'une couleur avec point() et alpha(), il faut utiliser en output une surface qui gère le canal alpha, comme une image, ou un sprite.

Personnellement, je fais comme ça (code de la doc "point()", modifié) :

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 200, 200, "Connaître l'alpha", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateImage(0, 200, 200, 32, #PB_Image_Transparent) 
    
    If StartDrawing(ImageOutput(0))
      DrawingMode(#PB_2DDrawing_AllChannels)
      Box(0, 0, 200, 200, RGBA(255, 0, 0, 122))
      color = Point(100, 100)
      Debug Alpha(color)
      StopDrawing() 
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf
Je pense que sur un canvas ou une imagegadget, on ne peut pas avoir la valeur alpha() de la couleur, car ça ne gère pas la transparence ;).
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Fonction Point(x,y) et Alpha

Message par kernadec »

bsr Blendman
ok CanvasGadget n'as pas de canal alpha :mrgreen: pas grave
alors voila un code avec pour chaque Canvas un DrawAlphaImage() sur lequel les box sont posées
comme tu peut le remarquer point() renvoie, je ne sais comment l'Alpha pour la box du milieu
mais renvoie des valeurs inutilisables pour les fonctions retour de couleurs telle que Red() etc...
en tout cas la couleur de la box n°1 est reproduite dans la box n°2
peut être est ce une adresse mémoire lisible par un PeekW()
ce qui serait bien c'est de trouver comment un fonction dessin comme Box retrouve
la valeur de l'Alpha avec point()... Mystère et boules de gommes :mrgreen:

Cordialement

ps: j'ajoute que ce code fonctionne comme le précédent malgré que Canvas n"a pas de
canal alpha encore un mystère

voici le code modifier avec des images 32bits

Code : Tout sélectionner

Procedure Affiche_image(x, y,Rouge$, Vert$, Bleu$, Lux$ )
  Protected couleur, C_aleatoire$, C_Point$
  If StartDrawing(CanvasOutput(1))
    DrawAlphaImage(ImageID(1), 0, 0)                                                  ; Image 32bit
    DrawingMode(#PB_2DDrawing_AlphaClip)
    Box(0, 0, 400, 150, RGBA(Val(Rouge$), Val(Vert$), Val(Bleu$), Val(Lux$)))    ; Box supérieure couleur aléatoire
    couleur = Point(50, 50)
    
    Debug "Point() : " + couleur
    
    DrawingMode(#PB_2DDrawing_Default )
    C_aleatoire$ = " Origine RGBA : ( " + Rouge$ + ", " + Vert$ + ", " + Bleu$ + ", " + Lux$ + " )"
    DrawText(1, 20," RGBA aléatoire " +  C_aleatoire$, #Black, couleur)
    StopDrawing()
    
    ; Restaure Couleurs RGBA
    ; Couleurs de retour avec la valeur de Point(x, y) avec les fonctions couleurs red() Green() Blue() Alpha()
    Red$   = Right("00" + Str(Red(Couleur)),3)
    Green$ = Right("00" + Str(Green(Couleur)),3)
    Blue$  = Right("00" + Str(Blue(Couleur)),3)
    Alpha$ = Right("00" + Str(Alpha(couleur)),3)
    Debug "Alpha" + Alpha(couleur)
    ; Semble pas être la bonne formule pour car on récupère pas les couleur RGBA envoyée au départ
    C_Point$ = "Point()  RGBA : ( " + Red$ + ", " + Green$ + ", " + Blue$ + ", " + Alpha$ + " )"
  EndIf
  
  If StartDrawing(CanvasOutput(3))                          ; Box du bas couleur box du haut avec transparence fixe = 255
    DrawAlphaImage(ImageID(3), 0, 0)                        ; Image 32bit
    DrawingMode(#PB_2DDrawing_Transparent)
    Box(0, 0, 400, 150, RGBA(Val(Rouge$), Val(Vert$), Val(Bleu$), 255))       
    DrawingMode(#PB_2DDrawing_Default )
    C_aleatoire$ = "Origine RGBA : ( " + Rouge$ + ", " + Vert$ + ", " + Bleu$ + ", " + 255 + " )"
    DrawText(1, 20, "Origine RGB ( " + Rouge$ + ", " + Vert$ + ", " + Bleu$ + ", " + "Alpha = 255" , #Black, RGBA(Val(Rouge$), Val(Vert$), Val(Bleu$), 255))
    StopDrawing()
  EndIf                                                                           
  
  
  ; resultat box du milieu la couleur alpha est la identique mais pas les en valeurs
  If StartDrawing(CanvasOutput(2))
    DrawAlphaImage(ImageID(2), 0, 0)                                                  ; Image 32bit
    DrawingMode(#PB_2DDrawing_Transparent)
    Box(0, 0, 400, 150, Couleur)                     ;Affiche la Box du mileu avec la couleur de la box d'en haut
    DrawingMode(#PB_2DDrawing_Default )
    DrawText(1, 20, " Couleur identique à la box 1 depuis point() avec alpha bon", #Black, Couleur)
    DrawText(1, 40, " La fonction Box(x,y,xx,yy, point()) a recu l'Alpha comment ?", #Black, Couleur)
    DrawText(1, 60, " Pas compris la formule de retour des valeurs depuis Point()", #Black, Couleur)
    DrawText(1, 80, " La conversion des valeurs Point() en RGBA donne", #Black, Couleur)
    DrawText(1, 100, " ces valeurs de Couleurs de Point() ( " + Red$ + ", " + Green$ + ", " + Blue$ + ", " + Alpha$ +" )" , #Black, Couleur)
    DrawText(1, 120, " Red() Green() Blue() Alpha(), ne fonctionne pas ??", #Black, Couleur)
    StopDrawing()
  EndIf
  
  Debug "----------------------------------------"
  Debug "Origine RGBA : ( " + Rouge$ + ", " + Vert$ + ", " + Bleu$ + ", " + Lux$ +" )"
  Debug C_Point$
  Debug "========================="
  SetWindowTitle(0, "click Points Box 1 Couieur  " + "( " + Red$ + ", " + Green$ + ", " + Blue$ + ", " + Alpha$ +" )??")
  
EndProcedure



If OpenWindow(0, 0, 0, 400, 490, "Points click Fenêtre", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(1, 0, 0, 400, 150 , #PB_Canvas_ClipMouse)
  CanvasGadget(2, 0, 170, 400, 150 , #PB_Canvas_ClipMouse)
  CanvasGadget(3, 0, 340, 400, 150 , #PB_Canvas_ClipMouse)
  
  CreateImage(1, 400, 150,32,#White)
  CreateImage(2, 400, 150,32,#White)
  CreateImage(3, 400, 150,32,#White)
  Repeat
    event = WaitWindowEvent()
    x = WindowMouseX(0)
    y = WindowMouseY(0)
    Select Event 
      Case #PB_Event_CloseWindow
        End     
      Case #PB_Event_Gadget   
        Select EventType()
          Case #PB_EventType_LeftClick
            Rouge$ = Right("00" + Str(Random(255)), 3)
            Vert$  = Right("00" + Str(Random(255)), 3)
            Bleu$  = Right("00" + Str(Random(255)), 3)
            Lux$   = Right("00" + Str(Random(255)), 3)
            ; Affiche_image(x, y, "001", "001", "001", "255") ; Point() affichera une valeur noire négative de -16711423
            Affiche_image(x, y, Rouge$, Vert$, Bleu$, Lux$) 
        EndSelect
    EndSelect 
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Fonction Point(x,y) et Alpha

Message par blendman »

Coucou Kernadec

Dans ton code, tu utilises point() sur un canvasoutput(), ça ne peut pas fonctionner correctement (d'après la doc), puisque tu dois faire un point() sur un imageoutput() ou un spriteoutput() ;). Je crois, d'après le doc, que Point() ne fonctionne pas correctement pour l'alpha avec canvasoutput().

Je ne comprends pas trop ce que tu souhaites obtenir, mais voici une tentative de correction (je ne sais pas si c'est ce que tu veux) :

Code : Tout sélectionner

Procedure Affiche_image(x, y,Rouge$, Vert$, Bleu$, Lux$ )
  
  Protected couleur, C_aleatoire$, C_Point$
  
  ; d'abord on va créer li'amge qu'on va afficher ensuite sur le canvas)
  ; c'est sur cette image qu'on va faire le point() et non sur le canvas car il n'a pas d'alpha.
  tempimg = CreateImage(#PB_Any, GadgetWidth(1), GadgetHeight(1), 32, #PB_Image_Transparent)
  
  
  If StartDrawing(ImageOutput(tempimg))
    DrawingMode(#PB_2DDrawing_AllChannels ) 
    DrawAlphaImage(ImageID(1), 0, 0)                                                  ; Image 32bit
    DrawingMode(#PB_2DDrawing_AlphaClip)
    Box(0, 0, 400, 150, RGBA(Val(Rouge$), Val(Vert$), Val(Bleu$), Val(Lux$)))    ; Box supérieure couleur aléatoire
    couleur = Point(50, 50)
   
    Debug "Point() : " + couleur
   
    DrawingMode(#PB_2DDrawing_Default )
    C_aleatoire$ = " Origine RGBA : ( " + Rouge$ + ", " + Vert$ + ", " + Bleu$ + ", " + Lux$ + " )"
    DrawText(1, 20," RGBA aléatoire " +  C_aleatoire$, #Black, couleur)
   
   
    ; Restaure Couleurs RGBA
    ; Couleurs de retour avec la valeur de Point(x, y) avec les fonctions couleurs red() Green() Blue() Alpha()
    Red$   = Right("00" + Str(Red(Couleur)),3)
    Green$ = Right("00" + Str(Green(Couleur)),3)
    Blue$  = Right("00" + Str(Blue(Couleur)),3)
    Alpha$ = Right("00" + Str(Alpha(couleur)),3)
    Debug "Alpha" + Alpha(couleur)
    ; Semble pas être la bonne formule pour car on récupère pas les couleur RGBA envoyée au départ
    C_Point$ = "Point()  RGBA : ( " + Red$ + ", " + Green$ + ", " + Blue$ + ", " + Alpha$ + " )"
    StopDrawing()
  EndIf
  
  
  If StartDrawing(CanvasOutput(1))
    DrawingMode(#PB_2DDrawing_AllChannels )
    DrawAlphaImage(ImageID(tempimg), 0, 0)    
    StopDrawing()
  EndIf
  
  FreeImage(tempimg)
  
  If StartDrawing(CanvasOutput(3))                          ; Box du bas couleur box du haut avec transparence fixe = 255
    DrawAlphaImage(ImageID(3), 0, 0)                        ; Image 32bit
    DrawingMode(#PB_2DDrawing_Transparent)
    Box(0, 0, 400, 150, RGBA(Val(Rouge$), Val(Vert$), Val(Bleu$), 255))       
    DrawingMode(#PB_2DDrawing_Default )
    C_aleatoire$ = "Origine RGBA : ( " + Rouge$ + ", " + Vert$ + ", " + Bleu$ + ", " + 255 + " )"
    DrawText(1, 20, "Origine RGB ( " + Rouge$ + ", " + Vert$ + ", " + Bleu$ + ", " + "Alpha = 255" , #Black, RGBA(Val(Rouge$), Val(Vert$), Val(Bleu$), 255))
    StopDrawing()
  EndIf                                                                           
 
 
  ; resultat box du milieu la couleur alpha est la identique mais pas les en valeurs
  If StartDrawing(CanvasOutput(2))
    DrawAlphaImage(ImageID(2), 0, 0)                                                  ; Image 32bit
    DrawingMode(#PB_2DDrawing_Transparent)
    Box(0, 0, 400, 150, Couleur)                     ;Affiche la Box du mileu avec la couleur de la box d'en haut
    DrawingMode(#PB_2DDrawing_Default )
    DrawText(1, 20, " Couleur identique à la box 1 depuis point() avec alpha bon", #Black, Couleur)
    DrawText(1, 40, " La fonction Box(x,y,xx,yy, point()) a recu l'Alpha comment ?", #Black, Couleur)
    DrawText(1, 60, " Pas compris la formule de retour des valeurs depuis Point()", #Black, Couleur)
    DrawText(1, 80, " La conversion des valeurs Point() en RGBA donne", #Black, Couleur)
    DrawText(1, 100, " ces valeurs de Couleurs de Point() ( " + Red$ + ", " + Green$ + ", " + Blue$ + ", " + Alpha$ +" )" , #Black, Couleur)
    DrawText(1, 120, " Red() Green() Blue() Alpha(), ne fonctionne pas ??", #Black, Couleur)
    StopDrawing()
  EndIf
 
  Debug "----------------------------------------"
  Debug "Origine RGBA : ( " + Rouge$ + ", " + Vert$ + ", " + Bleu$ + ", " + Lux$ +" )"
  Debug C_Point$
  Debug "========================="
  SetWindowTitle(0, "click Points Box 1 Couieur  " + "( " + Red$ + ", " + Green$ + ", " + Blue$ + ", " + Alpha$ +" )??")
 
EndProcedure



If OpenWindow(0, 0, 0, 400, 490, "Points click Fenêtre", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(1, 0, 0, 400, 150 , #PB_Canvas_ClipMouse)
  CanvasGadget(2, 0, 170, 400, 150 , #PB_Canvas_ClipMouse)
  CanvasGadget(3, 0, 340, 400, 150 , #PB_Canvas_ClipMouse)
 
  CreateImage(1, 400, 150, 32, #White)
  CreateImage(2, 400, 150, 32, #White)
  CreateImage(3, 400, 150, 32, #White)
  Repeat
    event = WaitWindowEvent()
    x = WindowMouseX(0)
    y = WindowMouseY(0)
    Select Event
      Case #PB_Event_CloseWindow
        End     
      Case #PB_Event_Gadget   
        Select EventType()
          Case #PB_EventType_LeftClick
            Rouge$ = Right("00" + Str(Random(255)), 3)
            Vert$  = Right("00" + Str(Random(255)), 3)
            Bleu$  = Right("00" + Str(Random(255)), 3)
            Lux$   = Right("00" + Str(Random(255)), 3)
            ; Affiche_image(x, y, "001", "001", "001", "255") ; Point() affichera une valeur noire négative de -16711423
            Affiche_image(x, y, Rouge$, Vert$, Bleu$, Lux$)
        EndSelect
    EndSelect
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf
EDIT :

Ou alors, c'est ça que tu veux ?
récupérer la valeur de la couleur de la box du haut (la 1ère) et la mettre en bas (la troisième), mais avec un alpha à 255 ?

Code : Tout sélectionner

Procedure updateCanvas()
  If StartDrawing(CanvasOutput(0))
    DrawingMode(#PB_2DDrawing_AllChannels)
    DrawAlphaImage(ImageID(0), 0,0)
    StopDrawing()
  EndIf
EndProcedure

Procedure Affiche_image(x, y,Rouge$, Vert$, Bleu$, Lux$ )
  
  Protected *couleur
  
  If StartDrawing(ImageOutput(0))
    DrawingMode(#PB_2DDrawing_AllChannels) ; important : utiliser un drawingmode avec tous le channels pour pouvoir récupérer les couleurs et l'alpha
    ; Affiche box d'en haut de la fenetre avec Alpha
    Box(0, 0, 400, 150, RGBA(Val(Rouge$), Val(Vert$), Val(Bleu$), Val(Lux$))) ; Box supérieure couleur aléatoire
                                                                              ; affiche box d'en bas de la fenetre avec Alpha à 255
    Box(0, 340, 400, 150, RGBA(Val(Rouge$), Val(Vert$), Val(Bleu$), 255))     ; Box supérieure couleur aléatoire
                                                                              ; Affiche dans debug la valeur globale de la couleur
    couleur.q = Point(50, 50) ; couleur doit être un .q (je ne sais plus pourquoi ^^)
    alpha = Alpha(couleur)
    
    Debug "Point() : " + couleur
    Debug "couleur originale : "+Rouge$+", "+Vert$+", "+Bleu$+", "+Lux$
    Debug "couleur point() : "+Str(Red(couleur))+", "+Str(Green(couleur))+", "+Str(Blue(couleur))+", "+Str(Alpha(couleur))    
    
    ; Récupère la couleur supérieure
    ; Affiche box du milieu de la fenetre avec Alpha depuis la valeur capturée par point()
    Box(0, 170, 400, 150, RGBA(Red(couleur), Green(couleur), Blue(couleur), Alpha(couleur))) ;Affiche la Box du milieu avec la couleur de la box d'en haut
                                                                                             ; Debug "ARGB : $" + RSet(Right(Hex(@couleur), SizeOf(integer)*2), 8, "0")
    StopDrawing()
    
  EndIf
  
  ; on update le canvas pour afficher les 3 box.
  updateCanvas()
  
  
  ; Couleurs de retour avec la valeur de Point(x, y) avec les fonctions couleurs red() Green() Blue() Alpha()
  Red$ = Right("00" + Str(Red(Couleur)),3)
  Green$ = Right("00" + Str(Green(Couleur)),3)
  Blue$ = Right("00" + Str(Blue(Couleur)),3)
  Alpha$ = Right("00" + Str(Alpha(couleur)),3)
  ;  semble ok car on récupère les couleurs RGBA envoyée au départ ;)
  Debug "----------------------------------------"
  Debug "Origine RGBA : ( " + Rouge$ + ", " + Vert$ + ", " + Bleu$ + ", " + Lux$ +" )"
  capture$ = "Retour Point() : ( " + Red$ + ", " + Green$ + ", " + Blue$ + ", " + Alpha$ +" )"
  Debug capture$
  Debug "========================="
  ;   SetWindowTitle(0, "Points click Fenêtre Couieur " + "( " + Red$ + ", " + Green$ + ", " + Blue$ + ", " + Alpha$ +" )")
  ;   
EndProcedure

If OpenWindow(0, 0, 0, 400, 490, "Points click Fenêtre", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  CreateImage(0, 400, 490, 32, #PB_Image_Transparent)
  CanvasGadget(0, 0, 0, 400, 490)
  updatecanvas()
  
  Repeat
    event = WaitWindowEvent()
    x = WindowMouseX(0)
    y = WindowMouseY(0)
    
    Select Event
      Case #PB_Event_Gadget
        Select EventType()
          Case #PB_EventType_LeftClick
            Rouge$ = Right("00" + Str(Random(255)), 3)
            Vert$ = Right("00" + Str(Random(255)), 3)
            Bleu$ = Right("00" + Str(Random(255)), 3)
            Lux$ = Right("00" + Str(Random(255)), 3)
            ;Affiche_image(x, y, "001", "001", "001", "255") ; Point() affichera une valeur noire négative de -16711423
            Affiche_image(x, y, Rouge$, Vert$, Bleu$, Lux$)
        EndSelect
    EndSelect
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

Avec ce code, il me semble que les couleurs sont correctes ;)
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Fonction Point(x,y) et Alpha

Message par kernadec »

bjr Blendman
Ce que je souhaite obtenir avec point() c'est les valeurs de couleurs sur un objet RGBA de canvas
Pas mal ton dernier code :mrgreen:
Tu as raison, et Merci pour ton temps passé sur mon délire :mrgreen:
mais il avait une raison à tout cela, je ne suis pas si fou que ça :mrgreen:

Image et Canvas sont des surfaces de dessin comme c'est dit dans la doc point()
alors tout objet mis sur ces surface avec un DrawingMode approprié peut utilisé l 'alpha
Box Circle Line etc. avec la transparence couleur RGBA qui sera visible. alors il me paraitrait
normal de pouvoir récupérer sa couleur RGBA avec point() sur ces objets..

j'ai compris ce matin au réveil se qui se passe!
voilà la solution de mon problème, je sais pas si c'est écrit dans un coin de la doc :?:
donc, ce que fait PureBasic en ce moment avec ces surfaces:

Avec une surface Image la couleur de Point() retournée en RGBA
Avec une surface Canvas la couleur est retournée en RGB le plus proche
sans canal alpha, on peut le vérifié avec copie écran et un logiciel de dessin avec ce code
En clair, point() avec Canvas retourne un RGB approximatif au RGBA de l' objet dessiné...

Maintenant, je pense que Fred devrait nous arranger cela :mrgreen:

Cordialement
Ps: quand je dit résolu c'est pas cool car on passe quand même d'une couleur
qui avait de la transparence en une couleur qui n'en a plus :? :?

Code : Tout sélectionner

RGBACouleur = RGBA(255, 125, 0, 128)

If OpenWindow(0, 0, 0, 210, 200, "Point Image", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateImage(0, 210, 200, 32, #PB_Image_Transparent)
    StartDrawing(ImageOutput(0))
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0, 0, 100, 200, RGBACouleur)
    color =  Point(50, 50)
    Box(110, 0, 100, 200, color)
    StopDrawing() 
    ImageGadget(0, 0, 0, 200, 200, ImageID(0))
  EndIf
  Debug " Pour une surface dessin Image 32 la Valeur Point() est en RGBA" 
  Debug  color 
  Debug "Point(" + Str(Red(color))+ ", " +Str(Green(color))+ ", " +Str(Blue(color))+ ", " +Str(Alpha(color))
EndIf 

If OpenWindow(1, WindowX(0) + WindowWidth(0) + 20  , WindowY(0), 210, 200, "Point Canvas alpha=0", #PB_Window_SystemMenu)
  If CanvasGadget(1, 0, 0, 210, 200 , #PB_Canvas_ClipMouse)
    StartDrawing(CanvasOutput(1))
    DrawingMode(#PB_2DDrawing_AlphaClip)
    Box(0, 0, 100, 200, RGBACouleur)
    DrawingMode(#PB_2DDrawing_AllChannels)
    color =  Point(50, 50)
    Box(110, 0, 100, 200, color)
    StopDrawing() 
    
  EndIf
  Debug "Résolu"
  Debug " Pour une surface dessin CanvasGadget la Valeur Alpha Point()" 
  Debug " est convertie en la couleur RGB sans Alpha la plus proche"
  Debug  color 
  Debug "Point(" + Str(Red(color))+ ", " +Str(Green(color))+ ", " +Str(Blue(color))+ ", " +Str(Alpha(color))
  
  Repeat
    Event = WaitWindowEvent()
    
  Until Event = #PB_Event_CloseWindow
EndIf
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: (Résolu) Fonction Point(x,y) et Alpha

Message par blendman »

Re coucou

alors, en fait, quand on affiche les images, box, circle etc.. le drawingmode est important. Si on met le bon drawing mode dans ton code, on obtient bien les bonne couleur, mais on n'a pas l'alpha ;).
car le canvas ne le gère pas.
On peut afficher dessus des images avec canala alpha, mais on ne peut pas récupérer la valeur de l'alpha d'une couleur sur le canvas.


Si dans ton code tu changes le drawingmode du canvas 1, tu obtiens la bonne couleur, mais sans le canal alpha (donc un RGB(), mais avec les bonnes couleurs) :

Code : Tout sélectionner

StartDrawing(CanvasOutput(1))
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0, 0, 100, 200, RGBACouleur)
    color =  Point(50, 50)
    Box(110, 0, 100, 200, color)
    StopDrawing()
ON sait que le canvas ne retourne pas la couleur avec alpha, si on veut la même couleur que celle d'origine (donc avec l'alpha), on doit la mettre nous-même du coup.

Code : Tout sélectionner

RGBACouleur = RGBA(255, 125, 0, 128)

If OpenWindow(0, 0, 0, 210, 200, "Point Image", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateImage(0, 210, 200, 32, #PB_Image_Transparent)
    StartDrawing(ImageOutput(0))
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0, 0, 100, 200, RGBACouleur)
    color =  Point(50, 50)
    Box(110, 0, 100, 200, color)
    StopDrawing()
    ImageGadget(0, 0, 0, 200, 200, ImageID(0))
  EndIf
  Debug " Pour une surface dessin Image 32 la Valeur Point() est en RGBA"
  Debug  color
  Debug "Point(" + Str(Red(color))+ ", " +Str(Green(color))+ ", " +Str(Blue(color))+ ", " +Str(Alpha(color))
EndIf

If OpenWindow(1, WindowX(0) + WindowWidth(0) + 20  , WindowY(0), 210, 200, "Point Canvas alpha=0", #PB_Window_SystemMenu)
  If CanvasGadget(1, 0, 0, 210, 200 , #PB_Canvas_ClipMouse)
    StartDrawing(CanvasOutput(1))
    DrawingMode(#PB_2DDrawing_AllChannels)
    Box(0, 0, 100, 200, RGBACouleur)
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    color =  Point(50, 50)
    Box(110, 0, 100, 200, RGBA(Red(color), Green(color), Blue(color), 128))
    StopDrawing()
   
  EndIf
  Debug "Résolu"
  Debug " Pour une surface dessin CanvasGadget la Valeur Alpha Point()"
  Debug " est convertie en la couleur RGB sans Alpha la plus proche"
  Debug  color
  Debug "Point(" + Str(Red(color))+ ", " +Str(Green(color))+ ", " +Str(Blue(color))+ ", " +Str(Alpha(color))
 
  Repeat
    Event = WaitWindowEvent()
   
  Until Event = #PB_Event_CloseWindow
EndIf
Avec un canvas, alpha() sera toujours = 0 (ou plutôt #null je pense) car le canvas ne gère pas l'alpha.

C'est pour ça qu'il faut utiliser une image ou un sprite pour connaître la couleur réelle ave cpoint() et l'alpha de cette couleur ;)
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: (Résolu) Fonction Point(x,y) et Alpha

Message par kernadec »

Oui c est ça 8O :mrgreen:
à moins de trouver un code de conversion d'un image RGB
en son équivalent couleur transparente RGBA pour résoudre ce problème
le contraire de notre Canvas point() :D

je te rappelle que Canvas et une surface de dessin que les objets mis dessus peuvent
être transparent en utilisant le bon DrawingMode et une couleur RGBA de ce fait Point()
devrait fonctionner avec Alpha sur les objet affichés avec une couleur transparente..
je crois que pour Canvas et la fonction point()... Fred à botté en touche... :mrgreen:
et nous à mis un solution du moins pire :mrgreen:
La couleur sur 32bits et convertie en la même couleurs sur 24bits

Cordialement
voici un exemple qui reproduit cela.. :idea:


Code : Tout sélectionner

RGBACouleur = RGBA(200, 125, 0, 100)

If OpenWindow(0, 0, 0, 210, 200, "Point Image", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateImage(0, 210, 200, 32, #PB_Image_Transparent)
   
    StartDrawing(ImageOutput(0))
    DrawingMode(#PB_2DDrawing_AlphaBlend) 
    Circle(105,140,50,RGBA(0,255,0,255))   ;cercle vert
    Box(0, 0, 100, 200, RGBACouleur)
    color =  Point(50, 50)
    Box(110, 0, 100, 200, color)
    
    StopDrawing() 
    ImageGadget(0, 0, 0, 200, 200, ImageID(0))
  EndIf
  Debug " Pour une surface dessin Image 32 la Valeur Point() est en RGBA" 
  Debug  color 
  Debug "Point(" + Str(Red(color))+ ", " +Str(Green(color))+ ", " +Str(Blue(color))+ ", " +Str(Alpha(color))
EndIf 

If OpenWindow(1, WindowX(0) + WindowWidth(0) + 20  , WindowY(0), 210, 200, "Point Canvas alpha=0", #PB_Window_SystemMenu)
  If CanvasGadget(1, 0, 0, 210, 200 , #PB_Canvas_ClipMouse)
    StartDrawing(CanvasOutput(1))
     DrawingMode(#PB_2DDrawing_AlphaBlend) 
    Circle(105,140,50,RGBA(0,255,0,255))   ;cercle vert
    DrawingMode(#PB_2DDrawing_AlphaClip)
    Box(0, 0, 100, 200, RGBACouleur)
    DrawingMode(#PB_2DDrawing_AllChannels) 
    color =  Point(50, 50)
    Box(110, 0, 100, 200, color)
    StopDrawing() 
    
  EndIf
  Debug "Résolu"
  Debug " Pour une surface dessin CanvasGadget la Valeur Alpha Point()" 
  Debug " est convertie en la couleur RGB sans Alpha la plus proche"
  Debug  color 
  Debug "Point(" + Str(Red(color))+ ", " +Str(Green(color))+ ", " +Str(Blue(color))+ ", " +Str(Alpha(color))
  
  Repeat
    Event = WaitWindowEvent()
    
  Until Event = #PB_Event_CloseWindow
EndIf
Répondre