Rendre transparent une couleur dans une imagegadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Rendre transparent une couleur dans une imagegadget

Message par Kwai chang caine »

Bonjour à tous et toutes :D

J'ai une fleche bleue sur fond blanc que je charge dans un imagegadget
Est il possible de dire a PB que tout ce qui est blanc dans cette image doit etre transparent, ou faut il utiliser des images transparentes comme les PNG ???? :roll:

Merci et bonne journée
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Rendre transparent une couleur dans une imagegadget

Message par Guimauve »

Kwai chang caine a écrit :Bonjour à tous et toutes :D

J'ai une fleche bleue sur fond blanc que je charge dans un imagegadget
Est il possible de dire a PB que tout ce qui est blanc dans cette image doit etre transparent, ou faut il utiliser des images transparentes comme les PNG ???? :roll:

Merci et bonne journée
Va voir ici :

http://www.purearea.net/pb/CodeArchiv/G ... ntImage.pb

A+
Guimauve
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Rendre transparent une couleur dans une imagegadget

Message par Le Soldat Inconnu »

Ben en éditant ton image pour rendre le bleu transparent ?
Il suffit de jouer sur la couche alpha (à condition d'avoir une image 32, si c'est une 24bits, tu la dessines dans une 32 bits)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Rendre transparent une couleur dans une imagegadget

Message par Kwai chang caine »

@Guimauve
Au premier regard ça a l'air d'etre ce que je recherche 8)

@Soldat
Super donc c'est possible en passant par un JPG :wink:

Merci les copains, je vais regarder ça
Bonne journée a vous deux
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Rendre transparent une couleur dans une imagegadget

Message par Le Soldat Inconnu »

Par un JPG, oula, la ça va être plus dur. Car le JPG compresse avec perte l'image donc ton bleu n'est pas totalement uniforme.
Il faut faire un traitement par reconnaissance de teinte de couleur.
J'ai déjà fais ça pour sortir la couleur peau de photo.

Tu veux pas mettre ton image par ici ?
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Rendre transparent une couleur dans une imagegadget

Message par Kwai chang caine »

Si si..c'est toujours la meme :lol:
C'est pas le celebre fleche bleue...

Image

C'est une a moi :D

Image

Je ne savais pas que c'etait compliqué de rendre une couleur transparente en JPG :oops:
Comme j'y connais rien en graphisme...je voulais savoir si c'etait possible, mais apparement le JPG est pas fait pour ça
Te casse pas trop la tete.....si c'est compliqué, je les referais en PNG :roll:
En fait je voudrais que le blanc disparaisse, si c'est pas trop dur :roll:

EDIT (Piaf :oops:)

Je viens de tester le code de DANILO que m'a indiqué GUIMAUVE, y va drolement bien 8)
Maintenant reste a savoir si ça va marcher avec ma super fleche que m'avait construit KERNADEC
http://www.purebasic.fr/french/viewtopi ... 29#p108129

Image

Code : Tout sélectionner

; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=718&highlight=
; Author: Danilo (updated for PB4.00 by blbltheworm)
; Date: 22. April 2003
; OS: Windows
; Demo: No


Declare LoadTransparentImage(Number,FileName$,TransColor,NewColor) 

;Lädt ein Bild mit einer transparenten Hintergrundfarbe, 
;so dass man es quasi transparent in einem ImageGadget() 
;darstellen kann. 

;Erklärung/Anwendung: 
;--------------------
; Anwendung 1: 
  ; lade Bild 1 aus der Datei "name.bmp", 
  ; nimm die Farbe des ersten Pixels des 
  ; Bildes (links,oben) als Transparenz-Farbe 
  ; und ersetze diese mit der Farbe die PB 
  ; auch für Gadgets als Hintergrund nimmt: 

;image1 = LoadTransparentImage(1,"name.bmp",-1,-1) 


; Anwendung 2: 
  ; lade Bild 2 aus der Datei "name.bmp", 
  ; nimm die Farbe des ersten Pixels des 
  ; Bildes (links,oben) als Transparenz-Farbe 
  ; und ersetze diese mit der Farbe die mit 
  ; RGB(rot,grün,blau) bestimmt wurde (gelb): 

;image2 = LoadTransparentImage(2,"name.bmp",-1,RGB($FF,$FF,$00)) 


; Anwendung 3: 
  ; lade Bild 3 aus der Datei "name.bmp", 
  ; nimm die Farbe RGB($00,$FF,$00), also grün 
  ; als Transparenz-Farbe  und ersetze diese 
  ; mit der Farbe die PB auch für Gadgets als 
  ; Hintergrund nimmt: 

;image3 = LoadTransparentImage(3,"name.bmp",RGB($00,$FF,$00),-1) 


; Anwendung 4: 
  ; lade Bild 4 aus der Datei "name.bmp", 
  ; nimm die Farbe RGB($00,$00,$FF), also blau 
  ; als Transparenz-Farbe  und ersetze diese 
  ; mit der Farbe RGB($00,$00,$00), also schwarz: 

;image4 = LoadTransparentImage(4,"name.bmp",RGB($00,$00,$FF),RGB($00,$00,$00)) 



; LoadTransparentImage(Nummer,DateiName$,TransparenzFarbe,NeueFarbe)
; ------------------------------------------------------------------
; by Danilo, 22.04.2003 - german forum 
; 
Procedure LoadTransparentImage(Number,FileName$,TransColor,NewColor) 
  ;> 
  ;> Number     = ImageNumber 
  ;> FileName$  = File Name 
  ;> TransColor = RGB: Transparent Color,        -1 = First Color in Picture 
  ;> NewColor   = RGB: New Color for TransColor, -1 = System Window Background 
  ;> 
  Structure _LTI_BITMAPINFO 
    bmiHeader.BITMAPINFOHEADER 
    bmiColors.RGBQUAD[1] 
  EndStructure 

  Structure _LTI_LONG 
   l.l 
  EndStructure 

  hBmp = LoadImage(Number,FileName$) 
  If hBmp 
    hDC  = StartDrawing(ImageOutput(Number)) 
    If hDC 
      ImageWidth  = ImageWidth(Number) : ImageHeight = ImageHeight(Number) 
      mem = GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,ImageWidth*ImageHeight*4) 
      If mem 
        bmi._LTI_BITMAPINFO 
        bmi\bmiHeader\biSize   = SizeOf(BITMAPINFOHEADER) 
        bmi\bmiHeader\biWidth  = ImageWidth 
        bmi\bmiHeader\biHeight = ImageHeight 
        bmi\bmiHeader\biPlanes = 1 
        bmi\bmiHeader\biBitCount = 32 
        bmi\bmiHeader\biCompression = #BI_RGB 
        If GetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0 
          If TransColor = -1 
            *pixels._LTI_LONG = mem+((ImageHeight-1)*ImageWidth*4) 
            TransColor = *pixels\l 
          Else 
            TransColor = RGB(Blue(TransColor),Green(TransColor),Red(TransColor)) 
          EndIf 

          If NewColor = -1 
            NewColor = GetSysColor_(#COLOR_BTNFACE) ; #COLOR_WINDOW 
          EndIf 
          NewColor = RGB(Blue(NewColor),Green(NewColor),Red(NewColor)) 

          *pixels._LTI_LONG = mem 
          For a = 1 To ImageWidth*ImageHeight 
            If *pixels\l = TransColor 
              *pixels\l = NewColor 
            EndIf 
            *pixels + 4 
          Next a 

          If SetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0 
            Result = hBmp 
          EndIf 
        EndIf 
        GlobalFree_(mem) 
      EndIf 
    EndIf 
    StopDrawing() 
  EndIf 
  ProcedureReturn Result 
EndProcedure

UsePNGImageDecoder()
image1 = LoadTransparentImage(1,"FlecheB.png",-1,-1)

If image1

 OpenWindow(0,0,0,ImageWidth(1),ImageHeight(1),"Image",#PB_Window_ScreenCentered|#PB_Window_SystemMenu) 
 ImageGadget(0,0,0,ImageWidth(1),ImageHeight(1),image1)
 
 Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
 
Else

 MessageRequester("ERROR","Cant load image!",#MB_ICONERROR)
 
EndIf 
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Rendre transparent une couleur dans une imagegadget

Message par Progi1984 »

Le JPEG en gère pas la transparence.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Rendre transparent une couleur dans une imagegadget

Message par Kwai chang caine »

Bonjour PROGI 8)
Oui oui, je le sais que le JPG ne gere pas la transparence
Je voulais juste savoir si il etait plus simple de faire des PNG ou bien de dire a PB que tout ce qui est blanc dans cette image doit devenir transparent

Bon j'ai essayé de mixer les deux programmes.
Et comme on change pas une equipe qui perd...et ben ça marche pas :(

Le code de DANILO, il est fait pour charger une image, alors que celui de KERNADEC, il a créé et en plus il en créé meme deux 8O
J'ai utilisé la 1 ou la 0, mais c'est soit noir soit blanc pas transparent

D'ailleur, je sais meme pas si ce que je veux faire on peut le faire ??? :oops:
C'est à dire remplacer le blanc de cette fleche reglable par du transparent ... :roll:

Pour la faire marcher ce code et voir apparaitre la fleche, faut cliquer au milieu de la fenetre et bouger la souris

Code : Tout sélectionner

Enumeration
#Fenetre
#Image_0
#Image_1
#ImageGadget
EndEnumeration
Global dc.l,epais.l,Hauteur.l,Largeur .l,Pos.l
Hauteur = 300
Largeur = 400
Global DepartX
Global DepartY
Global Passage
epais=12
Pos=34

Procedure LoadTransparentImage(Number, TransColor,NewColor) 
  ;> 
  ;> Number     = ImageNumber 
  ;> FileName$  = File Name 
  ;> TransColor = RGB: Transparent Color,        -1 = First Color in Picture 
  ;> NewColor   = RGB: New Color for TransColor, -1 = System Window Background 
  ;> 
  Structure _LTI_BITMAPINFO 
    bmiHeader.BITMAPINFOHEADER 
    bmiColors.RGBQUAD[1] 
  EndStructure 

  Structure _LTI_LONG 
   l.l 
  EndStructure 
      
  hDC  = StartDrawing(ImageOutput(Number))
  Box(0, 0, Largeur, Largeur, RGB(255, 255, 255))
  
  If hDC 
    ImageWidth  = ImageWidth(Number) : ImageHeight = ImageHeight(Number) 
    mem = GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,ImageWidth*ImageHeight*4) 
    If mem 
      bmi._LTI_BITMAPINFO 
      bmi\bmiHeader\biSize   = SizeOf(BITMAPINFOHEADER) 
      bmi\bmiHeader\biWidth  = ImageWidth 
      bmi\bmiHeader\biHeight = ImageHeight 
      bmi\bmiHeader\biPlanes = 1 
      bmi\bmiHeader\biBitCount = 32 
      bmi\bmiHeader\biCompression = #BI_RGB 
      If GetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0 
        If TransColor = -1 
          *pixels._LTI_LONG = mem+((ImageHeight-1)*ImageWidth*4) 
          TransColor = *pixels\l 
        Else 
          TransColor = RGB(Blue(TransColor),Green(TransColor),Red(TransColor)) 
        EndIf 

        If NewColor = -1 
          NewColor = GetSysColor_(#COLOR_BTNFACE) ; #COLOR_WINDOW 
        EndIf 
        NewColor = RGB(Blue(NewColor),Green(NewColor),Red(NewColor)) 

        *pixels._LTI_LONG = mem 
        For a = 1 To ImageWidth*ImageHeight 
          If *pixels\l = TransColor 
            *pixels\l = NewColor 
          EndIf 
          *pixels + 4 
        Next a 

        If SetDIBits_(hDC,hBmp,0,ImageHeight(Number),mem,bmi,#DIB_RGB_COLORS) <> 0 
          Result = hBmp 
        EndIf 
      EndIf 
      GlobalFree_(mem) 
    EndIf 
  EndIf
  
  StopDrawing() 

  ProcedureReturn Result 
EndProcedure

Procedure Ligne(x,y,x1,y1,Width,color) 
pen=CreatePen_(#PS_SOLID,Width,color) 
penOld=SelectObject_(DC,pen) 
MoveToEx_(DC,x,y,0):LineTo_(DC,x1,y1) 
DeleteObject_(pen) 
DeleteObject_(penOld) 
EndProcedure 

Procedure DessineFleche(x, y)

Static MemX, MemY

If MemX = x And MemY = Y
   ProcedureReturn
Else
   MemX = X
   MemY = y 
EndIf

If Not Passage And x <> 0 And y <> 0
   Passage = #True
   DepartX = X
   DepartY = Y
EndIf 

dc=StartDrawing(ImageOutput(#Image_1))
  
   DrawImage(ImageID(#Image_0), 0, 0)
      
If x => DepartX And y <= DepartY ; Haut droit
      
   x1 = Abs(Largeur + x - (Largeur * 2))
   y1 = Hauteur - y
   
   If x1 <= 1 : x1 = 1 : EndIf
   If y1 <= 1 : y1 = 1 : EndIf

   Ligne(0, GadgetHeight(#ImageGadget)- Pos, GadgetWidth(#ImageGadget) - Pos,GadgetHeight(#ImageGadget) - Pos, epais,RGB(226, 23, 29)) ; Horizontale
   Ligne(GadgetWidth(#ImageGadget) - Pos, Pos, GadgetWidth(#ImageGadget) - Pos, GadgetHeight(#ImageGadget) - Pos, epais,RGB(226, 23, 29)) ; Verticale
   Ligne(GadgetWidth(#ImageGadget) - Pos, Pos-epais, GadgetWidth(#ImageGadget) - Pos/2*3-epais, Pos*2, epais,RGB(226, 23, 29))
   Ligne(GadgetWidth(#ImageGadget) - Pos, Pos-epais, GadgetWidth(#ImageGadget) - Pos/2+epais, Pos*2, epais,RGB(226, 23, 29))
   StopDrawing()

   ResizeGadget(#ImageGadget,  Largeur, Hauteur - y1, x1, Hauteur + y)
      
ElseIf x => DepartX And y => DepartY ; Bas droit
   
   x1 = Abs(Largeur + x - (Largeur * 2))
   y1 = y - Hauteur
   
   If x1 <= 1 : x1 = 1 : EndIf
   If y1 <= 1 : y1 = 1 : EndIf
   
   Ligne(0, Pos, GadgetWidth(#ImageGadget) - Pos, Pos, epais,RGB(226, 23, 29)) ; Horizontale
   Ligne(GadgetWidth(#ImageGadget) - Pos, Pos, GadgetWidth(#ImageGadget) - Pos, GadgetHeight(#ImageGadget) - Pos, epais,RGB(226, 23, 29)) ; Verticale
   Ligne(GadgetWidth(#ImageGadget) - Pos, GadgetHeight(#ImageGadget) - Pos+epais, GadgetWidth(#ImageGadget) - Pos/2*3-epais, GadgetHeight(#ImageGadget) - Pos*2, epais,RGB(226, 23, 29))
   Ligne(GadgetWidth(#ImageGadget) - Pos, GadgetHeight(#ImageGadget) - Pos+epais, GadgetWidth(#ImageGadget) - Pos/2+epais, GadgetHeight(#ImageGadget) - Pos*2, epais,RGB(226, 23, 29))
   StopDrawing()
   
   ResizeGadget(#ImageGadget, Largeur, Hauteur, x1, Hauteur + y1)
   
ElseIf x <= DepartX And y => DepartY ; Bas gauche
   
   x1 = Abs(1 - x + largeur)
   y1 = Abs(Hauteur - y)
   
   If x1 <= 1 : x1 = 1 : EndIf
   If y1 <= 1 : y1 = 1 : EndIf
   
   Ligne(Pos, Pos, GadgetWidth(#ImageGadget), Pos, epais,RGB(226, 23, 29)) ; Horizontale
   Ligne(GadgetWidth(#ImageGadget) - x1 + Pos, Pos, GadgetWidth(#ImageGadget)-x1 + Pos, GadgetHeight(#ImageGadget)- Pos, epais,RGB(226, 23, 29)) ; Verticale
   Ligne(GadgetWidth(#ImageGadget) - x1 + Pos, GadgetHeight(#ImageGadget) - Pos+epais, GadgetWidth(#ImageGadget) - x1 + Pos/2*3+epais, GadgetHeight(#ImageGadget) - Pos*2, epais,RGB(226, 23, 29))
   Ligne(GadgetWidth(#ImageGadget) - x1 + Pos, GadgetHeight(#ImageGadget) - Pos+epais, GadgetWidth(#ImageGadget) - x1 + Pos/2-epais, GadgetHeight(#ImageGadget) - Pos*2, epais,RGB(226, 23, 29))
   StopDrawing()
   
   ResizeGadget(#ImageGadget, x ,Hauteur, x1, Hauteur + y)
      
ElseIf x <= DepartX And y <= DepartY  ; Haut gauche
   
   x1 = Abs(1 - x + Largeur)
   y1 = Abs(1 - y + Hauteur)
   
   If x1 <= 1 : x1 = 1 : EndIf
   If y1 <= 1 : y1 = 1 : EndIf

   Ligne(Pos, GadgetHeight(#ImageGadget) - Pos, GadgetWidth(#ImageGadget),GadgetHeight(#ImageGadget) - Pos, epais,RGB(226, 23, 29)) ; Horizontale
   Ligne(GadgetWidth(#ImageGadget) - x1 + Pos, Pos, GadgetWidth(#ImageGadget) - x1 + Pos, GadgetHeight(#ImageGadget) - Pos, epais,RGB(226, 23, 29)) ; Verticale
   Ligne(GadgetWidth(#ImageGadget) - x1 + Pos, Pos-epais, GadgetWidth(#ImageGadget) - x1 + Pos/2*3+epais, Pos*2, epais,RGB(226, 23, 29))
   Ligne(GadgetWidth(#ImageGadget) - x1 + Pos, Pos-epais, GadgetWidth(#ImageGadget) - x1 + Pos/2-epais, Pos*2, epais,RGB(226, 23, 29))
   StopDrawing()

   ResizeGadget(#ImageGadget, x, y, x1, y1)
   
EndIf

ResizeImage(#Image_1, x1, y1)
SetGadgetState(#ImageGadget,ImageID(#Image_1))

EndProcedure

CreateImage(#Image_0, Largeur, Hauteur) 
CreateImage(#Image_1, Largeur, Hauteur)
image1 = LoadTransparentImage(#Image_0, RGB(255, 255, 255), -1)

OpenWindow(#Fenetre, 0, 0, 800, 600, "Fleche multidirectionnelle",  #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar)
hBmp = ImageGadget(#ImageGadget,0, 0, 0, 0, image1)

DessineFleche(Largeur - 1, Hauteur - 1)
               
Repeat  

Evenement = WaitWindowEvent()
MouseX = WindowMouseX(#Fenetre)
MouseY = WindowMouseY(#Fenetre)

Select Evenement
      
 Case #WM_MOUSEMOVE
 
  If GetAsyncKeyState_(#VK_LBUTTON)
   DessineFleche(MouseX , MouseY)
  EndIf         

EndSelect
      
Until Evenement = #PB_Event_CloseWindow
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Re: Rendre transparent une couleur dans une imagegadget

Message par cederavic »

Le JPG est un format destructeur comme l'a dit LSI, c'est à dire que ton "blanc" n'est plus "blanc", il y a des variations.. Zoom sur l'image avec l'aperçus windows, tu verra :wink:

Le mieux je pense est d'utiliser le PNG avec couche alpha, non seulement tu te ferais moins chier pour la transparence mais en plus tu peux faire des dégradé d'opacité (pour adoucir les bords par exemple)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Rendre transparent une couleur dans une imagegadget

Message par Kwai chang caine »

D'accord pas de probleme pour les petites fleches bleue, je vais me mettre au PNG 8)

Mais maintenant mon probleme, dans le code ci dessus, c'est que j'ai plus de format, puisque l'image est crée par le code...
Dans ce cas, peut ont faire comme si c'etait une PNG, et lui dire que le blanc devienne transparent ??? :roll:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Rendre transparent une couleur dans une imagegadget

Message par Le Soldat Inconnu »

Pas avec ce code la, je suis désolé, tu dois dessiner ta flèche uniquement avec des fonctions PB, les fonctions de l'API que tu utilises ne supportent pas la couche alpha.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Rendre transparent une couleur dans une imagegadget

Message par Backup »

Le Soldat Inconnu a écrit :Pas avec ce code la, je suis désolé, tu dois dessiner ta flèche uniquement avec des fonctions PB, les fonctions de l'API que tu utilises ne supportent pas la couche alpha.
je ne me suis pas trop interressé au transparence , mais suposons

qu'un pixel soit codé RVBT (T etant la transparence )

qu'est ce qui empeche de lire les 3 valeurs , et si R=255 V=255,B=255 ( blanc )
et appliquer un 4em octet T=255 .... pour la transparence

il suffirai alors de scanner pixel par pixel l'image, pour attribuer l'octet de transparence non ?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Rendre transparent une couleur dans une imagegadget

Message par Le Soldat Inconnu »

voilà un exemple, mais sans flèche, juste une ligne

Code : Tout sélectionner

Enumeration
	#Fenetre
	#Fleche
	#FlecheGadget
EndEnumeration

Procedure DessineFleche(x1, y1, x2, y2)
	
	; On organise les valeurs d'entrées
	If x1 > x2
		Depart_X = x2
		Fin_X = x1
	Else
		Depart_X = x1
		Fin_X = x2
	EndIf
	If y1 > y2
		Depart_Y = y2
		Fin_Y = y1
	Else
		Depart_Y = y1
		Fin_Y = y2
	EndIf
	Largeur = Fin_X - Depart_X + 1
	Hauteur = Fin_Y - Depart_Y + 1
	
	CreateImage(#Fleche, Largeur, Hauteur, 32)
	StartDrawing(ImageOutput(#Fleche))
		
		; Fond transparent
		DrawingMode(#PB_2DDrawing_AlphaChannel)
		Box(0, 0, Largeur, Hauteur, 0)
		
		; Dessin de la fleche
		DrawingMode(#PB_2DDrawing_AlphaBlend)
		
		LineXY(x1 - Depart_X, y1 - Depart_Y, x2 - Depart_X, y2 - Depart_Y, $FF000000)
		
		
		
	StopDrawing()
	SetGadgetState(#FlecheGadget, ImageID(#Fleche))
	ResizeGadget(#FlecheGadget, Depart_X, Depart_Y, Largeur, Hauteur)
	
EndProcedure

CreateImage(#Fleche, 10, 10, 32)

OpenWindow(#Fenetre, 0, 0, 800, 600, "Fleche multidirectionnelle",  #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_TitleBar)
ImageGadget(#FlecheGadget,0, 0, 0, 0, ImageID(#Fleche))

DessineFleche(50, 50, 200, 200)

Repeat 
	
	Evenement = WaitWindowEvent()
	
	Select Evenement
			
		Case #WM_MOUSEMOVE
			If GetAsyncKeyState_(#VK_LBUTTON)
				MouseX = WindowMouseX(#Fenetre)
				MouseY = WindowMouseY(#Fenetre)
				If Depart_X < 0
					Depart_X = MouseX
					Depart_Y = MouseY
				EndIf
				DessineFleche(Depart_X, Depart_Y, MouseX , MouseY)
			Else
				Depart_X = -1
			EndIf         
			
	EndSelect
	
Until Evenement = #PB_Event_CloseWindow

Dobro : Ta solution peut fonctionner mais elle est très lente
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Rendre transparent une couleur dans une imagegadget

Message par Kwai chang caine »

Le Soldat Inconnu a écrit :Pas avec ce code la, je suis désolé, tu dois dessiner ta flèche uniquement avec des fonctions PB, les fonctions de l'API que tu utilises ne supportent pas la couche alpha.
Je me disais aussi...que ce serais trop beau :(

Merci beaucoup pour ton code, crois tu que je pourrais faire exactement la meme jolie fleche avec ta methode ??? :roll:
Car vu le temps que j'ai déja passé pour faire celle la, et encore c'est KERNADEC qui en a fait les 3/4 :oops:
J'voudrais etre sur que c'est faisable avant de me lancer dans la galere :roll:

En tout cas merci encore de ton explication 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Rendre transparent une couleur dans une imagegadget

Message par Le Soldat Inconnu »

je te ferais ça mon grand, demain ou après demain :)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre